summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/metapost
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-09 00:45:48 +0000
committerKarl Berry <karl@freefriends.org>2006-01-09 00:45:48 +0000
commit5dc602d16c5be2fd035b254ca23484a90aebd6dc (patch)
tree72efb15fba318cc2096a8cc6999ed3fa0bff317d /Master/texmf-dist/doc/metapost
parentb4fc5f639874db951177ec539299d20908adb654 (diff)
doc 5
git-svn-id: svn://tug.org/texlive/trunk@81 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/metapost')
-rw-r--r--Master/texmf-dist/doc/metapost/base/Makefile125
-rw-r--r--Master/texmf-dist/doc/metapost/base/grdemo.pdfbin0 -> 8325 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/base/index.html62
-rw-r--r--Master/texmf-dist/doc/metapost/base/mpgraph.pdfbin0 -> 173873 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/base/mpintro.pdfbin0 -> 158501 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/base/mpman.pdfbin0 -> 466130 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/Makefile31
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/README32
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/agepop91.d85
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/agepopm.d85
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/countries.d60
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/ctabbing.sty17
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/demo.ms105
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/energy.d75
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/examples.mp247
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/figs.mp22
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/grdemo.ms124
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/lead.d24
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/manfig.mp859
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/matmul.d21
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/mpgraph.bib96
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/mpgraph.mp129
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/mpgraph.tex1109
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/mpintro.bib48
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/mpintro.tex878
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/mpman.bib80
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/mpman.ist4
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/mpman.tex5483
-rw-r--r--Master/texmf-dist/doc/metapost/base/source/timepop.d21
-rw-r--r--Master/texmf-dist/doc/metapost/exteps/LICENSE340
-rw-r--r--Master/texmf-dist/doc/metapost/exteps/README5
-rw-r--r--Master/texmf-dist/doc/metapost/exteps/exteps.pdfbin0 -> 116101 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/README.ctan29
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/README.featpost36
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/bashscript/dosome.sh95
-rwxr-xr-xMaster/texmf-dist/doc/metapost/featpost/bashscript/eps2j.sh1
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/bashscript/fpost1
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/bashscript/insertinputcommands.sed5
-rwxr-xr-xMaster/texmf-dist/doc/metapost/featpost/bashscript/insertinputcommands.sh6
-rwxr-xr-xMaster/texmf-dist/doc/metapost/featpost/bashscript/laproof13
-rwxr-xr-xMaster/texmf-dist/doc/metapost/featpost/bashscript/lbproof16
-rwxr-xr-xMaster/texmf-dist/doc/metapost/featpost/bashscript/lcproof13
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/bashscript/makelogo.sh9
-rwxr-xr-xMaster/texmf-dist/doc/metapost/featpost/bashscript/maketugboatart.sh8
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/bashscript/nontextualpng.sh10
-rwxr-xr-xMaster/texmf-dist/doc/metapost/featpost/bashscript/procedurenames.sh8
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/bashscript/remfi.sh32
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/bashscript/removeinputcommand.sh9
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/bashscript/replacetext.sh7
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/bashscript/simpleviewer.sh15
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/doc/doclicense.txt10
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/doc/featexamples.html163
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/doc/featpost.1.gzbin0 -> 1980 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/doc/featpost.sgml1623
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/doc/tug2004.pdfbin0 -> 413671 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/bugtrack/bughunt.mp57
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/bugtrack/gstr.mp9
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/highmemory/hiddenlinegraph.mp72
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/highmemory/mainmemtest.mp54
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/highmemory/par3Dplotexamples.mp149
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/borderframetest.mp28
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/conegetready.mp36
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/doitnow.mp33
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/electricpotential.mp151
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/emptylines.mp28
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/experimental.mp177
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/fieldlines.mp59
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/fis3prey.mp128
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/frustum.mp46
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/geom_casq.mp84
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/geom_freder.mp94
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/graphexample.mp16
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/lcurvature.mp114
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/mptoolcone.mp49
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/nembends.mp48
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/nemdirector.mp82
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/nemquira.mp60
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/nemquirapitch.mp69
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/nemuniax.mp61
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/pathernon.mp65
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/planpht.mp291
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/rigorcubo.mp36
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/rmnbob.mp45
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/sal.mp104
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/sfearschem.mp34
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/signalvertexSD.mp40
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/spherample.mp49
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/squareanglines.mp14
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/troncoconedef.mp54
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/twistnlc.mp54
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/twistroundbiax.mp62
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/twocyclestogether.mp113
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/repeated/twoupcones.mp51
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/anglinerigorouscircle.mp108
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/cartaxes.mp28
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/conicurv.mp94
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/cubicfacecentered.mp112
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/cubicfigures.mp44
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/cylimple.mp50
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/downloadicon.mp66
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/eemcsblabla.mp292
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/embroncordada.mp57
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/fakehole.mp59
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/featpostlogo.mp29
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/ffcbob.mp84
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/fieldlinesnorma.mp104
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/fis1prex.mp131
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/fis3prex.mp481
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/geombasic.mp82
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/geomfiguei.mp71
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/geommine.mp104
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/globe.mp32
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/halfcirclesfear.mp43
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/hexagonaltrimesh.mp25
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/hiddensurface.mp153
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/hiddensurfaces.mp65
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/inductionbob.mp116
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/joinedemptylines.mp47
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/kindofcube.mp81
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/labelconstruct.mp30
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/labelinspace.mp33
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/magneticflux.mp105
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/nembiaxi.mp64
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/nemsaddl.mp86
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/nsmetica.mp60
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/parafuso.mp100
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/pathofstraightline.mp29
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/photoreverse.mp242
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/polyhedr.mp191
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/positivecharge.mp28
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/resistcircuit.mp64
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/rigorouscircle.mp49
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/rigorouscone.mp36
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousdiscSD.mp49
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousdiscoptions.mp31
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousfearpath.mp66
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/rotatnlc.mp49
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/saturn.mp111
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/sharpraytrace.mp102
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/simplecar.mp25
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/simplecarparam.mp56
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/spatialhalfsfear.mp15
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/spltwiben.mp81
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/stageforthree.mp115
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/tangencypoint.mp38
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/tdarrow.mp26
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/thearchicon.mp59
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/thethreekindsofperspec.mp195
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/torus.mp297
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/trajectoryline.mp88
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/triangulartrimesh.mp39
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/tropicalglobe.mp23
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/tshirtfig.mp39
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/tuftescatter.mp83
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/twistflat.mp55
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/twoholes.mp31
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/unperfection.mp59
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/unperfectionremoved.mp34
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/vanallenbelt.mp51
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/verygoodcone.mp28
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/standard/xraycamera.mp117
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/tug04/cone.mp37
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/tug04/ellipticprism.mp39
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/tug04/intersection2D.mp46
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/tug04/kindofcube.mp57
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/tug04/newexperimental.mp157
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/tug04/perspec.mp77
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/tug04/planintersection.mp105
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/tug04/revolvers.mp112
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/tug04/tangency2D.mp56
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/galrey/galrey.rc75
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/galrey/galrey.sh6
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/galrey/galrey.tpl42
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/jpeg/cbxSmall.jpgbin0 -> 2537 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/jpeg/hiddenlinegraph1.jpgbin0 -> 30350 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/jpeg/mymetapostbackground.jpegbin0 -> 23535 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/jpeg/mymetapostclearback.jpegbin0 -> 4710 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/jpeg/par3Dplotexamples1.jpgbin0 -> 15400 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/jpeg/par3Dplotexamples2.jpgbin0 -> 27764 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/jpeg/planpau2.jpegbin0 -> 15711 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/latex/linuxdoc-sgml.sty117
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/latex/logofeatpost.tex18
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/latex/ltugboat.cls1225
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/latex/macroMan.tex1737
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/latex/mflogohack.sty31
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/latex/null.sty0
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/latex/qwertz.sty19
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/macro/README.macro13
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/nontextualpng/cylimple.1.pngbin0 -> 8642 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/nontextualpng/globe.1.pngbin0 -> 21110 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/nontextualpng/rigorouscone.1.pngbin0 -> 11103 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/nontextualpng/rigorousfearpath.1.pngbin0 -> 8984 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/nontextualpng/rotatnlc.1.pngbin0 -> 37973 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/nontextualpng/stageforthree.2.pngbin0 -> 34023 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/nontextualpng/torus.5.pngbin0 -> 83805 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/nontextualpng/torus.6.pngbin0 -> 62981 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/nontextualpng/triangulartrimesh.1.pngbin0 -> 95207 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/border140.pngbin0 -> 552 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/borderframetest.pngbin0 -> 291 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/composite.pngbin0 -> 264 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/downloadicon.pngbin0 -> 5494 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/experfilminifram.pngbin0 -> 23300 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/featpost2.pngbin0 -> 4763 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/inifram.pngbin0 -> 4412 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/lcdistortsallinifram.pngbin0 -> 43210 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/metapostlace.pngbin0 -> 20108 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/png/myicon.pngbin0 -> 237 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/typesetinspace/README.mpy21
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/typesetinspace/example.mp17
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/typesetinspace/exampleminimal.mp7
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/typesetinspace/makempy.pl365
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/typesetinspace/mp-grph.mp295
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/typesetinspace/mp-tool.mp2366
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/xcmd/README.xcmd10
-rwxr-xr-xMaster/texmf-dist/doc/metapost/featpost/xcmd/xmpost70
-rw-r--r--Master/texmf-dist/doc/metapost/hatching/htchuse.mp55
-rw-r--r--Master/texmf-dist/doc/metapost/hatching/htchuse_.tex11
-rw-r--r--Master/texmf-dist/doc/metapost/hatching/readme52
-rw-r--r--Master/texmf-dist/doc/metapost/latexmp/README11
-rw-r--r--Master/texmf-dist/doc/metapost/latexmp/examples.pdfbin0 -> 126612 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/latexmp/latexmp.pdfbin0 -> 90561 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/latexmp/lmp-grph.mp34
-rw-r--r--Master/texmf-dist/doc/metapost/latexmp/lmp-mc-text.tex23
-rw-r--r--Master/texmf-dist/doc/metapost/latexmp/lmp-mc.mp11
-rw-r--r--Master/texmf-dist/doc/metapost/latexmp/lmp-mfun.mp34
-rw-r--r--Master/texmf-dist/doc/metapost/latexmp/lmp-pkg.mp41
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/README84
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube10.mp88
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube4-eng.mp124
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube5.mp86
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube6.mp94
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube7.mp133
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube8.mp48
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube9.mp66
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1-eng.mp75
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1.mp76
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2-eng.mp90
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2.mp91
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3-eng.mp98
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3.mp99
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4-eng.mp112
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4.mp113
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5-eng.mp84
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5.mp85
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6-eng.mp100
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6.mp101
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7-eng.mp102
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7.mp103
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8-eng.mp120
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8.mp121
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp9.mp63
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/monge-eng.mp148
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/monge.mp149
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/gut2001.pdfbin0 -> 247845 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdfbin0 -> 138588 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdfbin0 -> 175795 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx1149
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdfbin0 -> 263816 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/mpattern/README129
-rw-r--r--Master/texmf-dist/doc/metapost/mpattern/README.PL133
-rw-r--r--Master/texmf-dist/doc/metapost/mpattern/test.mp146
-rw-r--r--Master/texmf-dist/doc/metapost/mpattern/test.tex22
-rw-r--r--Master/texmf-dist/doc/metapost/piechartmp/INSTALL6
-rw-r--r--Master/texmf-dist/doc/metapost/piechartmp/LEGAL104
-rw-r--r--Master/texmf-dist/doc/metapost/piechartmp/README17
-rw-r--r--Master/texmf-dist/doc/metapost/piechartmp/examples/wec-mfun.mp146
-rw-r--r--Master/texmf-dist/doc/metapost/piechartmp/examples/wec-mfun.pdfbin0 -> 32908 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/piechartmp/examples/wec.mp122
-rw-r--r--Master/texmf-dist/doc/metapost/piechartmp/examples/wec.pdfbin0 -> 8824 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/piechartmp/examples/worldmap.jpgbin0 -> 23616 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/piechartmp/piechartmp.pdfbin0 -> 316716 bytes
271 files changed, 32648 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/metapost/base/Makefile b/Master/texmf-dist/doc/metapost/base/Makefile
new file mode 100644
index 00000000000..18eff80e6b2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/Makefile
@@ -0,0 +1,125 @@
+# Makefile for texmf/doc/metapost:
+# ================================
+
+MP = mp
+
+#DVIPS = dvips -Pold
+DVIPS = dvips -Pold -D300
+
+LATEX = latex
+BIBTEX = bibtex
+
+TROFF = troff -Tpost -ms -mpictures | dpost
+GROFF = groff -Tps -mgs
+
+###
+
+MPMAN_FIGS = \
+ manfig.0 manfig.2 manfig.3 manfig.104 manfig.204 manfig.5 \
+ manfig.6 manfig.7 manfig.8 manfig.109 manfig.209 manfig.110 \
+ manfig.210 manfig.310 manfig.111 manfig.211 manfig.311 manfig.411 \
+ manfig.13 manfig.14 manfig.17 manfig.18 manfig.19 manfig.20 \
+ manfig.21 manfig.22 manfig.123 manfig.223 manfig.24 manfig.25 \
+ manfig.26 manfig.28 manfig.29 manfig.30 manfig.31 manfig.32 \
+ manfig.33 manfig.34 manfig.35 manfig.36 manfig.37 manfig.38 \
+ manfig.40 manfig.42 manfig.45 manfig.48 manfig.49 manfig.50 \
+ manfig.51 manfig.52
+
+MPGRAPH_FIGS = \
+ mpgraph.1 mpgraph.2 mpgraph.3 mpgraph.4 mpgraph.5 mpgraph.6 \
+ mpgraph.7 mpgraph.8 mpgraph.9 mpgraph.10 mpgraph.11
+MPGRPAH_DATA = \
+ agepop91.d agepopm.d countries.d energy.d lead.d matmul.d timepop.d
+
+EXAMPLE_FIGS = \
+ examples.1 examples.2 examples.3 examples.4 examples.5 examples.6 \
+ examples.7 examples.8 examples.9
+
+###
+
+default: all
+all: mpman.ps mpgraph.ps mpintro.ps
+
+### MetaPost manuals
+
+mpman.ps: mpman.dvi $(MPMAN_FIGS)
+ @echo "WARNING: mpman.dvi was build using the obsolete font rpsyr."
+ @echo "You can safely ignore one warning about a checksum mismatch."
+ $(DVIPS) mpman.dvi -o mpman.ps
+
+mpgraph.ps: mpgraph.dvi $(MPGRAPH_FIGS)
+ @echo "WARNING: mpgraph.dvi was build using the obsolete versions of"
+ @echo "the fonts logo10 logo8 logosl10. You can safely ignore dvips's"
+ @echo "checksum warnings for these fonts."
+ $(DVIPS) mpgraph.dvi -o mpgraph.ps
+
+$(MPMAN_FIGS): manfig.mp
+ $(MP) manfig.mp
+
+$(MPGRAPH_FIGS): mpgraph.mp $(MPGRAPH_DATA)
+ $(MP) mpgraph.mp
+
+### LaTeX example
+
+mpintro.ps: mpintro.dvi $(EXAMPLE_FIGS)
+
+mpintro.dvi: mpintro.tex mpintro.bib
+ $(LATEX) mpintro
+ $(BIBTEX) mpintro
+ $(LATEX) mpintro
+ $(LATEX) mpintro
+
+$(EXAMPLE_FIGS): examples.mp
+ $(MP) examples.mp
+
+### troff and/or groff example
+
+grdemo.ps: grdemo.ms figs.1
+ cat grdemo.ms | $(GROFF) > grdemo.ps
+
+demo.ps: demo.ms figs.1 /usr/lib/tmac/tmac.pictures
+ cat demo.ms | $(TROFF) > demo.ps
+
+figs.1: figs.mp
+ test -d /usr/lib/font/devpost || $(MAKE) /usr/lib/font/devpost
+ test -d /usr/lib/font/devpost && $(MP) -T figs.mp
+
+/usr/lib/tmac/tmac.pictures:
+ @echo
+ @echo "WARNING: You don't seem to have the troff \`mpictures' macros"
+ @echo "which are needed to typeset the \`demo.ps' example document."
+ @echo "If your troff implementation doesn't provide these macros"
+ @echo "you're out of luck, I'm afraid. Sorry, I can't help you!"
+ @echo
+ @echo "Perhaps you may want to try \`grdemo.ps' as an alternative"
+ @echo "if you have GNU groff installed on your system?"
+ @echo
+ @false
+
+/usr/lib/font/devpost:
+ @echo
+ @echo "WARNING: You don't seem to have a suitable troff implementation"
+ @echo "on your system that matches the assumptions built into the"
+ @echo "MetaPost support programs. To run MetaPost in troff mode"
+ @echo "you'll probably need a troff implementation from Bell Labs."
+ @echo "Using GNU groff as an alternative won't work, I'm afraid."
+ @echo
+ @false
+
+
+### pattern rules
+
+.dvi.ps:
+ $(DVIPS) $< -o $@
+
+### cleanup targets
+
+clean:
+ rm -f $(MPMAN_FIGS) $(MPGRAPH_FIGS) $(EXAMPLE_FIGS)
+ rm -f *.mpx *.log *.aux mpxerr*
+
+distclean: clean
+ rm -f mpman.ps mpgraph.ps mpintro.ps
+
+.PHONY: clean
+.SUFFIXES: .dvi .ps
diff --git a/Master/texmf-dist/doc/metapost/base/grdemo.pdf b/Master/texmf-dist/doc/metapost/base/grdemo.pdf
new file mode 100644
index 00000000000..2769c05b35a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/grdemo.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/base/index.html b/Master/texmf-dist/doc/metapost/base/index.html
new file mode 100644
index 00000000000..3880ff99aa8
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/index.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<HTML>
+<HEAD>
+<TITLE>Index of texmf/doc/metapost/</TITLE>
+<!-- Created: UV, 1996/12/27 -->
+<!-- $Id: //depot/Master/texmf-dist/doc/metapost/base/index.html#3 $ $Date: 2004/06/20 $ $Author: karl $ -->
+</HEAD>
+
+<BODY>
+<H1>Index of <CODE>texmf/doc/metapost/</CODE></H1>
+
+<HR>
+
+<P> This page provides access to documentation about the MetaPost
+system by John Hobby, including the MetaPost program and standard
+MetaPost macro packages.
+</P>
+
+<P> Additional information about the MetaPost system
+can be found on John Hobby's WWW pages at
+<A HREF="http://plan9.bell-labs.com/who/hobby/MetaPost.html">
+http://plan9.bell-labs.com/who/hobby/MetaPost.html</A>. Other links are
+available from <A HREF="http://tug.org/metapost.html">TUG's MetaPost web
+page</A>.
+</P>
+
+<H2>Index</H2>
+<DL>
+ <DT><A HREF="mpintro.pdf">
+ <CITE>The MetaPost System</CITE></A> (PDF)<BR>
+ <DD>Introduction to MetaPost, and also an example document for using
+ MetaPost with LaTeX.
+
+ <DT><A HREF="mpman.pdf">
+ <CITE>A User's Manual for MetaPost</CITE></A> (PDF)<BR>
+ <DD>AT&amp;T Bell Labs, CSTR 162, by John Hobby, 1992.<BR>
+ The primary manual for the MetaPost system, which includes
+ a description of most standard MetaPost macro packages.
+
+ <DT><A HREF="mpgraph.pdf">
+ <CITE>Drawing Graphs with MetaPost</CITE></A> (PDF)<BR>
+ <DD>AT&amp;T Bell Labs, CSTR 164, by John Hobby, 1993.<BR>
+ The manual for the MetaPost <code>graph.mp</code> package
+ and a few specialized features of the MetaPost program
+ that were added after the publication of the user manual.
+
+ <DT><A HREF="grdemo.pdf">
+ <CITE>MetaPost with groff</CITE></A> (PDF)<BR>
+ <DD>Example of using MetaPost with groff.
+
+ <DT><A HREF="source/">source</A><BR>
+ <DD>Subdirectory with all the MetaPost, TeX, and roff sources.
+
+</DL>
+<BR>
+
+
+<!-- hhmts start -->
+Last modified: $Date: 2004/06/20 $
+<!-- hhmts end -->
+</BODY>
+</HTML>
diff --git a/Master/texmf-dist/doc/metapost/base/mpgraph.pdf b/Master/texmf-dist/doc/metapost/base/mpgraph.pdf
new file mode 100644
index 00000000000..d4b2b3df1d0
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/mpgraph.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/base/mpintro.pdf b/Master/texmf-dist/doc/metapost/base/mpintro.pdf
new file mode 100644
index 00000000000..b6c896c5de4
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/mpintro.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/base/mpman.pdf b/Master/texmf-dist/doc/metapost/base/mpman.pdf
new file mode 100644
index 00000000000..c9546984f9e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/mpman.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/base/source/Makefile b/Master/texmf-dist/doc/metapost/base/source/Makefile
new file mode 100644
index 00000000000..ce7f3098a02
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/Makefile
@@ -0,0 +1,31 @@
+# Makefile for mpman and mpgraph.
+# (../Makefile has rules for building grdemo and mpintro.)
+#
+%.pdf: %.ps
+ ps2pdf $< || rm -f $@
+
+%.ps: %.dvi
+ dvips -t letter $< -o $@ || rm -f $@
+
+all: mpman.pdf mpgraph.pdf
+
+mpgraph.dvi: mpgraph.tex mpgraph.bib mpgraph.mp
+ mpost mpgraph
+ latex mpgraph
+ bibtex mpgraph
+ latex mpgraph
+ latex mpgraph
+
+mpman.dvi: mpman.tex mpman.bib mpman.ist manfig.mp
+ mpost manfig
+ latex mpman
+ bibtex mpman
+ latex mpman
+ latex mpman
+ makeindex -s mpman.ist mpman
+ latex mpman
+
+clean distclean:
+ rm -f manfig.[0-9]* mpgraph.[0-9]*
+ rm -f *.aux *.bbl *.blg *.dvi *.log *.mpx *.pdf *.ps
+ rm -f *.idx *.ilg *.ind *.toc
diff --git a/Master/texmf-dist/doc/metapost/base/source/README b/Master/texmf-dist/doc/metapost/base/source/README
new file mode 100644
index 00000000000..117f8773fa7
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/README
@@ -0,0 +1,32 @@
+This is the source for the documentation for MetaPost, consisting of
+"A User's Manual for MetaPost" and "Drawing Graphs with MetaPost",
+written by John D. Hobby. They were converted to more modern LaTeX by
+Dylan Thurston. The manual may be freely used and modified, but John
+Hobby makes these requests:
+
+ - I request that it remain clear that I am the author of
+ "A User's Manual for MetaPost" and "Drawing Graphs with MetaPost".
+ - I request to be consulted before significant changes are made.
+
+See the end of mpman.tex or mpgraph.tex for the precise conditions.
+
+Included files:
+
+README
+agepop91.d
+agepopm.d
+countries.d
+ctabbing.sty
+energy.d
+lead.d
+manfig.mp
+matmul.d
+mpgraph.bib
+mpgraph.mp
+mpgraph.tex
+mpman.bib
+mpman.ist
+mpman.tex
+timepop.d
+
+See the Makefile for the sequence of commands to create the DVI/PS/PDF output.
diff --git a/Master/texmf-dist/doc/metapost/base/source/agepop91.d b/Master/texmf-dist/doc/metapost/base/source/agepop91.d
new file mode 100644
index 00000000000..5dfaeb31449
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/agepop91.d
@@ -0,0 +1,85 @@
+00 4011000
+01 3969000
+02 3806000
+03 3718000
+04 3717000
+05 3702000
+06 3681000
+07 3575000
+08 3512000
+09 3767000
+10 3703000
+11 3662000
+12 3484000
+13 3414000
+14 3409000
+15 3293000
+16 3362000
+17 3360000
+18 3391000
+19 3836000
+20 4120000
+21 4009000
+22 3767000
+23 3664000
+24 3812000
+25 3866000
+26 4069000
+27 4242000
+28 4086000
+29 4580000
+30 4501000
+31 4432000
+32 4387000
+33 4387000
+34 4534000
+35 4325000
+36 4201000
+37 4132000
+38 3788000
+39 4127000
+40 3836000
+41 3721000
+42 3634000
+43 3589000
+44 3998000
+45 2834000
+46 2823000
+47 2850000
+48 2857000
+49 2737000
+50 2528000
+51 2340000
+52 2298000
+53 2280000
+54 2200000
+55 2129000
+56 2195000
+57 2068000
+58 1946000
+59 2085000
+60 2124000
+61 2100000
+62 2076000
+63 2145000
+64 2138000
+65 2072000
+66 2069000
+67 2026000
+68 1911000
+69 1960000
+70 1886000
+71 1731000
+72 1649000
+73 1518000
+74 1458000
+75 1405000
+76 1334000
+77 1244000
+78 1204000
+79 1091000
+80 970000
+81 883000
+82 799000
+83 739000
+84 644000 \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/agepopm.d b/Master/texmf-dist/doc/metapost/base/source/agepopm.d
new file mode 100644
index 00000000000..85c86e1b52a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/agepopm.d
@@ -0,0 +1,85 @@
+00 4.011
+01 3.969
+02 3.806
+03 3.718
+04 3.717
+05 3.702
+06 3.681
+07 3.575
+08 3.512
+09 3.767
+10 3.703
+11 3.662
+12 3.484
+13 3.414
+14 3.409
+15 3.293
+16 3.362
+17 3.36
+18 3.391
+19 3.836
+20 4.12
+21 4.009
+22 3.767
+23 3.664
+24 3.812
+25 3.866
+26 4.069
+27 4.242
+28 4.086
+29 4.58
+30 4.501
+31 4.432
+32 4.387
+33 4.387
+34 4.534
+35 4.325
+36 4.201
+37 4.132
+38 3.788
+39 4.127
+40 3.836
+41 3.721
+42 3.634
+43 3.589
+44 3.998
+45 2.834
+46 2.823
+47 2.85
+48 2.857
+49 2.737
+50 2.528
+51 2.34
+52 2.298
+53 2.28
+54 2.2
+55 2.129
+56 2.195
+57 2.068
+58 1.946
+59 2.085
+60 2.124
+61 2.1
+62 2.076
+63 2.145
+64 2.138
+65 2.072
+66 2.069
+67 2.026
+68 1.911
+69 1.96
+70 1.886
+71 1.731
+72 1.649
+73 1.518
+74 1.458
+75 1.405
+76 1.334
+77 1.244
+78 1.204
+79 1.091
+80 0.97
+81 0.883
+82 0.799
+83 0.739
+84 0.644 \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/countries.d b/Master/texmf-dist/doc/metapost/base/source/countries.d
new file mode 100644
index 00000000000..d1e43598200
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/countries.d
@@ -0,0 +1,60 @@
+20.910 75.7 US
+ 1.831 66.7 Alg
+ 1.694 70.9 Arg
+16.430 77.3 Aus
+ 0.180 53.0 Ban
+15.620 77.1 Bel
+ 3.090 65.2 Brz
+ 5.530 72.7 Bul
+ 0.404 54.9 Bur
+20.240 77.5 Can
+ 1.809 73.4 Chl
+ 0.547 70.0 Chn
+ 7.390 74.6 Tai
+ 1.139 71.0 Col
+ 7.876 72.9 Cze
+ 1.342 60.8 Egy
+ 0.120 51.3 Eth
+17.000 77.8 Fra
+17.446 75.8 Ger
+ 0.350 54.6 Gha
+ 5.286 77.7 Gre
+ 6.119 71.6 Hun
+ 0.321 57.2 Ind
+ 0.479 61.0 Inn
+ 1.440 64.5 Irn
+14.940 78.1 Ita
+22.900 79.2 Jap
+ 0.338 61.5 Ken
+ 0.205 52.6 Mad
+ 2.099 68.1 Mal
+ 2.170 72.2 Mex
+ 0.866 64.6 Mor
+ 0.078 47.4 Moz
+ 0.150 50.6 Nep
+14.980 77.8 Nth
+ 0.239 48.9 Nig
+ 1.427 69.0 NKo
+ 0.330 56.6 Pak
+ 1.903 64.3 Per
+ 0.697 64.6 Phi
+ 4.625 72.9 Pol
+ 4.323 74.7 Por
+ 4.896 71.9 Rom
+ 2.253 64.2 SAf
+ 4.920 69.7 SKo
+ 9.226 69.8 USS
+ 9.471 78.3 Spn
+ 0.409 71.1 Sri
+ 0.608 53.0 Sud
+21.900 77.8 Swe
+27.510 79.1 Swi
+ 1.608 69.4 Syr
+ 0.105 52.0 Tnz
+ 1.246 68.5 Tha
+ 1.380 69.8 Tur
+ 0.233 51.0 Uga
+14.580 76.5 UK
+ 2.158 74.2 Ven
+ 2.474 73.0 Yug
+ 0.258 53.9 Zai \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/ctabbing.sty b/Master/texmf-dist/doc/metapost/base/source/ctabbing.sty
new file mode 100644
index 00000000000..2f60af48011
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/ctabbing.sty
@@ -0,0 +1,17 @@
+
+% The ctabbing environment is a centered tabbing environment suitable for
+% displaying program fragments. The vertical spacing is exactly like that
+% for normal text in a center environment. This is achieved by setting
+% \@minipagetrue to fool \tabbing into thinking that it starts a minipage
+% and should therefore avoid all vertical space at the top. (Note that any
+% space at all would defeat the \vtop command in \ctabbing.) The
+% \vskip-\lastskip and \prevdepth saving commands avoid extra space after
+% \endtabbing
+
+\newdimen\ct@pd
+
+\def\ctabbing{\center\leavevmode\vtop\bgroup\@minipagetrue\begingroup\tabbing}
+
+\def\endctabbing{\endtabbing\endgroup\vskip-\lastskip
+ \global\ct@pd\prevdepth \egroup
+ \endcenter \global\prevdepth\ct@pd}
diff --git a/Master/texmf-dist/doc/metapost/base/source/demo.ms b/Master/texmf-dist/doc/metapost/base/source/demo.ms
new file mode 100644
index 00000000000..736c8641fbd
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/demo.ms
@@ -0,0 +1,105 @@
+.so /usr/lib/tmac/tmac.pictures
+.nr PS 11
+.nr VS 13
+.TL
+MetaPost with troff
+.LP
+Since MetaPost is a picture-drawing language that outputs PostScript, it is
+necessary to use the
+.ft CW
+-mpictures
+.ft
+macro package. Suppose you have written some figures in MetaPost and placed
+the input in a file \f(CWfigures.mp\fR.
+Running
+.nf
+.ft CW
+ mp -T figures
+.ft
+.fi
+to invoke the MetaPost interpreter produces output files
+\f(CWfigures.1\fR, \f(CWfigures.2\fR, .\|.\|.
+via macro calls such as
+.nf
+.ft CW
+ .BP figures.1 height width
+.ft
+.fi
+as explained in the
+.ft CW
+-mpictures
+.ft
+documentation. Note that the picture gets rescaled if the height and width
+in the \f(CW.BP\fR command don't match \fImp\fR's idea of the picture dimensions.
+.PP
+For instance,
+.BP figs.1 1.08i 1.5i
+this figure was derived from a file
+.ft CW
+figs.mp
+.ft
+and included at this point by invoking the \f(CW.BP\fR
+macro with height 1.08 inches and width 1.5 inches. The macro tries to run text
+around the picture, but this can be stopped
+by using the \f(CW.EP\fR macro as was done here.
+.EP
+The file
+.ft CW
+figs.mp
+.ft
+looks like this:
+.nf
+.ft CW
+.nr PS 9
+.nr VS 11
+prologues:=1;
+input boxes
+beginfig(1);
+pair shadowshift; shadowshift=(1,-1)*bp;
+
+def drawshadowed(text t) =
+ forsuffixes $=t:
+ fill bpath$ shifted shadowshift;
+ unfill bpath$;
+ drawboxed($);
+ endfor
+enddef;
+
+boxit.a(btex \\s8A\\s+2 \\(lh a etex);
+circleit.b(btex $e sup {i omega t}$ etex rotated 20);
+b.w - a.e = (10bp,0);
+drawshadowed(a,b);
+draw a.e..b.w;
+
+draw bbox currentpicture dashed evenly;
+endfig;
+.nr PS 11
+.nr VS 13
+.ft
+.fi
+.PP
+Note that the typesetting commands in the
+\f(CWbtex\fR.\|.\|.\f(CWetex\fR blocks in the above example are processed by
+.nf
+.ft CW
+ eqn -d\\$\\$ | troff;
+.ft
+.fi
+If a different \fItroff\fR pipeline is desired, it can be specified via the
+.ft CW
+TROFF
+.ft
+environment variable. For example,
+.nf
+.ft CW
+ TROFF='tbl | eqn -d\\$\\$ | troff -Tpost'
+.ft
+.fi
+adds \fItbl\fR to the pipeline.
+.PP
+Macro definitions and such can be added via the standard
+\f(CWverbatimtex\fR.\|.\|.\f(CWetex\fR mechanism that adds the given material
+to the \fItroff\fR input. Such material should not generate any output since
+this would get mixed up with the next \f(CWbtex\fR.\|.\|.\f(CWetex\fR block.
+Thus, newlines between \f(CWverbatimtex\fR and \f(CWetex\fR must be
+protected with \f(CW\\\fR.
diff --git a/Master/texmf-dist/doc/metapost/base/source/energy.d b/Master/texmf-dist/doc/metapost/base/source/energy.d
new file mode 100644
index 00000000000..5b0b25596c7
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/energy.d
@@ -0,0 +1,75 @@
+1900 7.02 0.369 0.254 0.25
+1901 7.631 0.402 0.283 0.264
+1902 7.869 0.515 0.301 0.289
+1903 9.303 0.583 0.319 0.321
+1904 9.159 0.679 0.333 0.354
+1905 10.228 0.781 0.377 0.386
+1906 10.794 0.734 0.418 0.414
+1907 12.517 0.963 0.437 0.441
+1908 10.828 1.035 0.432 0.476
+1909 12.008 1.062 0.517 0.513
+1910 13.074 1.215 0.547 0.539
+1911 12.933 1.279 0.551 0.565
+1912 13.936 1.293 0.604 0.585
+1913 14.86 1.441 0.626 0.609
+1914 13.382 1.541 0.636 0.636
+1915 13.857 1.63 0.676 0.659
+1916 15.39 1.744 0.81 0.681
+1917 16.987 1.945 0.855 0.7
+1918 17.69 2.064 0.775 0.701
+1919 14.444 2.195 0.802 0.718
+1920 17.175 2.569 0.883 0.738
+1921 13.195 2.739 0.732 0.62
+1922 12.452 3.234 0.843 0.643
+1923 17.163 4.248 1.113 0.685
+1924 14.905 4.141 1.263 0.648
+1925 15.195 4.43 1.314 0.668
+1926 17.165 4.471 1.452 0.728
+1927 15.599 5.227 1.598 0.776
+1928 15.034 5.229 1.734 0.854
+1929 15.892 5.842 2.118 0.816
+1930 14.011 5.208 2.148 0.752
+1931 11.526 4.936 1.869 0.668
+1932 9.38 4.554 1.729 0.713
+1933 9.999 5.253 1.733 0.711
+1934 10.867 5.267 1.97 0.698
+1935 11.081 5.78 2.136 0.806
+1936 12.89 6.378 2.411 0.812
+1937 12.99 7.419 2.684 0.871
+1938 10.303 7.043 2.565 0.866
+1939 11.653 7.337 2.763 0.838
+1940 13.38 7.849 2.979 0.88
+1941 14.903 8.133 3.162 0.934
+1942 16.799 8.043 3.436 1.136
+1943 17.003 8.733 3.839 1.304
+1944 17.851 9.732 4.176 1.344
+1945 16.529 9.939 4.423 1.442
+1946 15.526 10.057 4.55 1.406
+1947 17.975 10.771 5.012 1.296
+1948 17.158 11.717 5.615 1.369
+1949 12.557 10.683 5.911 1.425
+1950 14.647 11.449 6.841 1.415
+1951 15.066 13.037 8.106 1.424
+1952 13.262 13.282 8.705 1.466
+1953 12.767 13.671 9.116 1.413
+1954 11.001 13.247 9.488 1.36
+1955 12.745 14.445 10.532 1.36
+1956 13.747 15.344 11.252 1.435
+1957 13.444 15.346 11.885 1.422
+1958 11.201 14.154 12.244 1.592
+1959 11.105 14.662 13.361 1.551
+1960 11.14 14.664 14.135 1.608
+1961 10.751 15.185 14.691 1.656
+1962 11.211 15.495 15.365 1.816
+1963 12.176 15.741 16.271 1.768
+1964 12.854 15.691 17.138 1.886
+1965 13.485 15.93 17.652 2.059
+1966 13.836 16.925 18.984 2.062
+1967 14.215 18.1 20.087 2.347
+1968 13.955 18.593 21.548 2.349
+1969 14.223 18.886 22.838 2.648
+1970 15.248 19.772 24.154 2.63
+
+Cols 2-5: U.S. annual production of
+2) coal, 3) crude oil, 4) natural gas, 5) hydroelectric power
+in quadrillions of British thermal units. \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/examples.mp b/Master/texmf-dist/doc/metapost/base/source/examples.mp
new file mode 100644
index 00000000000..0e2a8dc0a65
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/examples.mp
@@ -0,0 +1,247 @@
+beginfig(1);
+a=.7in; b=0.5in;
+z0=(0,0); z1=(a,0); z2=(0,b);
+z0=.5[z1,z3]=.5[z2,z4];
+draw z1..z2..z3..z4..cycle;
+drawarrow z0..z1;
+drawarrow z0..z2;
+label.top(btex $a$ etex, .5[z0,z1]);
+label.lft(btex $b$ etex, .5[z0,z2]);
+endfig;
+
+
+
+
+beginfig(2);
+
+h=2in; w=2.7in;
+path p[], q[], pp;
+for i=1.5,2,4:
+ ii := i**2;
+ p[i] = (w/ii,h){1/ii,-1}...(w/i,h/i)...(w,h/ii){1,-1/ii};
+endfor
+for i=.5,1.5:
+ q[i] = origin..(w,i*h) cutafter p1.5;
+endfor
+
+pp = buildcycle(q0.5, p2, q1.5, p4);
+
+fill pp withcolor .8white;
+z0=center pp;
+picture lab; lab=thelabel(btex $f>0$ etex, z0);
+unfill bbox lab; draw lab;
+draw q0.5; draw p2; draw q1.5; draw p4;
+makelabel.top(btex $P$ etex, p2 intersectionpoint q0.5);
+makelabel.rt(btex $Q$ etex, p2 intersectionpoint q1.5);
+endfig;
+
+
+
+
+beginfig(3);
+
+3.2scf = 2.4in;
+path fun;
+# = .1; % Keep the function single-valued
+fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#))
+ scaled scf yscaled(1/#);
+
+vardef vertline primary x = (x,-infinity)..(x,infinity) enddef;
+primarydef f atx x = (f intersectionpoint vertline x) enddef;
+primarydef f whenx x = xpart(f intersectiontimes vertline x) enddef;
+
+z1a = (2.5scf,0);
+z1 = fun atx x1a;
+y2a=0; z1-z2a=whatever*direction fun whenx x1 of fun;
+z2 = fun atx x2a;
+y3a=0; z2-z3a=whatever*direction fun whenx x2 of fun;
+
+draw fun withpen pencircle scaled 1pt;
+drawarrow (0,0)..(3.2scf,0);
+
+label.bot(btex $x_1$ etex, z1a);
+draw z1a..z1 dashed evenly;
+makelabel(nullpicture, z1);
+draw z1..z2a withpen pencircle scaled .3;
+label.bot(btex $x_2$ etex, z2a);
+draw z2a..z2 dashed evenly;
+makelabel(nullpicture, z2);
+draw z2..z3a withpen pencircle scaled .3;
+label.bot(btex $x_3$ etex, z3a);
+endfig;
+
+
+
+beginfig(4);
+for i=0 upto 2:
+ z[i]=(0,40i); z[i+3]-z[i]=(100,30);
+endfor
+pickup pencircle scaled 18;
+def gray = withcolor .8white enddef;
+draw z0..z3 gray;
+linecap:=butt; draw z1..z4 gray;
+linecap:=squared; draw z2..z5 gray;
+labels.top(0,1,2,3,4,5);
+endfig; linecap:=rounded;
+
+
+
+beginfig(5);
+for i=0 upto 2:
+ z[i]=(0,50i); z[i+3]-z[i]=(60,40);
+ z[i+6]-z[i]=(120,0);
+endfor
+pickup pencircle scaled 24;
+def gray = withcolor .8white enddef;
+draw z0--z3--z6 gray;
+linejoin:=mitered; draw z1..z4--z7 gray;
+linejoin:=beveled; draw z2..z5--z8 gray;
+labels.bot(0,1,2,3,4,5,6,7,8);
+endfig; linejoin:=rounded;
+
+
+
+input boxes
+
+
+\beginfig(6);
+fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
+boxit(currentpicture);
+dx = dy = .25in;
+clearit; drawboxed();
+forsuffixes $=n,c: makelabel.top(str $, $); endfor
+makelabel.bot("s",s);
+forsuffixes $=ne,e,se: makelabel.rt(str $, $); endfor
+forsuffixes $=nw,w,sw: makelabel.lft(str $, $); endfor
+pickup pencircle scaled .3bp;
+vardef larrow@#(expr a, da, s) =
+ drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
+larrow.rt(n, (0,-dy), "dy");
+larrow.rt(s, (0,dy), "dy");
+larrow.top(e, (-dx,0), "dx");
+larrow.top(w, (dx,0), "dx");
+endfig;
+
+
+
+beginfig(7);
+boxjoin(a.se=b.sw; a.ne=b.nw );
+boxit.a(btex $\cdots$ etex);
+boxit.ni(btex $n_i$ etex);
+boxit.di(btex $d_i$ etex);
+boxit.nii(btex $n_{i+1}$ etex);
+boxit.dii(btex $d_{i+1}$ etex);
+boxit.aa(pic_.a);
+boxit.nk(btex $n_k$ etex);
+boxit.dk(btex $d_k$ etex);
+
+di.dy = 2;
+drawboxed(a,ni,di,nii,dii,aa,nk,dk);
+label.lft("ndtable:", a.w);
+
+boxjoin(a.sw=b.nw; a.se=b.ne);
+interim defaultdy:=7;
+boxit.ba();
+boxit.bb();
+boxit.bc();
+boxit.bd(btex $\vdots$ etex);
+boxit.be();
+boxit.bf();
+bd.dx = 8;
+ba.ne = a.sw - (15,10);
+
+drawboxed(ba,bb,bc,bd,be,bf);
+label.lft("hashtab:", ba.w);
+
+def ndblock suffix $ =
+ boxjoin(a.sw=b.nw; a.se=b.ne);
+ forsuffixes $$=$a,$b,$c:
+ boxit$$(); ($$dx,$$dy)=(5.5,4);
+ endfor;
+enddef;
+
+ndblock nda;
+ndblock ndb;
+ndblock ndc;
+nda.a.c - bb.c = ndb.a.c - nda.c.c = (whatever,0);
+xpart ndb.c.se = xpart ndc.a.ne = xpart di.c;
+ndc.a.c - be.c = (whatever,0);
+
+drawboxes(nda.a,nda.b,nda.c, ndb.a,ndb.b,ndb.c, ndc.a,ndc.b,ndc.c);
+
+drawarrow bb.c .. nda.a.w;
+drawarrow be.c .. ndc.a.w;
+drawarrow nda.c.c .. ndb.a.w;
+drawarrow nda.a.c{right}..{curl0}ni.c cutafter bpath ni;
+drawarrow nda.b.c{right}..{curl0}di.c cutafter bpath di;
+drawarrow ndc.a.c{right}..{curl0}nii.c cutafter bpath nii;
+drawarrow ndc.b.c{right}..{curl0}dii.c cutafter bpath dii;
+drawarrow ndb.a.c{right}..nk.c cutafter bpath nk;
+drawarrow ndb.b.c{right}..dk.c cutafter bpath dk;
+
+x.ptr = xpart aa.c;
+y.ptr = ypart ndc.a.ne;
+drawarrow subpath (0,.7) of (z.ptr..{left}ndc.c.c) dashed evenly;
+label.rt(btex ndblock etex, z.ptr);
+endfig;
+
+
+
+
+beginfig(8)
+interim circmargin := .07in;
+fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
+circleit(currentpicture);
+dx = dy;
+clearit; drawboxed();
+forsuffixes $=n,c: makelabel.top(str $, $); endfor
+makelabel.bot("s",s);
+makelabel.rt("e", e);
+makelabel.lft("w", w);
+pickup pencircle scaled .3bp;
+vardef larrow@#(expr a, da, s) =
+ drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
+larrow.rt(n, (0,-dy), "dy");
+larrow.rt(s, (0,dy), "dy");
+larrow.top(e, (-dx,0), "dx");
+larrow.top(w, (dx,0), "dx");
+endfig;
+
+
+
+
+beginfig(9);
+vardef cuta(suffix a,b) expr p =
+ drawarrow p cutbefore bpath.a cutafter bpath.b;
+ point .5*length p of p
+enddef;
+
+vardef self@# expr p =
+ cuta(@#,@#) @#.c{curl0}..@#.c+p..{curl0}@#.c enddef;
+
+verbatimtex \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
+circleit.aa("Start"); aa.dx=aa.dy;
+circleit.bb(btex \stk B{(a|b)^*a} etex);
+circleit.cc(btex \stk C{b^*} etex);
+circleit.dd(btex \stk D{(a|b)^*ab} etex);
+circleit.ee("Stop"); ee.dx=ee.dy;
+
+numeric hsep;
+bb.c-aa.c = dd.c-bb.c = ee.c-dd.c = (hsep,0);
+cc.c-bb.c = (0,.8hsep);
+xpart(ee.e - aa.w) = 3.8in;
+drawboxed(aa,bb,cc,dd,ee);
+
+label.ulft(btex$b$etex, cuta(aa,cc) aa.c{dir50}..cc.c);
+label.top(btex$b$etex, self.cc(0,30pt));
+label.rt(btex$a$etex, cuta(cc,bb) cc.c..bb.c);
+label.top(btex$a$etex, cuta(aa,bb) aa.c..bb.c);
+label.llft(btex$a$etex, self.bb(-20pt,-35pt));
+label.top(btex$b$etex, cuta(bb,dd) bb.c..dd.c);
+label.top(btex$b$etex, cuta(dd,ee) dd.c..ee.c);
+label.lrt(btex$a$etex, cuta(dd,bb) dd.c..{dir140}bb.c);
+label.bot(btex$a$etex, cuta(ee,bb) ee.c..tension1.3 ..{dir115}bb.c);
+label.urt(btex$b$etex, cuta(ee,cc) ee.c{(cc.c-ee.c)rotated-15}..cc.c);
+endfig;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/base/source/figs.mp b/Master/texmf-dist/doc/metapost/base/source/figs.mp
new file mode 100644
index 00000000000..67c86a098d1
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/figs.mp
@@ -0,0 +1,22 @@
+input boxes
+beginfig(1);
+pair shadowshift; shadowshift=(1,-1)*bp;
+
+def drawshadowed(text t) =
+ forsuffixes $=t:
+ fill bpath$ shifted shadowshift;
+ unfill bpath$;
+ drawboxed($);
+ endfor
+enddef;
+
+boxit.a(btex \s8A\s+2 \(lh a etex);
+circleit.b(btex $e sup {i omega t}$ etex rotated 20);
+b.w - a.e = (10,0)*bp;
+drawshadowed(a,b);
+draw a.e..b.w;
+
+draw bbox currentpicture dashed evenly;
+endfig;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/base/source/grdemo.ms b/Master/texmf-dist/doc/metapost/base/source/grdemo.ms
new file mode 100644
index 00000000000..fbcbfaceff4
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/grdemo.ms
@@ -0,0 +1,124 @@
+.nr PS 11
+.nr VS 13
+.TL
+MetaPost with groff
+.LP
+Since MetaPost is a picture-drawing language that outputs PostScript,
+it is necessary to use the
+.ft CW
+-mpspic
+.ft
+macro package, which is automatically included when \fIgroff\fR
+is invoked with the
+.ft CW
+-Tps
+.ft
+option to prepare output for PostScript printers or previewers.
+.PP
+Suppose you have written some figures in MetaPost and placed
+the input in a file \f(CWfigures.mp\fR.
+Running
+.nf
+.ft CW
+ mp -T figures
+.ft
+.fi
+to invoke the MetaPost interpreter produces output files
+\f(CWfigures.1\fR, \f(CWfigures.2\fR, .\|.\|.
+which can be included in a \fIgroff\fR document via macro calls
+such as
+.nf
+.ft CW
+ .PSPIC figures.1 width height
+.ft
+.fi
+as explained in the \fIgrops\fR(1) documentation.
+Note that the picture gets rescaled if the height and width
+in the \f(CW.PSPIC\fR command don't match \fImp\fR's idea of
+the picture dimensions.
+.PP
+For instance,
+.PSPIC figs.1 1.5i 1.08i
+this figure was derived from a file
+.ft CW
+figs.mp
+.ft
+and included at this point by invoking the \f(CW.PSPIC\fR macro
+with height 1.08 inches and width 1.5 inches.
+.PP
+The file
+.ft CW
+figs.mp
+.ft
+looks like this:
+.nf
+.ft CW
+.nr PS 9
+.nr VS 11
+prologues:=1;
+input boxes
+beginfig(1);
+pair shadowshift; shadowshift=(1,-1)*bp;
+
+def drawshadowed(text t) =
+ forsuffixes $=t:
+ fill bpath$ shifted shadowshift;
+ unfill bpath$;
+ drawboxed($);
+ endfor
+enddef;
+
+boxit.a(btex \\s8A\\s+2 \\(lh a etex);
+circleit.b(btex $e sup {i omega t}$ etex rotated 20);
+b.w - a.e = (10bp,0);
+drawshadowed(a,b);
+draw a.e..b.w;
+
+draw bbox currentpicture dashed evenly;
+endfig;
+.nr PS 11
+.nr VS 13
+.ft
+.fi
+.PP
+Note that the typesetting commands in the
+\f(CWbtex\fR.\|.\|.\f(CWetex\fR blocks in the above example
+are processed by
+.nf
+.ft CW
+ eqn -d\\$\\$ | troff -Tpost
+.ft
+.fi
+If a different \fItroff\fR pipeline is desired, it can be specified
+via the
+.ft CW
+TROFF
+.ft
+environment variable. For example,
+.nf
+.ft CW
+ TROFF='tbl | eqn -d\\$\\$ | troff -Tpost'
+.ft
+.fi
+adds \fItbl\fR to the pipeline in addition to \fIeqn\fR.
+.PP
+Macro definitions and such can be added via the standard
+\f(CWverbatimtex\fR.\|.\|.\f(CWetex\fR mechanism that adds the
+given material to the \fItroff\fR input. Such material should
+not generate any output since this would get mixed up with the
+next \f(CWbtex\fR.\|.\|.\f(CWetex\fR block. Thus, newlines between
+\f(CWverbatimtex\fR and \f(CWetex\fR must be protected with \f(CW\\\fR.
+.PP
+Unfortunately, typesetting of \f(CWbtex\fR.\|.\|.\f(CWetex\fR blocks
+currently doesn't work with \fIgroff\fR and equires a UNIX
+\fItroff\fR implementation, because MetaPost's \f(CWdmp\fR
+post-processor can't handle \fIgroff\fR's extended font and output
+file formats documented in \fIgroff_font\fR(5) and \fIgroff_out\fR(5).
+Nevertheless, using \fItroff\fR to prepare figures with MetaPost
+and \fIgroff\fR to typeset them may still be a useful combination
+if your \fItroff\fR implementation doesn't provide the
+.ft CW
+-mpictures
+.ft
+macro packages.
+
diff --git a/Master/texmf-dist/doc/metapost/base/source/lead.d b/Master/texmf-dist/doc/metapost/base/source/lead.d
new file mode 100644
index 00000000000..8e95355af1c
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/lead.d
@@ -0,0 +1,24 @@
+80 70.6
+81 56.4
+82 54.4
+83 46.4
+84 40.1
+85 20.1
+86 8.4
+87 8.0
+88 7.6
+89 7.2
+90 7.1
+
+82 .484
+83 .413
+84 .381
+85 .258
+86 .151
+87 .108
+88 .087
+89 .074
+90 .070
+
+First: National lead emissions in thousands of metric tons
+Second: Average lead level in micrograms per cubic meter of air \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/manfig.mp b/Master/texmf-dist/doc/metapost/base/source/manfig.mp
new file mode 100644
index 00000000000..e024f62ffb5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/manfig.mp
@@ -0,0 +1,859 @@
+%% This is for the MathTime version that uses PostScript outline fonts
+%% ----------------------------------------------------------------
+%verbatimtex \documentstyle[times]{article}
+% \begin{document}
+%etex
+%defaultfont := "rptmr";
+%% ----------------------------------------------------------------
+
+beginfig(0);
+draw (20,20)--(0,0)--(0,30)--(30,0)--(0,0);
+endfig;
+
+
+beginfig(2); numeric u;
+u=1cm;
+draw (2u,2u)--(0,0)--(0,3u)--(3u,0)--(0,0);
+pickup pencircle scaled 4pt;
+for i=0 upto 2:
+ for j=0 upto 2:
+ draw (i*u,j*u);
+ endfor
+endfor
+endfig;
+
+
+beginfig(3);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1..z2..z3..z4;
+dotlabels.top(0,2,4);
+dotlabels.lft(3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(104);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1..z2..z3..z4..cycle;
+dotlabels.top(2,4);
+dotlabels.lft(0,3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(204);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1..z2..z3--z4--cycle;
+dotlabels.top(2,4);
+dotlabels.lft(0,3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(5);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+path p; p = z0..z1..z2..z3..z4;
+draw p;
+for t=0 upto 3:
+ draw point t of p--postcontrol t of p
+ --precontrol t+1 of p--point t+1 of p
+ dashed (evenly scaled .5);
+endfor
+dotlabels.top(0,2,4);
+dotlabels.lft(3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(6);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1{up}..z2{left}..z3..z4;
+dotlabels.top(0,2,4);
+dotlabels.lft(3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(7)
+for a=0 upto 9:
+ draw (0,0){dir 45}..{dir -10a}(6cm,0);
+endfor
+endfig;
+
+beginfig(8)
+for a=0 upto 7:
+ draw (0,0){dir 45}..{dir 10a}(6cm,0);
+endfor
+endfig;
+
+
+beginfig(109);
+z2=-z0=(1in,0); z1=(0,.2in);
+draw z0{up}..z1{right}..z2{down};
+dotlabels.bot(0,1,2);
+endfig;
+
+
+beginfig(209);
+z2=-z0=(1in,0); z1=(0,.2in);
+draw z0{up}...z1{right}...z2{down};
+dotlabels.bot(0,1,2);
+endfig;
+
+
+beginfig(110);
+numeric u; 10u=1.5in;
+-z0=z3=(5u,0);
+(-x1,y1)=z2=(3u,2u);
+draw z0..z1..z2..z3;
+dotlabels.bot(0,1,2,3);
+endfig;
+
+
+beginfig(210);
+numeric u; 10u=1.5in;
+-z0=z3=(5u,0);
+(-x1,y1)=z2=(3u,2u);
+draw z0..z1..tension 1.3..z2..z3;
+dotlabels.bot(0,1,2,3);
+endfig;
+
+
+beginfig(310);
+numeric u; 10u=1.5in;
+-z0=z3=(5u,0);
+(-x1,y1)=z2=(3u,2u);
+draw z0..z1..tension 1.5 and 1..z2..z3;
+dotlabels.bot(0,1,2,3);
+endfig;
+
+
+beginfig(111);
+numeric u, c; 10u=1.4in; c=0;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(211);
+numeric u, c; 10u=1.4in; c=1;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(311);
+numeric u, c; 10u=1.4in; c=2;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(411);
+numeric u, c; 10u=1.4in; c=infinity;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(13);
+z1=-z2=(.2in,0);
+x3=-x6=.3in;
+x3+y3=x6+y6=1.1in;
+z4=1/3[z3,z6];
+z5=2/3[z3,z6];
+z20=whatever[z1,z3]=whatever[z2,z4];
+z30=whatever[z1,z4]=whatever[z2,z5];
+z40=whatever[z1,z5]=whatever[z2,z6];
+draw z1--z20--z2--z30--z1--z40--z2;
+pickup pencircle scaled 1pt;
+draw z1--z2;
+draw z3--z6;
+%
+dotlabels.bot(1,2);
+dotlabels.rt(3);
+dotlabels.lft(6);
+dotlabels.top(20,30,40);
+endfig;
+
+
+vardef llet(expr c) =
+ c infont defaultfont scaled magstep3
+enddef;
+
+primarydef p centered h =
+ (p shifted (h - xpart .5[llcorner p,lrcorner p], 0))
+enddef;
+
+beginfig(14);
+string s; s = "abcde";
+numeric u,n, ytop, ybot;
+n = 5;
+ytop = 3bp + ypart urcorner llet(s);
+ybot = -3bp + ypart llcorner llet(s);
+ytop - ybot = u;
+draw (n*u,ybot)--(0,ybot)--(0,ytop)--(n*u,ytop);
+for i=1 upto n:
+ draw (i*u,ybot)..(i*u,ytop);
+ draw llet(substring (i-1,i) of s) centered ((i-.5)*u);
+ label.bot(decimal i, (i*u,ybot));
+endfor
+picture llab; llab = btex \llap{$x={}$}0 etex;
+z0 = urcorner llab;
+draw llab shifted (-.5*x0, ybot-labeloffset-y0);
+endfig;
+
+
+beginfig(17);
+a=.7in; b=.5in;
+z0=(0,0);
+z1=-z3=(a,0);
+z2=-z4=(0,b);
+draw z1..z2..z3..z4..cycle;
+draw z1--z0--z2;
+label.top("a", .5[z0,z1]);
+label.lft("b", .5[z0,z2]);
+dotlabel.bot("(0,0)", z0);
+endfig;
+
+
+beginfig(18);
+numeric u;
+u = 1cm;
+draw (0,2u)--(0,0)--(4u,0);
+pickup pencircle scaled 1pt;
+draw (0,0){up}
+ for i=1 upto 8: ..(i/2,sqrt(i/2))*u endfor;
+label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u);
+label.bot(btex $x$ etex, (2u,0));
+label.lft(btex $y$ etex, (0,u));
+endfig;
+
+
+beginfig(19);
+numeric ux, uy;
+120ux=1.2in; 4uy=2.4in;
+draw (0,4uy)--(0,0)--(120ux,0);
+pickup pencircle scaled 1pt;
+draw (0,uy){right}
+ for ix=1 upto 8:
+ ..(15ix*ux, uy*2/(1+cosd 15ix))
+ endfor;
+label.bot(btex $x$ axis etex, (60ux,0));
+label.lft(btex $y$ axis etex rotated 90,
+ (0,2uy));
+label.lft(
+ btex $\displaystyle y={2\over1+\cos x}$ etex,
+ (120ux, 4uy));
+endfig;
+
+
+beginfig(20);
+picture p;
+p = "testing" infont "rptmr" scaled 7;
+draw p;
+draw llcorner p--lrcorner p--urcorner p--ulcorner p--cycle;
+dotlabel.lft(btex \tt llcorner etex, llcorner p);
+dotlabel.rt(btex \tt lrcorner etex, lrcorner p);
+dotlabel.lft(btex \tt ulcorner etex, ulcorner p);
+dotlabel.rt(btex \tt urcorner etex, urcorner p);
+endfig;
+
+
+beginfig(21);
+path p;
+p = (-1cm,0)..(0,-1cm)..(1cm,0);
+fill p{up}..(0,0){-1,-2}..{up}cycle;
+draw p..(0,1cm)..cycle;
+endfig;
+
+
+beginfig(22);
+path a, b, aa, ab;
+a = fullcircle scaled 2cm;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+ab = buildcycle(aa, b);
+picture pa, pb;
+pa = thelabel(btex $A$ etex, (0,-.5cm));
+pb = thelabel(btex $B$ etex, (0,1.5cm));
+fill a withcolor .7white;
+fill b withcolor .7white;
+fill ab withcolor .4white;
+unfill bbox pa;
+draw pa;
+unfill bbox pb;
+draw pb;
+label.lft(btex $U$ etex, (-1cm,.5cm));
+draw bbox currentpicture;
+endfig;
+
+
+beginfig(123);
+path aa, b;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+draw aa;
+draw b dashed evenly;
+z1 = aa intersectionpoint reverse b;
+z2 = reverse aa intersectionpoint b;
+dotlabel.rt(btex 1 etex, z1);
+dotlabel.lft(btex 2 etex, z2);
+label.bot(btex \tt aa etex, point 0 of aa);
+label.bot(btex \tt b etex, point 2 of b);
+endfig;
+
+beginfig(223);
+path aa, b;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+numeric t[], tt[];
+(t1,8-tt1) = aa intersectiontimes reverse b;
+(4-t2,tt2) = reverse aa intersectiontimes b;
+pickup(pencircle scaled .3);
+draw aa;
+draw b;
+pickup(pencircle scaled .8);
+draw subpath (t1,t2) of aa;
+draw subpath (tt2,tt1) of b;
+dotlabel.rt(btex 1 etex, point t1 of aa);
+dotlabel.lft(btex 2 etex, point t2 of aa);
+label.bot(btex \tt aa etex, point 0 of aa);
+label.bot(btex \tt b etex, point 2 of b);
+endfig;
+
+
+beginfig(24);
+h=2in; w=2.7in;
+path p[], q[], pp;
+for i=2 upto 4: ii:=i**2;
+ p[i] = (w/ii,h){1,-ii}...(w/i,h/i)...(w,h/ii){ii,-1};
+endfor
+q0.5 = (0,0)--(w,0.5h);
+q1.5 = (0,0)--(w/1.5,h);
+pp = buildcycle(q0.5, p2, q1.5, p4);
+fill pp withcolor .7white;
+z0=center pp;
+picture lab; lab=thelabel(btex $f>0$ etex, z0);
+unfill bbox lab; draw lab;
+draw q0.5; draw p2; draw q1.5; draw p4;
+dotlabel.top(btex $P$ etex, p2 intersectionpoint q0.5);
+dotlabel.rt(btex $Q$ etex, p2 intersectionpoint q1.5);
+dotlabel.lft(btex $R$ etex, p4 intersectionpoint q1.5);
+dotlabel.bot(btex $S$ etex, p4 intersectionpoint q0.5);
+endfig;
+
+
+beginfig(25);
+numeric u;
+u = .2in;
+path a, b;
+a = (0,0){up}..(4u,0)..(8u,0)..(8u,4u);
+b = (10u,3u)..(5u,u)..(-u,u);
+numeric t; t=0;
+forsuffixes $=bot, llft, lrt, lft:
+ dotlabel$(decimal t, point t of a);
+ t:=t+1;
+endfor
+for i=0 upto 2:
+ dotlabel.top(decimal i, point i of b);
+endfor
+pickup(pencircle scaled .3);
+draw a;
+pickup(pencircle scaled .8);
+draw b;
+% intersections (atime, btime):
+% (0.2501,1.77225)
+% (2.58316,0.23619)
+% (0.75288,1.40094)
+endfig;
+
+
+beginfig(26);
+numeric scf, #, t[];
+3.2scf = 2.4in;
+path fun;
+# = .1; % Keep the function single-valued
+fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#))
+ yscaled(1/#) scaled scf;
+x1 = 2.5scf;
+for i=1 upto 2:
+ (t[i],whatever) =
+ fun intersectiontimes ((x[i],-infinity)--(x[i],infinity));
+ z[i] = point t[i] of fun;
+ z[i]-(x[i+1],0) = whatever*direction t[i] of fun;
+ draw (x[i],0)--z[i]--(x[i+1],0);
+ fill fullcircle scaled 3bp shifted z[i];
+endfor
+label.bot(btex $x_1$ etex, (x1,0));
+label.bot(btex $x_2$ etex, (x2,0));
+label.bot(btex $x_3$ etex, (x3,0));
+draw (0,0)--(3.2scf,0);
+pickup pencircle scaled 1pt;
+draw fun;
+endfig;
+
+
+beginfig(28);
+path p[];
+p1 = fullcircle scaled .6in;
+z1=(.75in,0)=-z3;
+z2=directionpoint left of p1=-z4;
+p2 = z1..z2..{curl1}z3..z4..{curl 1}cycle;
+fill p2 withcolor .4[white,black];
+unfill p1;
+draw p1;
+transform T;
+z1 transformed T = z2;
+z3 transformed T = z4;
+xxpart T=yypart T; yxpart T=-xypart T;
+picture pic;
+pic = currentpicture;
+for i=1 upto 2:
+ pic:=pic transformed T;
+ draw pic;
+endfor
+dotlabels.top(1,2,3); dotlabels.bot(4);
+endfig;
+
+
+beginfig(29);
+if unknown withdots: % So this works w/o MetaPost version 0.5
+ picture withdots; withdots=dashpattern(off 2.5 on 0 off 2.5);
+fi
+z0 = (0,0);
+z1 = (2in-2bp,0);
+for i=1 upto 4:
+ z[2i]-z[2i-2] = z[2i+1]-z[2i-1] = (0,14pt);
+endfor
+draw z0..z1 dashed evenly;
+label.rt(btex \tt dashed evenly etex, z1);
+draw z2..z3 dashed evenly scaled 2;
+label.rt(btex \tt dashed evenly scaled 2 etex, z3);
+draw z4..z5 dashed evenly scaled 4;
+label.rt(btex \tt dashed evenly scaled 4 etex, z5);
+draw z6..z7 dashed withdots;
+label.rt(btex \tt dashed withdots etex, z7);
+draw z8..z9 dashed withdots scaled 2;
+label.rt(btex \tt dashed withdots scaled 2 etex, z9);
+endfig;
+
+
+beginfig(30);
+picture e[]; e4=evenly scaled 4;
+z0 = (0,0);
+z1 = (2in,0);
+for i=1 upto 3:
+ z[2i]-z[2i-2] = z[2i+1]-z[2i-1] = (0,14pt);
+endfor
+dotlabels.lft(0,2,4,6);
+draw z0..z1 dashed e4;
+dotlabel.rt(btex 1 \tt\ draw z0..z1 dashed e4 etex, z1);
+draw z2..z3 dashed e4 shifted (6bp,0);
+dotlabel.rt(btex 3 \tt\ draw z2..z3 dashed e4 shifted (6bp,0) etex, z3);
+draw z4..z5 dashed e4 shifted (12bp,0);
+dotlabel.rt(btex 5 \tt\ draw z4..z5 dashed e4 shifted (12bp,0) etex, z5);
+draw z6..z7 dashed e4 shifted (18bp,0);
+dotlabel.rt(btex 7 \tt\ draw z6..z7 dashed e4 shifted (18bp,0) etex, z7);
+endfig;
+
+
+beginfig(31);
+picture d; d = dashpattern(on 6bp off 12bp on 6bp);
+draw d;
+endfig;
+
+
+beginfig(32);
+draw dashpattern(on 15bp off 15bp) dashed evenly;
+picture p;
+p=currentpicture;
+currentpicture:=nullpicture;
+draw fullcircle scaled 1cm xscaled 3 dashed p;
+endfig;
+
+
+beginfig(33);
+for i=0 upto 2:
+ z[i]=(0,-40i); z[i+3]-z[i]=(100,30);
+endfor
+pickup pencircle scaled 18;
+draw z0..z3 withcolor .8white;
+linecap:=butt;
+draw z1..z4 withcolor .8white;
+linecap:=squared;
+draw z2..z5 withcolor .8white;
+dotlabels.top(0,1,2,3,4,5);
+endfig; linecap:=rounded;
+
+
+beginfig(34);
+for i=0 upto 2:
+ z[i]=(0,-50i); z[i+3]-z[i]=(60,40);
+ z[i+6]-z[i]=(120,0);
+endfor
+pickup pencircle scaled 24;
+draw z0--z3--z6 withcolor .8white;
+linejoin:=mitered;
+draw z1..z4--z7 withcolor .8white;
+linejoin:=beveled;
+draw z2..z5--z8 withcolor .8white;
+dotlabels.bot(0,1,2,3,4,5,6,7,8);
+endfig; linejoin:=rounded;
+
+
+beginfig(35);
+z2a=(0,0);
+(-x1a,y1a) = -z3a = .5in*unitvector(6,1);
+z1b - z1a = .75*z1a rotated -90;
+z2b - z1b = whatever*(z2a-z1a);
+z3b - z2b = whatever*(z3a-z2a);
+y2b = 0;
+z3b - z3a = whatever*(z3a rotated 90);
+z0b-z1b = z0a-z1a = z1a;
+x4a=x2a; x4b=x2b;
+y4a = y4b = 1.3*y3b;
+fill z1a--z2a--z3a--z3b--z2b--z1b--cycle withcolor .8 white;
+for p= z2a--z4a, z2b--z4b, z0a--z1a, z0b--z1b:
+ draw p dashed evenly;
+endfor
+drawdblarrow z4a--z4b;
+drawdblarrow z0a--z0b;
+label.bot(btex miter length etex, .5[z4a,z4b]);
+label.ulft(btex line width etex, .5[z0a,z0b]);
+endfig;
+
+
+beginfig(36);
+z[-1]=(0,0); z0=(1in,0);
+for i=1 upto 6:
+ z[i]-z[i-2] = (0,-15pt);
+ if x[i]=0: label.lft(decimal i, z[i]);
+ fi
+endfor
+drawarrow z1..z2;
+drawarrow reverse(z3..z4);
+drawdblarrow z5..z6;
+label.rt(btex 2 \tt\ drawarrow z1..z2 etex, z2);
+label.rt(btex 4 \tt\ drawarrow reverse(z3..z4) etex, z4);
+label.rt(btex 6 \tt\ drawdblarrow z5..z6 etex, z6);
+endfig;
+
+
+beginfig(37);
+path p, q, r;
+ahlength := 1.5cm;
+pickup pencircle scaled .2cm;
+p = (0,0)..{right}(2.5cm,2cm);
+q = counterclockwise arrowhead p;
+z0 = directionpoint up of q;
+z.a = directionpoint right of q;
+z.b = directionpoint (-1,-1) of q;
+drawarrow p withcolor .4white;
+pickup defaultpen;
+undraw p;
+undraw q;
+ahlength:=4bp;
+z.a1-z0 = .3cm*unitvector(z.a-z0) rotated 90;
+z.a1-z.a2 = z0-z.a;
+z.b1-z0 = .3cm*unitvector(z.b-z0) rotated -90;
+z.b1-z.b2 = z0-z.b;
+z.ab = whatever[z.a1,z.a2] = whatever[z.b1,z.b2];
+z.a0-z.ab = .4cm*unitvector(z.a1-z.a2);
+z.b0-z.ab = .4cm*unitvector(z.b1-z.b2);
+drawdblarrow z.a1..z.a2;
+label.lrt(btex \tt ahlength etex, .9[z.a1,z.a2]);
+draw z.a1..z.a0 dashed evenly;
+drawdblarrow z.b1..z.b2;
+label.urt(btex \tt ahlength etex, .9[z.b1,z.b2]);
+draw z.b1..z.b0 dashed evenly;
+r = z.a0{(z.a2-z.a0) rotated 90}..{(z.b2-z.b0)rotated 90}z.b0;
+draw r;
+label.rt(btex \tt ahangle etex, point .5 of r);
+endfig;
+
+
+beginfig(38);
+pickup pencircle scaled .2in yscaled .08 rotated 30;
+x0=x3=x4;
+z1-z0 = .45in*dir 30;
+z2-z3 = whatever*(z1-z0);
+z6-z5 = whatever*(z1-z0);
+z1-z6 = 1.2*(z3-z0);
+rt x3 = lft x2;
+x5 = .55[x4,x6];
+y4 = y6;
+lft x3 = bot y5 = 0;
+top y2 = .9in;
+draw z0--z1--z2--z3--z4--z5--z6 withcolor .7white;
+dotlabels.top(0,1,2,3,4,5,6);
+endfig;
+
+
+beginfig(40);
+path p[];
+p1 = (0,0){curl 0}..(5pt,-3pt)..{curl 0}(10pt,0);
+p2 = p1..(p1 yscaled-1 shifted(10pt,0));
+p0 = p2;
+for i=1 upto 3: p0:=p0.. p2 shifted (i*20pt,0);
+ endfor
+for j=0 upto 8: draw p0 shifted (0,j*10pt);
+ endfor
+p3 = fullcircle shifted (.5,.5) scaled 72pt;
+clip currentpicture to p3;
+draw p3;
+endfig;
+
+
+marksize=4pt;
+angle_radius=8pt;
+
+def draw_mark(expr p, a) =
+ begingroup
+ save t, dm; pair dm;
+ t = arctime a of p;
+ dm = marksize*unitvector direction t of p
+ rotated 90;
+ draw (-.5dm.. .5dm) shifted point t of p;
+ endgroup
+enddef;
+
+def draw_marked(expr p, n) =
+ begingroup
+ save amid;
+ amid = .5*arclength p;
+ for i=-(n-1)/2 upto (n-1)/2:
+ draw_mark(p, amid+.6marksize*i);
+ endfor
+ draw p;
+ endgroup
+enddef;
+
+def mark_angle(expr a, b, c, n) =
+ begingroup
+ save s, p; path p;
+ p = unitvector(a-b){(a-b)rotated 90}..unitvector(c-b);
+ s = .9marksize/length(point 1 of p - point 0 of p);
+ if s<angle_radius: s:=angle_radius; fi
+ draw_marked(p scaled s shifted b, n);
+ endgroup
+enddef;
+
+def mark_rt_angle(expr a, b, c) =
+ draw ((1,0)--(1,1)--(0,1))
+ zscaled (angle_radius*unitvector(a-b)) shifted b
+enddef;
+
+beginfig(42);
+pair a,b,c,d;
+b=(0,0); c=(1.5in,0); a=(0,.6in);
+d-c = (a-b) rotated 25;
+dotlabel.lft("a",a);
+dotlabel.lft("b",b);
+dotlabel.bot("c",c);
+dotlabel.llft("d",d);
+z0=.5[a,d];
+z1=.5[b,c];
+(z.p-z0) dotprod (d-a) = 0;
+(z.p-z1) dotprod (c-b) = 0;
+draw a--d;
+draw b--c;
+draw z0--z.p--z1;
+draw_marked(a--b, 1);
+draw_marked(c--d, 1);
+draw_marked(a--z.p, 2);
+draw_marked(d--z.p, 2);
+draw_marked(b--z.p, 3);
+draw_marked(c--z.p, 3);
+mark_angle(z.p, b, a, 1);
+mark_angle(z.p, c, d, 1);
+mark_angle(z.p, c, b, 2);
+mark_angle(c, b, z.p, 2);
+mark_rt_angle(z.p, z0, a);
+mark_rt_angle(z.p, z1, b);
+endfig;
+
+
+def getmid(suffix p) =
+ pair p.mid[], p.off[], p.dir[];
+ for i=0 upto 36:
+ p.dir[i] = dir(5*i);
+ p.mid[i]+p.off[i] = directionpoint p.dir[i] of p;
+ p.mid[i]-p.off[i] = directionpoint -p.dir[i] of p;
+ endfor
+enddef;
+
+def joinup(suffix pt, d)(expr n) =
+ begingroup
+ save res, g; path res;
+ res = pt[0]{d[0]};
+ for i=1 upto n:
+ g:= if (pt[i]-pt[i-1]) dotprod d[i] <0: - fi 1;
+ res := res{g*d[i-1]}...{g*d[i]}pt[i];
+ endfor
+ res
+ endgroup
+enddef;
+
+beginfig(45)
+path p, q;
+p = ((5,2)...(3,4)...(1,3)...(-2,-3)...(0,-5)...(3,-4)
+ ...(5,-3)...cycle) scaled .3cm shifted (0,5cm);
+getmid(p);
+draw p;
+draw joinup(p.mid, p.dir, 36)..cycle;
+q = joinup(p.off, p.dir, 36);
+draw q..(q rotated 180)..cycle;
+drawoptions(dashed evenly);
+for i=0 upto 3:
+ draw p.mid[9i]-p.off[9i]..p.mid[9i]+p.off[9i];
+ draw -p.off[9i]..p.off[9i];
+endfor
+endfig;
+
+
+input boxes
+
+
+\beginfig(48);
+fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
+boxit(currentpicture);
+dx = dy = .25in;
+clearit; drawboxed();
+forsuffixes $=n,c: makelabel.top(str $, $); endfor
+makelabel.bot("s",s);
+forsuffixes $=ne,e,se: makelabel.rt(str $, $); endfor
+forsuffixes $=nw,w,sw: makelabel.lft(str $, $); endfor
+pickup pencircle scaled .3bp;
+vardef larrow@#(expr a, da, s) =
+ drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
+larrow.rt(n, (0,-dy), "dy");
+larrow.rt(s, (0,dy), "dy");
+larrow.top(e, (-dx,0), "dx");
+larrow.top(w, (dx,0), "dx");
+endfig;
+
+
+beginfig(49);
+boxjoin(a.se=b.sw; a.ne=b.nw);
+boxit.a(btex\strut$\cdots$ etex); boxit.ni(btex\strut$n_i$ etex);
+boxit.di(btex\strut$d_i$ etex); boxit.ni1(btex\strut$n_{i+1}$ etex);
+boxit.di1(btex\strut$d_{i+1}$ etex); boxit.aa(btex\strut$\cdots$ etex);
+boxit.nk(btex\strut$n_k$ etex); boxit.dk(btex\strut$d_k$ etex);
+drawboxed(di,a,ni,ni1,di1,aa,nk,dk); label.lft("ndtable:", a.w);
+interim defaultdy:=7bp;
+boxjoin(a.sw=b.nw; a.se=b.ne);
+boxit.ba(); boxit.bb(); boxit.bc();
+boxit.bd(btex $\vdots$ etex); boxit.be(); boxit.bf();
+bd.dx=8bp; ba.ne=a.sw-(15bp,10bp);
+drawboxed(ba,bb,bc,bd,be,bf); label.lft("hashtab:",ba.w);
+vardef ndblock suffix $ =
+ boxjoin(a.sw=b.nw; a.se=b.ne);
+ forsuffixes $$=$1,$2,$3: boxit$$(); ($$dx,$$dy)=(5.5bp,4bp);
+ endfor; enddef;
+ndblock nda; ndblock ndb; ndblock ndc;
+nda1.c-bb.c = ndb1.c-nda3.c = (whatever,0);
+xpart ndb3.se = xpart ndc1.ne = xpart di.c;
+ndc1.c - be.c = (whatever,0);
+drawboxed(nda1,nda2,nda3, ndb1,ndb2,ndb3, ndc1,ndc2,ndc3);
+drawarrow bb.c -- nda1.w;
+drawarrow be.c -- ndc1.w;
+drawarrow nda3.c -- ndb1.w;
+drawarrow nda1.c{right}..{curl0}ni.c cutafter bpath ni;
+drawarrow nda2.c{right}..{curl0}di.c cutafter bpath di;
+drawarrow ndc1.c{right}..{curl0}ni1.c cutafter bpath ni1;
+drawarrow ndc2.c{right}..{curl0}di1.c cutafter bpath di1;
+drawarrow ndb1.c{right}..nk.c cutafter bpath nk;
+drawarrow ndb2.c{right}..dk.c cutafter bpath dk;
+x.ptr=xpart aa.c; y.ptr=ypart ndc1.ne;
+drawarrow subpath (0,.7) of (z.ptr..{left}ndc3.c) dashed evenly;
+label.rt(btex \strut ndblock etex, z.ptr); endfig;
+
+
+\beginfig(50)
+interim circmargin := .07in;
+fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
+circleit(currentpicture);
+dx = dy;
+clearit; drawboxed();
+forsuffixes $=n,c: makelabel.top(str $, $); endfor
+makelabel.bot("s",s);
+makelabel.rt("e", e);
+makelabel.lft("w", w);
+pickup pencircle scaled .3bp;
+vardef larrow@#(expr a, da, s) =
+ drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
+larrow.rt(n, (0,-dy), "dy");
+larrow.rt(s, (0,dy), "dy");
+larrow.top(e, (-dx,0), "dx");
+larrow.top(w, (dx,0), "dx");
+endfig;
+
+
+
+vardef drawshadowed(text t) =
+ fixsize(t);
+ forsuffixes s=t:
+ fill bpath.s shifted (1pt,-1pt);
+ unfill bpath.s;
+ drawboxed(s);
+ endfor
+enddef;
+
+beginfig(51)
+circleit.a(btex Box 1 etex);
+circleit.b(btex Box 2 etex);
+b.n = a.s - (0,20pt);
+drawshadowed(a,b);
+drawarrow a.s -- b.n;
+endfig;
+
+
+vardef cuta(suffix a,b) expr p =
+ drawarrow p cutbefore bpath.a cutafter bpath.b;
+ point .5*length p of p
+enddef;
+
+vardef self@# expr p =
+ cuta(@#,@#) @#.c{curl0}..@#.c+p..{curl0}@#.c enddef;
+
+beginfig(52);
+verbatimtex \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
+circleit.aa(btex\strut Start etex); aa.dx=aa.dy;
+circleit.bb(btex \stk B{(a|b)^*a} etex);
+circleit.cc(btex \stk C{b^*} etex);
+circleit.dd(btex \stk D{(a|b)^*ab} etex);
+circleit.ee(btex\strut Stop etex); ee.dx=ee.dy;
+numeric hsep;
+bb.c-aa.c = dd.c-bb.c = ee.c-dd.c = (hsep,0);
+cc.c-bb.c = (0,.8hsep);
+xpart(ee.e - aa.w) = 3.8in;
+drawboxed(aa,bb,cc,dd,ee);
+label.ulft(btex$b$etex, cuta(aa,cc) aa.c{dir50}..cc.c);
+label.top(btex$b$etex, self.cc(0,30pt));
+label.rt(btex$a$etex, cuta(cc,bb) cc.c..bb.c);
+label.top(btex$a$etex, cuta(aa,bb) aa.c..bb.c);
+label.llft(btex$a$etex, self.bb(-20pt,-35pt));
+label.top(btex$b$etex, cuta(bb,dd) bb.c..dd.c);
+label.top(btex$b$etex, cuta(dd,ee) dd.c..ee.c);
+label.lrt(btex$a$etex, cuta(dd,bb) dd.c..{dir140}bb.c);
+label.bot(btex$a$etex, cuta(ee,bb) ee.c..tension1.3 ..{dir115}bb.c);
+label.urt(btex$b$etex, cuta(ee,cc) ee.c{(cc.c-ee.c)rotated-15}..cc.c);
+endfig;
+
+
+end \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/matmul.d b/Master/texmf-dist/doc/metapost/base/source/matmul.d
new file mode 100644
index 00000000000..c0e781d4a51
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/matmul.d
@@ -0,0 +1,21 @@
+20 .007861 ordinary MM: size, seconds
+30 .022051
+40 .050391
+60 .15922
+80 .4031
+120 1.53
+160 3.915
+240 18.55
+320 78.28
+480 279.24
+
+20 .006611 Strassen: size, seconds
+30 .020820
+40 .049219
+60 .163281
+80 .3975
+120 1.3125
+160 3.04
+240 9.95
+320 22.17
+480 72.60 \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/mpgraph.bib b/Master/texmf-dist/doc/metapost/base/source/mpgraph.bib
new file mode 100644
index 00000000000..b95ad5af223
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/mpgraph.bib
@@ -0,0 +1,96 @@
+@string{jcompstatg = {Journal of Computational and Statistical Graphics}}
+
+@incollection{BenKer90,
+ author = "Jon L. Bentley and Brian W. Kernighan",
+ title = "Grap---A language for Typesetting Graphs",
+ booktitle = "Unix Research System Papers",
+ publisher = "{AT\&T} Bell Laboratories",
+ address = "Murray Hill, New Jersey",
+ edition = "Tenth",
+ volume = "{II}",
+ pages = "109--146",
+ year = 1990
+}
+@book{Cleve85,
+ author = "William S. Cleveland",
+ title = "The Elements of Graphing Data",
+ publisher = "Hobart Press",
+ address = "Summit, New Jersey",
+ year = 1985
+}
+@book{Cleve93,
+ author = "Cleveland, William S.",
+ title = "Visualizing Data",
+ publisher = "Hobart Press",
+ address = "Summit, New Jersey",
+ year= "to appear",
+}
+@book{Tufte83,
+ author = "Edward R. Tufte",
+ title = "Visual Display of Quantitative Information",
+ publisher = "Graphics Press",
+ address = "Box 430, Cheshire, Connecticut 06410",
+ year = 1983
+}
+@article{Cleve93a,
+ author = "Cleveland, William S.",
+ title = "A Model for Studying Display Methods of Statistical
+ Graphics (with discussion)",
+ journal = jcompstatg,
+ year = "to appear",
+ volume = 3
+}
+@book{Census92,
+ author = "U.S. Bureau of the Census",
+ title = "Statistical Abstracts of the United States: 1992",
+ edition = "112th",
+ address = "Washington, D.C.",
+ year = 1992
+}
+@book{LaTeXman,
+ author = "Leslie Lamport",
+ title = "{\LaTeX}: A Document Preparation System",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@book{ad:red,
+ author = "Adobe Systems Inc.",
+ title = "{P}ost{S}cript Language Reference Manual",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ edition = "second",
+ year = 1990
+}
+
+@inproceedings{ho:mp4,
+ author = "John D. Hobby",
+ title = "Introduction to {MetaPost}",
+ booktitle = "Euro{\TeX} '92 Proceedings",
+ month = sep,
+ year = 1992,
+ pages = "21--36"
+}
+[An updated version appeared in the April 1999 Issue of "Eutupon",
+ the news lettter for the Greek TeX friends group.
+]
+
+@techreport{ho:mp3,
+ title = "A User's manual for {MetaPost}",
+ author = "John D. Hobby",
+ institution = "AT\&T Bell Laboratories",
+ address = "Murray Hill, New Jersey",
+ type = "Computing Science Technical Report",
+ number = "no.~162",
+ note = {Available as http://cm.bell-labs.com/cs/cstr/162.ps.gz},
+ month = apr,
+ year = 1992
+}
+@book{kn:d,
+ author = "Donald E. Knuth",
+ note = "Volume D of {\it Computers and Typesetting}",
+ title = "{\MF} the Program",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/mpgraph.mp b/Master/texmf-dist/doc/metapost/base/source/mpgraph.mp
new file mode 100644
index 00000000000..1621f3a8605
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/mpgraph.mp
@@ -0,0 +1,129 @@
+input graph
+
+
+beginfig(1);
+draw begingraph(3in,2in);
+ gdraw "agepop91.d";
+ endgraph;
+endfig;
+
+
+beginfig(2);
+draw begingraph(3in,2in);
+ gdraw "agepop91.d" plot btex$\bullet$etex;
+ endgraph;
+endfig;
+
+
+beginfig(3);
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ gdraw "agepopm.d";
+ endgraph;
+endfig;
+
+
+beginfig(4);
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ setrange(origin, whatever,whatever);
+ gdraw "agepopm.d";
+ endgraph;
+endfig;
+
+
+beginfig(5);
+draw begingraph(2.3in,2in);
+ setcoords(log,log);
+ glabel.lft(btex Seconds etex,OUT);
+ glabel.bot(btex Matrix size etex,
+ OUT);
+ gdraw "matmul.d" dashed evenly;
+ glabel.ulft(btex Standard etex,8);
+ gdraw "matmul.d";
+ glabel.lrt(btex Strassen etex,7);
+ endgraph;
+endfig;
+
+
+beginfig(6);
+draw begingraph(6.5cm,4.5cm);
+ setrange(80,0, 90,whatever);
+ glabel.bot(btex Year etex, OUT);
+ glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
+ \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
+ gdraw "lead.d" withpen pencircle scaled 1.5pt;
+ autogrid(,otick.lft);
+ setcoords(linear,linear);
+ setrange(80,0, 90,whatever);
+ glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
+ \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
+ gdraw "lead.d";
+ autogrid(otick.bot,otick.rt);
+ endgraph;
+endfig;
+
+
+input sarith
+
+beginfig(7);
+vardef newy(expr y) = (256/75)*y + mlog y enddef;
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ path p;
+ gdata("timepop.d", $, augment.p($1, newy(Scvnum $2)); );
+ gdraw p;
+ for y=5,10,20,50,100,150,200,250:
+ grid.lft(format("%g",y), newy(y)) withcolor .85white;
+ endfor
+ autogrid(grid.bot,) withcolor .85white;
+ frame.llft;
+ endgraph;
+endfig;
+
+beginfig(8);
+defaultfont:="cmr7";
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Life}\hbox{expectancy}} etex, OUT);
+ glabel.bot(btex Per capita G.N.P. (thousands of dollars) etex, OUT);
+ setcoords(log,linear);
+ gdata("countries.d", s,
+ glabel(s3, s1, s2);
+ )
+ endgraph;
+endfig;
+
+
+beginfig(9);
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Quadrillions}\hbox{of BTU}} etex, OUT);
+ path p[];
+ numeric t;
+ gdata("energy.d", $,
+ t:=0; augment.p1($1,0);
+ for j=2 upto 5:
+ t:=t+scantokens $[j]; augment.p[j]($1,t);
+ endfor)
+ picture lab[];
+ lab2=btex coal etex; lab3=btex crude oil etex;
+ lab4=btex natural gas etex; lab5=btex hydroelectric etex;
+ for j=5 downto 2:
+ gfill p[j]--reverse p[j-1]--cycle withcolor .16j*white;
+ glabel.lft(image(unfill bbox lab[j]; draw lab[j]), .7+length p[j]);
+ endfor
+ endgraph;
+endfig;
+
+
+beginfig(10);
+draw format("%g",2+2);
+endfig;
+
+beginfig(11);
+draw format("%3g","6.022e23");
+endfig;
+
+
+end \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/mpgraph.tex b/Master/texmf-dist/doc/metapost/base/source/mpgraph.tex
new file mode 100644
index 00000000000..104b70bf917
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/mpgraph.tex
@@ -0,0 +1,1109 @@
+\documentclass{article} % article is NOT the original style
+\usepackage{makeidx}
+\usepackage{fancyvrb}
+\usepackage{ctabbing}
+\RecustomVerbatimEnvironment{verbatim}{BVerbatim}{baseline=c}
+\usepackage{epsf}
+\usepackage[textwidth=6in,textheight=8.75in]{geometry}
+
+\newcommand\descr[1]{{\langle\hbox{\rm#1}\rangle}}
+\newcommand\invisgap{\nobreak\hskip0pt\relax}
+\newcommand\tdescr[1]{$\langle$\invisgap{\rm#1}\invisgap$\rangle$}
+\newcommand\Ignore[1]{} % For fooling delatex so spell will work
+
+\newfont\psyvii{rpsyr at 7pt}
+\newcommand\regmark{$^{\hbox{\psyvii\char'322}}$} % Registered trademark
+\newcommand\logofn{\global\font\logofn=logo8 \logofn}
+\newcommand\logo{\global\font\logo=logo10 \logo}
+\newcommand\logosl{\global\font\logosl=logosl10 \logosl}
+\newcommand\MF{{\ifdim \fontdimen6\font <9pt \def\logo{\logofn}\fi
+ \ifdim \fontdimen1\font >0pt \def\logo{\logosl}\fi
+ {\logo META}\-{\logo FONT}}}
+
+\newcommand\mathcenter[1]{\vcenter{\hbox{#1}}}
+
+\author{John D. Hobby}
+\title{Drawing Graphs with {MetaPost}}
+\date{}
+
+
+\newcommand\myabstract{%
+This paper describes a graph-drawing package that has been implemented
+as an extension to the MetaPost graphics language. MetaPost has
+a powerful macro facility for implementing such extensions. There are
+also some new language features that support the graph macros.
+Existing features for generating and manipulating pictures
+allow the user to do things that would be difficult to achieve
+in a stand-alone graph package.}
+
+\newcommand\mykeywords{%
+ typesetting; graphs; MetaPost}
+
+
+
+\begin{document}
+ \maketitle
+ \begin{abstract} \myabstract \end{abstract}
+ \ifx\keywords\undefined \else
+ \begin{keywords} \mykeywords \end{keywords}
+ \fi
+
+
+\section{Introduction}
+\label{intro}
+
+MetaPost is a batch-oriented graphics language based on Knuth's \MF\footnote{\MF\
+is a trademark of Addison Wesley Publishing Company.}, but with
+PostScript\footnote{PostScript is a registered trademark of Adobe Systems Inc.}
+output and numerous features for integrating text and graphics.
+The author has tried to make this paper as independent as possible of the
+user's manual~\cite{ho:mp3}, but fully appreciating all the material requires
+some knowledge of the MetaPost language.
+
+We concentrate on the mechanics of producing particular kinds of graphs
+because the question of what type of graph is best in a given situation
+is covered elsewhere; e.g., Cleveland~\cite{Cleve85,Cleve93,Cleve93a} and
+Tufte~\cite{Tufte83}.
+The goal is to provide at least the power of UNIX\footnote{UNIX is a registered
+trademark of UNIX System Laboratories, Inc.} {\it
+grap\/}~\cite{BenKer90}, but within the MetaPost language.
+Hence the package is implemented using MetaPost's powerful macro facility.
+
+The graph macros provide the following functionality:
+\begin{enumerate}
+\item Automatic scaling
+\item Automatic generation and labeling of tick marks or grid lines
+\item Multiple coordinate systems
+\item Linear and logarithmic scales
+\item Separate data files
+\item Ability to handle numbers outside the usual range
+\item Arbitrary plotting symbols
+\item Drawing, filling, and labeling commands for graphs
+\end{enumerate}
+In addition to these items, the user also has access to all the features
+described in the MetaPost user's manual~\cite{ho:mp3}.
+These include access to almost all the features of PostScript\regmark,
+ability to use and manipulate typeset text,
+ability to solve linear equations,
+and data types for points, curves, pictures, and coordinate transformations.
+
+Section~\ref{grmac} describes the graph macros from a user's perspective
+and presents several examples. Sections \ref{nummac} and~\ref{formsec} discuss
+auxiliary packages for manipulating and typesetting numbers and Section~\ref{concl}
+gives some concluding remarks. Appendix~\ref{summsec} summarizes the graph-drawing
+macros, and Appendix~\ref{nfeats} describes some recent additions to the MetaPost
+language that have not been presented elsewhere.
+
+
+\section{Using the Graph Macros}
+\label{grmac}
+
+A MetaPost input file that uses the graph macros should begin with
+$$ \hbox{\tt input graph} $$
+This reads a macro file {\tt graph.mp} and defines the graph-drawing commands
+explained below. The rest of the file should be one or more instances of
+$$ \vbox{\hbox{\tt beginfig($\descr{figure number}$);}
+ \hbox{\tt $\descr{graphics commands}$ endfig;}}
+$$
+followed by {\tt end}.
+
+The following \tdescr{graphics commands} suffice to generate the graph in
+Figure~\ref{fig1} from the data file {\tt agepop91.d}:
+$$\begin{verbatim}
+draw begingraph(3in,2in);
+ gdraw "agepop91.d";
+ endgraph;
+\end{verbatim}
+$$
+(Each line of {\tt agepop91.d} gives an age followed the estimated number of
+Americans of that age in 1991 \cite{Census92}.)
+
+\begin{figure}[htp]
+$$ \epsfbox{mpgraph.1} $$
+\caption{A graph of the 1991 age distribution in the United States}
+\label{fig1}
+\end{figure}
+
+\subsection{Basic Graph-Drawing Commands}
+
+% begingraph, endgraph, gdraw
+
+All graphs should begin with
+$$ \hbox{\tt begingraph($\descr{width}$,$\descr{height}$);} $$
+and end with {\tt endgraph}. This is syntactically a \tdescr{picture expression},
+so it should be preceded by {\tt draw} and followed by a semicolon as in the
+example.\footnote{See the User's Manual~\cite{ho:mp3} for explanations of {\tt draw}
+commands and syntactic elements like \tdescr{picture expression}.}
+The \tdescr{width} and \tdescr{height} give the dimensions of the
+graph itself without the axis labels.
+
+The command
+$$ {\tt gdraw}\ \descr{expression}\ \descr{option list} $$
+draws a graph line. If the \tdescr{expression} is of type string, it names a data
+file; otherwise it is a path that gives the function to draw. The
+\tdescr{option list} is zero or more drawing options
+$$ {\tt withpen} \descr{pen expression}
+ \mid {\tt withcolor} \descr{color expression}
+ \mid {\tt dashed} \descr{picture expression}
+$$
+that give the line width, color, or dash pattern as explained in the User's
+Manual~\cite{ho:mp3}.
+
+% plot <picture>
+
+In addition to the standard drawing options, the \tdescr{option list} in a
+{\tt gdraw} statement can contain
+$$ {\tt plot}\ \descr{picture expression} $$
+The \tdescr{picture expression} gives a plotting symbol to be drawn at each
+path knot. The {\tt plot} option suppresses line drawing so that%
+\footnote{Troff users should replace {\tt btex \$\string\bullet\$ etex} with
+{\tt btex \string\(bu etex}.}
+\Ignore{\)}% Help delatex so spell will work
+$$ \hbox{\verb|gdraw "agepop91.d" plot btex $\bullet$ etex|} $$
+generates only bullets as shown in Figure~\ref{fig2}.
+(Following the {\tt plot} option with a {\tt withpen} option would
+cause the line to reappear superimposed on the plotting symbols.)
+
+\begin{figure}[htp]
+$$ \epsfbox{mpgraph.2} $$
+\caption{The 1991 age distribution plotted with bullets}
+\label{fig2}
+\end{figure}
+
+% glabel, gdotlabel, OUT
+
+The {\tt glabel} and {\tt gdotlabel} commands add labels to a graph. The
+syntax for {\tt glabel} is
+$$ {\tt glabel.}\ \descr{label suffix}
+ \hbox{\tt ($\descr{string or picture expression}$, $\descr{location}$)}
+ \ \descr{option list}
+$$
+where \tdescr{location} identifies the location being labeled and
+\tdescr{label suffix} tells how the label is offset relative to that location.
+The {\tt gdotlabel} command is identical, except it marks the location with a
+dot. A \tdescr{label suffix} is as in plain MetaPost:
+\tdescr{empty} centers the label on the location;
+{\tt lft}, {\tt rt}, {\tt top}, {\tt bot} offset the label horizontally or
+vertically; and {\tt ulft}, {\tt urt}, {\tt llft}, {\tt lrt} give diagonal
+offsets. The \tdescr{location} can be a pair of graph coordinates, a knot
+number on the last {\tt gdraw} path, or the special location {\tt OUT}.
+Thus
+$$ \hbox{\verb|gdotlabel.top(btex $(50,0)$ etex, 50,0)|} $$
+would put a dot at graph coordinates {\tt(50,0)} and place the typeset text
+``$(50,0)$'' above it. Alternatively,
+$$ \hbox{\verb|glabel.ulft("Knot3", 3)|} $$
+typesets the string {\tt "Knot3"} and places it above and to the left of
+Knot~3 of the last {\tt gdraw} path. (The knot number 3 the path's ``time''
+parameter~\cite[Section 8.2]{ho:mp3}.)
+
+The \tdescr{location} {\tt OUT} places a label relative to the whole graph.
+For example, replacing ``{\tt gdraw "agepop91.d"}'' with
+$$\begin{verbatim}
+glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+glabel.bot(btex Age in years etex, OUT);
+gdraw "agepopm.d";
+\end{verbatim}
+$$
+in the input for Figure~\ref{fig1} generates Figure~\ref{fig3}.
+This improves the graph by adding axis labels and using a new data file
+{\tt agepopm.d} where the populations have been divided by one million to avoid
+large numbers. We shall see later that simple transformations such as this can
+be achieved without generating new data files.
+
+\begin{figure}[htp]
+$$ \epsfbox{mpgraph.3} $$
+\caption{An improved version of the 1991 age distribution graph}
+\label{fig3}
+\end{figure}
+
+All flavors of \TeX\ can handle multi-line labels via the \verb|\hbox| within
+\verb|\vbox| arrangement used above, but \LaTeX\ users will find it more natural
+to use the {\tt tabular} environment~\cite{LaTeXman}.
+Troff user's can use nofill mode:
+$$\begin{verbatim}
+btex .nf
+Population
+in millions etex
+\end{verbatim}
+$$
+
+
+\subsection{Coordinate Systems}
+\label{coords}
+
+The graph macros automatically shift and rescale coordinates from data files,
+{\tt gdraw} paths, and {\tt glabel} locations to fit the graph. Whether the
+range of $y$~coordinates is 0.64 to 4.6 or 640,000 to 4,600,000, they
+get scaled to fill about 88\% of the height specified in the {\tt begingraph}
+statement. Of course line widths, labels, and plotting symbols are not
+rescaled.
+
+% setrange
+
+The {\tt setrange} command controls the shifting and rescaling process by
+specifying the minimum and maximum graph coordinates:
+$$ \hbox{\tt setrange($\descr{coordinates}$,\,$\descr{coordinates}$)} $$
+where
+\begin{ctabbing}
+$\tt \descr{coordinates} \rightarrow \descr{pair expression}$\\
+$\tt \qquad \;|\; \descr{numeric or string expression}\hbox{\tt ,}
+ \descr{numeric or string expression}$
+\end{ctabbing}
+The first \tdescr{coordinates} give $(x_{\rm min},y_{\rm min})$ and the second give
+$(x_{\rm max},y_{\rm max})$. The lines $x=x_{\rm min}$, $x=x_{\rm max}$,
+$y=y_{\rm min}$, and $y=y_{\rm max}$ define the rectangular frame around the graph
+in Figures \ref{fig1}--\ref{fig3}. For example, an adding a statement
+$$ \hbox{\tt setrange(origin, whatever,\,whatever)} $$
+to the input for Figure~\ref{fig3} yields Figure~\ref{fig4}.
+The first \tdescr{coordinates} are given by the predefined pair constant
+{\tt origin}, and the other coordinates are left unspecified. Any unknown
+value would work as well, but {\tt whatever} is the standard MetaPost
+representation for an anonymous unknown value.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ setrange(origin, whatever,whatever);
+ gdraw "agepopm.d";
+ endgraph;
+\end{verbatim}
+\atop
+\epsfbox{mpgraph.4}
+$$
+\caption{The 1991 age distribution graph and the input that creates it.}
+\label{fig4}
+\end{figure}
+
+% strings for big coordinates
+
+Notice that the syntax for {\tt setrange} allows coordinate values to be given
+as strings. Many commands in the graph package allow this option. It is
+provided because the MetaPost language uses fixed point numbers that must be
+less than 32768. This limitation is not as serious as it sounds because good
+graph design dictates that coordinate values should be ``of reasonable
+magnitude''~\cite{Cleve85,Tufte83}. If you really want $x$ and $y$
+to range from 0 to 1,000,000,
+$$ \hbox{\tt setrange(origin, "1e6",\,"1e6")} $$
+does the job. Any fixed or floating point representation is acceptable
+as long as the exponent is introduced by the letter ``{\tt e}''.
+
+% setcoords
+
+Coordinate systems need not be linear. The {\tt setcoords} command allows
+either or both axes to have logarithmic spacing:
+\begin{ctabbing}
+$\tt \descr{coordinate setting} \rightarrow setcoords\hbox{\tt (}
+ \descr{coordinate type}\hbox{\tt ,}\,\descr{coordinate type}\hbox{\tt )}$\\
+$\tt \descr{coordinate type} \rightarrow
+ log \;|\; linear \;|\; \hbox{\tt -}log \;|\; \hbox{\tt -}linear$
+\end{ctabbing}
+A negative \tdescr{coordinate type} makes $x$ (or $y$) run backwards so it is
+largest on the left side (or bottom) of the graph.
+
+Figure~\ref{fig5} graphs execution times for two matrix multiplication algorithms
+using
+$$ \hbox{\tt setcoords(log,log)} $$
+to specify logarithmic spacing on both axes. The data file {\tt matmul.d} gives
+timings for both algorithms:\\
+\hbox to\hsize{\footnotesize\hfil$
+\begin{verbatim}
+20 .007861 standard MM: size, seconds
+30 .022051
+40 .050391
+60 .15922
+80 .4031
+120 1.53
+160 3.915
+240 18.55
+320 78.28
+480 279.24
+
+20 .006611 Strassen: size, seconds
+30 .020820
+40 .049219
+60 .163281
+80 .3975
+120 1.3125
+160 3.04
+240 9.95
+320 22.17
+480 72.60
+\end{verbatim}
+\hfil$}
+A blank line in a data file ends a data set. Subsequent {\tt gdraw} commands
+access additional data sets by just naming the same data file again.
+Since each line gives one $x$~coordinate and one $y$~coordinate, commentary
+material after the second data field on a line is ignored.
+
+\begin{figure}[htp]
+$$ \mathcenter{\epsfbox{mpgraph.5}}
+ \quad
+\begin{BVerbatim}[baseline=c]
+draw begingraph(2.3in,2in);
+ setcoords(log,log);
+ glabel.lft(btex Seconds etex,OUT);
+ glabel.bot(btex Matrix size etex,
+ OUT);
+ gdraw "matmul.d" dashed evenly;
+ glabel.ulft(btex Standard etex,8);
+ gdraw "matmul.d";
+ glabel.lrt(btex Strassen etex,7);
+ endgraph;
+\end{BVerbatim}
+$$
+\caption{Timings for two matrix multiplication algorithms with the corresponding
+ MetaPost input.}
+\label{fig5}
+\end{figure}
+
+Placing a {\tt setcoords} command between two {\tt gdraw} commands graphs two
+functions in different coordinate systems as shown in Figure~\ref{fig6}.
+Whenever you give a {\tt setcoords} command, the interpreter examines what has
+been drawn, selects appropriate $x$ and $y$ ranges, and scales everything to
+fit. Everything drawn afterward is in a new coordinate system that need not
+have anything in common with the old coordinates unless {\tt setrange} commands
+enforce similar coordinate ranges. For instance, the two {\tt setrange}
+commands force both coordinate systems to have $x$ ranging from 80 to~90 and
+$y$~starting at 0.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+draw begingraph(6.5cm,4.5cm);
+ setrange(80,0, 90,whatever);
+ glabel.bot(btex Year etex, OUT);
+ glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
+ \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
+ gdraw "lead.d" withpen pencircle scaled 1.5pt;
+ autogrid(,otick.lft);
+ setcoords(linear,linear);
+ setrange(80,0, 90,whatever);
+ glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
+ \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
+ gdraw "lead.d";
+ autogrid(otick.bot,otick.rt);
+ endgraph;
+\end{verbatim}
+ \atop
+\mathcenter{\epsfbox{mpgraph.6}}
+$$
+\caption{Annual lead emissions and average level at atmospheric monitoring
+ stations in the United States. The MetaPost input is shown above
+ the graph.}
+\label{fig6}
+\end{figure}
+
+% autogrid
+
+When you use multiple coordinate systems, you have to specify where the axis
+labels go. The default is to put tick marks on the bottom and the left side of
+the frame using the coordinate system in effect when the {\tt endgraph} command
+is interpreted. Figure~\ref{fig6} uses the
+$$ \hbox{\tt autogrid(,otick.lft)} $$
+to label the left side of the graph with the $y$~coordinates in effect before
+the {\tt setcoords} command. This suppresses the default axis labels, so another
+{\tt autogrid} command is needed to label the bottom and right sides of the
+graph using the new coordinate system. The general syntax is
+$$ \hbox{$\tt autogrid\hbox{\tt (}\descr{axis label command}\hbox{\tt ,}\,
+ \descr{axis label command}\hbox{\tt )}\ \descr{option list}$}
+$$
+where
+\begin{ctabbing}
+$\tt \descr{axis label command} \rightarrow \descr{empty}
+ \;|\; \descr{grid or tick}\, \descr{label suffix}$\\
+$\tt \descr{grid or tick} \rightarrow grid \;|\; itick \;|\; otick$
+\end{ctabbing}
+The \tdescr{label suffix} should be {\tt lft}, {\tt rt}, {\tt top},
+or {\tt bot}.
+
+The first argument to {\tt autogrid} tells how to label the $x$~axis and the
+second argument does the same for~$y$. An \tdescr{empty} argument suppresses
+labeling for that axis. Otherwise, the \tdescr{label suffix} tells which side
+of the graph gets the numeric label. Be careful to use {\tt bot} or {\tt top}
+for the $x$~axis and {\tt lft} or {\tt rt} for the $y$~axis. Use {\tt otick}
+for outward tick marks, {\tt itick} for inward tick marks, and {\tt grid} for
+grid lines. The \tdescr{option list} tells how to draw the tick marks or grid
+lines. Grid lines tend to be a little overpowering, so it is a good idea to
+give a {\tt withcolor} option to make them light gray so they do not make the
+graph too busy.
+
+
+\subsection{Explicit Grids and Framing}
+
+% otick, itick, grid, (format)
+
+In case {\tt autogrid} is not flexible enough, axis label commands generate
+grid lines or tick marks one at a time. The syntax is
+$$ \descr{grid or tick}\hbox{\tt .}\descr{label suffix}
+ \hbox{\tt ($\descr{label format}$,\,$\descr{numeric or string expression}$)}
+ \ \descr{option list}
+$$
+where \tdescr{grid or tick} and \tdescr{label suffix} are as in {\tt autogrid},
+and \tdescr{label format} is either a format string like \verb|"%g"| or a
+picture containing the typeset numeric label.
+
+The axis label commands use a macro
+$$ \hbox{\tt format($
+ \descr{format string}$,\,$\descr{numeric or string expression}$)}
+$$
+to typeset numeric labels. Full details appear in Section~\ref{formsec},
+but when the \tdescr{format string} is \verb|"%g"|, it uses decimal notation
+unless the number is large enough or small enough to require scientific notation.
+
+The example in Figure~\ref{fig7} invokes
+$$ \hbox{\verb|format("%g",y)|} $$
+explicitly so that grid lines can be placed at transformed coordinates.
+It defines the transformation ${\tt newy}(y)=y/75+\ln y$ and shows that
+this function increases almost linearly.\footnote{The manual~\cite{ho:mp3}
+explains how {\tt vardef} defines functions and {\tt mlog} computes logarithms.}
+This is a little like using logarithmic $y$-coordinates, except that $y$ is
+mapped to $y/75+\ln y$ instead of just $\ln y$.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+vardef newy(expr y) = (256/75)*y + mlog y enddef;
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ gdraw "ttimepop.d";
+ for y=5,10,20,50,100,150,200,250:
+ grid.lft(format("%g",y), newy(y)) withcolor .85white;
+ endfor
+ autogrid(grid.bot,) withcolor .85white;
+ frame.llft;
+ endgraph;
+\end{verbatim}
+ \atop
+ \epsfbox{mpgraph.7}
+$$
+\caption{Population of the United States in millions versus time with the
+ population re-expressed as $p/75+\ln p$. The MetaPost input shown
+ above the graph assumes a data file {\tt ttimepop.d} that gives
+ (year, $p/75+\ln p$) pairs.}
+\label{fig7}
+\end{figure}
+
+% frame
+
+Figure~\ref{fig7} uses the command
+$$ \hbox{\tt frame.} \descr{label suffix}\ \descr{option list} $$
+to draw a special frame around the graph. In this case the \tdescr{label suffix}
+is {\tt llft} to draw just the bottom and left sides of the frame. Suffixes
+{\tt lrt}, {\tt ulft}, and {\tt urt} draw other combinations of two sides;
+suffixes {\tt lft}, {\tt rt}, {\tt top}, {\tt bot} draw one side, and \tdescr{empty}
+draws the whole frame. For example
+$$ \hbox{\verb|frame dashed evenly|} $$
+draws all four sides with dashed lines. The default four-sided frame is drawn
+only when there is no explicit {\tt frame} command.
+
+% auto, (sarith.mp)
+
+To label an axis as {\tt autogrid} does but with the labels transformed
+somehow, use
+$$ \hbox{{\tt auto.x}\quad or\quad {\tt auto.y}} $$
+for positioning tick marks or grid lines. These macros produce comma-separated
+lists for use in {\tt for} loops. Any $x$ or $y$ values in these lists that
+cannot be represented accurately within MetaPost's fixed-point number system
+are given as strings. A standard macro package that is loaded via
+$$ \hbox{\tt input sarith} $$
+defines arithmetic operators that work on numbers or strings. Binary operators
+{\tt Sadd}, {\tt Ssub}, {\tt Smul}, and {\tt Sdiv} do addition, subtraction
+multiplication, and division.
+
+One possible application is rescaling data.
+Figure~\ref{fig4} used a special data file {\tt agepopm.d} that had $y$~values
+divided by one million. This could be avoided by replacing
+``{\tt gdraw "agepopm.d"}'' by
+$$\begin{verbatim}
+gdraw "agepop91.d";
+for u=auto.y: otick.lft(format("%g",u Sdiv "1e6"), u); endfor
+autogrid(otick.bot,)
+\end{verbatim}
+$$
+
+
+\subsection{Processing Data Files}
+\label{dfilesec}
+
+% gdata
+
+The most general tool for processing data files is the {\tt gdata} command:
+$$ \hbox{\tt gdata(} \descr{string expression} \hbox{\tt,}\, \descr{variable}
+ \hbox{\tt,}\, \descr{commands} \hbox{\tt )}
+$$
+It takes a file name, a variable~$v$, and a list of commands to be executed for
+each line of the data file. The commands are executed with {\tt i} set to the
+input line number and strings $v${\tt 1}, $v${\tt 2}, $v${\tt 3}, \ldots\ set
+to the input fields on the current line. A null string marks the end of the
+$v$ array.
+
+Using a {\tt glabel} command inside of {\tt gdata} generates a scatter plot
+as shown in Figure~\ref{fig8}. The data file {\tt countries.d} begins
+$$\begin{verbatim}
+20.910 75.7 US
+ 1.831 66.7 Alg
+\end{verbatim}
+$$
+where the last field in each line gives the label to be plotted. Setting
+{\tt defaultfont} in the first line of input selects a small font for these
+labels. Without these labels, no {\tt gdata} command would be needed.
+Replacing the {\tt gdata} command with
+$$ \hbox{\verb|gdraw "countries.d" plot btex$\circ$etex|} $$
+would change the abbreviated country names to open circles.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+defaultfont:="cmr7";
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Life}\hbox{expectancy}} etex, OUT);
+ glabel.bot(btex Per capita G.N.P. (thousands of dollars) etex, OUT);
+ setcoords(log,linear);
+ gdata("countries.d", s,
+ glabel(s3, s1, s2);
+ )
+ endgraph;
+\end{verbatim}
+ \atop
+ \epsfbox{mpgraph.8}
+$$
+\caption{A scatter plot and the commands that generated it}
+\label{fig8}
+\end{figure}
+
+Both {\tt gdraw} and {\tt gdata} ignore an optional initial `\%' on each input
+line, parse data fields separated by white space, and stop if they encounter an
+input line with no data fields. Leading percent signs make graph data
+look like MetaPost comments so that numeric data can be placed at the beginning
+of a MetaPost input file.
+
+% augment
+
+It is often useful to construct one or more paths when reading a data file
+with {\tt gdata}. The {\tt augment} command is designed for this:
+$$ \hbox{\tt augment.} \descr{path variable} \hbox{\tt(}\descr{coordinates}\hbox{\tt)}
+$$
+If the path variable does not have a known value, it becomes a path of length
+zero at the given coordinates; otherwise a line segment to the given coordinates
+is appended to the path. The \tdescr{coordinates} may be a pair expression or
+any combination of strings and numerics as explained at the beginning of
+Section~\ref{coords}.
+
+If a file {\tt timepop.d} gives $t$,~$p$ pairs, {\tt augment} can be used like
+this to graph {\tt newy(}$p${\tt)} versus~$t$:
+$$\begin{verbatim}
+path p;
+gdata("timepop.d", s, augment.p(s1, newy(scantokens s2)); );
+gdraw p;
+\end{verbatim}
+$$
+(MetaPost's {\tt scantokens} primitive interprets a string as if it were the
+contents of an input file. This finds the numeric value of data field
+{\tt s2}.)
+
+% gfill (energy.d)
+
+Figure~\ref{fig9} shows how to use {\tt augment} to read multiple column data
+and make multiple paths. Paths {\tt p2}, {\tt p3}, {\tt p4}, {\tt p5} give
+cumulative totals for columns 2 through 5 and pictures {\tt lab2} through
+{\tt lab5} give corresponding labels. The expression
+$$ \hbox{\verb|image(unfill bbox lab[j]; draw lab[j])|} $$
+executes the given drawing commands and returns the resulting picture:
+``{\tt unfill bbox lab[j]}'' puts down a white background and ``{\tt draw
+lab[j]}'' puts the label on the background.
+The {\tt gfill} command is just like {\tt gdraw}, except it takes a cyclic
+path and fills the interior with a solid color. The color is black unless
+a {\tt withcolor} clause specifies another color.
+See the manual~\cite{ho:mp3} for
+explanations of {\tt for} loops, arrays, colors, and path construction
+operators like \verb|--|, {\tt cycle}, and {\tt reverse}.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Quadrillions}\hbox{of BTU}} etex, OUT);
+ path p[];
+ numeric t;
+ gdata("energy.d", $,
+ t:=0; augment.p1($1,0);
+ for j=2 upto 5:
+ t:=t+scantokens $[j]; augment.p[j]($1,t);
+ endfor)
+ picture lab[];
+ lab2=btex coal etex; lab3=btex crude oil etex;
+ lab4=btex natural gas etex; lab5=btex hydroelectric etex;
+ for j=5 downto 2:
+ gfill p[j]--reverse p[j-1]--cycle withcolor .16j*white;
+ glabel.lft(image(unfill bbox lab[j]; draw lab[j]), .7+length p[j]);
+ endfor
+ endgraph;
+\end{verbatim}
+ \atop
+ \epsfbox{mpgraph.9}
+$$
+\caption{A graph of U.S. annual energy production
+ and the commands that generated it}
+\label{fig9}
+\end{figure}
+
+
+\section{Manipulating Big Numbers}
+\label{nummac}
+
+MetaPost inherits a fixed-point number system from Knuth's \MF~\cite{kn:d}.
+Numbers are expressed in multiples of $2^{-16}$ and they must have absolute
+value less than 32768. Knuth chose this system because it is perfectly adequate
+for font design, and it guaranteed to give identical results on all types of
+computers. Fixed-point numbers are seldom a problem in MetaPost because all
+computations are based on coordinates that are limited by the size the paper on
+which the output is to be printed. This does not hold for the input data in a
+graph-drawing application. Although graphs look best when coordinate axes are
+labeled with numbers of reasonable magnitude, the strict limits of fixed-point
+arithmetic would be inconvenient.
+
+% Sadd, Ssub, Smul, Sdiv
+
+A simple way to handle large numbers is to include the line
+$$ \hbox{\tt input sarith} $$
+and then use binary operators {\tt Sadd}, {\tt Ssub}, {\tt Smul}, and {\tt Sdiv}
+in place of \verb|+|, \verb|-|, \verb|*|, and \verb|/|. These operators are
+inefficient but very flexible. They accept numbers or strings and return
+strings in exponential notation with the exponent marked by ``{\tt e}'';
+e.g., \verb|"6.7e-11"| means $6.7\times10^{-11}$.
+
+% Sabs, Sleq, Sneq
+
+The unary operator\footnote{The argument to a unary operator need not be
+parenthesized unless it is an expression involving binary operators.}
+$$ {\tt Sabs}\ \descr{string} $$
+finds a string the represents the absolute value. Binary operators {\tt Sleq}
+and {\tt Sneq} perform numeric comparisons on strings and return boolean
+results.
+
+% Scvnum
+
+The operation
+$$ {\tt Scvnum}\ \descr{string} $$
+finds the numeric value for a string if this can be done without overflowing
+MetaPost's fixed-point number system. If the string does not contain
+``{\tt e}'', it is much more efficient to use the primitive operation
+$$ {\tt scantokens}\ \descr{string} $$
+
+% Mten
+
+The above operators are based on a low-level package that manipulates numbers
+in ``{\tt Mlog} form.'' A number $x$ in {\tt Mlog} form represents
+$$ \mu^{2^{16}x}, \quad {\rm where\ } \mu=-e^{2^{-24}}. $$
+Any value between $1.61\times10^{-28}$ and $3.88\times10^{55}$ can be
+represented this way. (There is a constant {\tt Mten} such that $k*{\tt Mten}$
+represents $10^k$ for any integer~$k$ in the interval $[-29,55]$.)
+
+% Mreadpath, Gpaths
+
+The main reason for mentioning {\tt Mlog} form is that it allows graph data
+to be manipulated as a MetaPost path. The function
+$$ \hbox{\tt Mreadpath($\descr{file name}$)} $$
+reads a data file and returns a path where all the coordinates are in
+{\tt Mlog} form. An internal variable {\tt Gpaths} determines whether
+{\tt gdraw} and {\tt gfill} expect paths to be given in {\tt Mlog} form.
+For example, this graphs the data in {\tt agepop91.d} with $y$ coordinates
+divided by one million:
+$$\begin{verbatim}
+interim Gpaths:=log;
+gdraw Mreadpath("agepop91.d") shifted (0,-6*Mten);
+\end{verbatim}
+$$
+
+
+\section{Typesetting Numbers}
+\label{formsec}
+
+% format
+
+The graph package needs to compute axis labels and then typeset them.
+The macro
+$$ \hbox{\tt format($\descr{string expression}$,\,%
+ $\descr{numeric or string expression}$)} $$
+does this. You must first {\tt input graph} or {\tt input format} to load the
+macro file. The macro takes a format string and a number to typeset and returns
+a picture containing the typeset result. Thus
+$$ \hbox{\verb|format("%g",2+2)|}\quad {\rm yields}\quad \epsfbox{mpgraph.10} $$
+and
+$$ \hbox{\verb|format("%3g","6.022e23")|}
+ \quad {\rm yields}\quad \epsfbox{mpgraph.11}
+$$
+
+A format string consists of
+\begin{itemize}
+\item an optional initial string not containing a percent sign,
+\item a percent sign,
+\item an optional numeric precision $p$,
+\item one of the conversion letters {\tt e}, {\tt f}, {\tt g}, {\tt G},
+\item an optional final string $\beta$.
+\end{itemize}
+The initial and final strings are typeset in the default font (usually
+{\tt cmr10}), and the typeset number is placed between them. For the {\tt e}
+and {\tt g} formats, the precision~$p$ is the number of significant digits
+allowed after rounding; for {\tt f} and {\tt G}, the number is rounded to the
+nearest multiple of $10^{-p}$. If the precision is not specified, the default
+is $p=3$. The {\tt e} format always uses scientific
+notation and the {\tt f} format uses ordinary decimal notation but reverts to
+scientific notation if the number is at least 10000. The {\tt g} and {\tt G}
+formats also revert to scientific notation for non-zero numbers of magnitude
+less than 0.001.
+
+% init_numbers
+
+The {\tt format} macro needs a set of templates to determine what font to use,
+how to position the exponent, etc. The templates are normally initialized
+automatically, but it is possible to set them explicitly by passing five picture
+expressions to {\tt init\_numbers}. For instance, the default definition for
+\TeX\ users is
+$$\begin{verbatim}
+init_numbers(btex$-$etex, btex$1$etex, btex${\times}10$etex,
+ btex${}^-$etex, btex${}^2$etex)
+\end{verbatim}
+$$
+The first argument tells how to typeset a leading minus sign;
+the second argument is an example of a 1-digit mantissa;
+third comes whatever to put after the mantissa in scientific notation;
+next come a leading minus sign for the exponent and a sample 1-digit exponent.
+
+% Fe_plus, Fe_base
+
+Picture variable \verb|Fe_plus| gives a leading plus sign for positive numbers,
+and \verb|Fe_base| gives whatever should precede the exponent when typesetting
+a power of ten. Calling \verb|init_numbers| initializes \verb|Fe_plus| to an
+empty picture and constructs \verb|Fe_base| from its second and third arguments.
+
+
+
+\section{Conclusion}
+\label{concl}
+
+The graph package makes it convenient to generate graphs from within the MetaPost
+language. The primary benefits are the power of the MetaPost language and its
+ability to interact with \TeX\ or troff for typesetting labels. Typeset labels
+can be stored in picture variables and manipulated in various ways such measuring
+the bounding box and providing a white background.
+
+We have seen how to generate shaded regions and control line width, color, and
+styles of dashed lines. Numerous other variations are possible.
+The full MetaPost language~\cite{ho:mp3} provides many other potentially useful
+features. It also has enough computing power to be useful for generating and
+processing data.
+
+
+
+\appendix
+\section{Summary of the Graph Package}
+\label{summsec}
+
+% Not described elsewhere: gdrawarrow, gdrawdblarrow, Gmarks, Gminlog, Autoform
+
+In the following descriptions, italic letters such as $w$ and $h$ denote
+expression parameters and words in angle brackets denote other syntactic
+elements. Unless specified otherwise, expression parameters can be either
+numerics or strings. An \tdescr{option list} is a list of drawing options such
+as {\tt withcolor .5white} or {\tt dashed evenly};
+a \tdescr{label suffix} is one of {\tt lft}, {\tt rt}, {\tt top}, {\tt bot},
+{\tt ulft}, {\tt urt}, {\tt llft}, {\tt lrt}.
+
+\subsection{Graph Administration}
+
+\begin{description}
+\item[{\tt begingraph($w$,$h$)}]
+ Begin a new graph with the frame width and height given by numeric
+ parameters $w$ and $h$.
+\item[{\tt endgraph}]
+ End a graph and return the resulting picture.
+\item[{\tt setcoords($t_x$,\,$t_y$)}]
+ Set up a new coordinate system as specified by numeric flags $t_x$,
+ $t_y$. Flag values are $\pm{\tt linear}$ and $\pm{\tt log}$.
+\item[{\tt setrange($\descr{coordinates}$,\,$\descr{coordinates}$)}]
+ Set the lower and upper limits for the current coordinate system.
+ Each \tdescr{coordinates} can be a single pair expression or two
+ numeric or string expressions.
+\end{description}
+
+\subsection{Drawing and Labeling}
+
+All of the drawing and labeling commands can be followed by an
+\tdescr{option list}. In addition to the usual MetaPost drawing options, the
+list can contain a {\tt plot} \tdescr{picture} clause to plot a specified
+picture at each data point.
+
+The drawing and labeling commands are closely related to a set of similarly
+named commands in plain MetaPost. The {\tt gdrawarrow} and {\tt gdrawdblarrow}
+commands are included to maintain this relationship.
+
+\begin{description}
+\item[{\tt gdotlabel.$\descr{label suffix}$($p$,\,$\descr{location}$)}]
+ This is like {\tt glabel} except it also puts a dot at the location
+ being labeled.
+\item[{\tt gdraw $p$}]
+ Draw path $p$, or if $p$ is a string, read coordinate pairs from
+ file~$p$ and draw a polygonal line through them.
+\item[{\tt gdrawarrow $p$}]
+ This is like {\tt dgraw} $p$ except it adds an arrowhead at the end of
+ the path.
+\item[{\tt gdrawdblarrow $p$}]
+ This is like {\tt dgraw} $p$ except it adds an arrowheads at each end of
+ the path.
+\item[{\tt gfill $p$}]
+ Fill cyclic path~$p$ or read coordinates from the file named by
+ string~$p$ and fill the resulting polygonal outline.
+\item[{\tt glabel.$\descr{label suffix}$($p$,\,$\descr{location}$)}]
+ If $p$ is not a picture, it should be a string. Typeset it using
+ {\tt defaultfont}, then place it near the given location and offset as
+ specified by the \tdescr{label suffix}. The \tdescr{location} can be
+ $x$~and $y$ coordinates, a pair giving $x$~and $y$, a numerc value giving
+ a time on the last path drawn, or {\tt OUT} to label the outside of the
+ graph.
+\end{description}
+
+\subsection{Grids, Tick Marks, and Framing}
+
+\begin{description}
+\item[{\tt auto.}$\descr{{\tt x} or {\tt y}}$]
+ Generate default $x$ or $y$ coordinates for tick marks.
+\item[{\tt autogrid($\descr{axis label command}$,\,$\descr{axis label command}$)}]
+ Draw default axis labels using the specified commands for the $x$ and
+ $y$ axes. An \tdescr{axis label command} may be \tdescr{empty} or it
+ may be {\tt itick}, {\tt otick}, or {\tt grid} followed by a
+ \tdescr{label suffix}.
+\item[{\tt frame.}$\descr{label suffix}$\ $\descr{option list}$]
+ Draw a frame around the graph, or draw the part of the frame specified
+ by the \tdescr{label suffix}.
+\item[{\tt grid.}$\descr{label suffix}$($f$,$z$)]
+ Draw a grid line across the graph from the side specified by the
+ \tdescr{label suffix}, and label it there using format string~$f$ and
+ coordinate value~$z$. If $f$ is a picture, it gives the label.
+\item[{\tt itick.}$\descr{label suffix}$($f$,$z$)]
+ This is like {\tt grid} except it draws an inward tick mark.
+\item[{\tt otick.}$\descr{label suffix}$($f$,$z$)]
+ This is like {\tt grid} except it draws an outward tick mark.
+\end{description}
+
+\subsection{Miscellaneous Commands}
+
+\begin{description}
+\item[{\tt augment.$\descr{variable}$($\descr{coordinates}$)}]
+ Append \tdescr{coordinates} to the path stored in \tdescr{variable}.
+\item[{\tt format($f$,\,$x$)}]
+ Typeset $x$ according to format string~$f$ and return the resulting
+ picture.
+\item[{\tt gdata($f$,\,$\descr{variable}$,\,$\descr{commands}$)}]
+ Read the file named by string~$f$ and execute \tdescr{commands} for each
+ input line using the \tdescr{variable} as an array to store data fields.
+\item[{\tt init\_numbers($s$,\,$m$,\,$x$,\,$t$,\,$e$)}]
+ Provide five pictures as templates for future {\tt format} operations:
+ $s$ is a leading minus; $m$ is a sample mantissa; $x$ follows the
+ mantissa; $t$ is a leading minus for the exponent~$e$.
+\item[{\tt Mreadpath($f$)}]
+ Read a path for the data file named by string~$f$ and return it in
+ ``{\tt Mlog} form''.
+\end{description}
+
+\subsection{Arithmetic on Numeric Strings}
+
+It is necessary to {\tt input sarith} before using the following macros:
+\begin{description}
+\item[{\tt Sabs $x$}]
+ Compute $|x|$ and return a numeric string.
+\item[{\tt $x$ Sadd $y$}]
+ Compute $x+y$ and return a numeric string.
+\item[{\tt Scvnum $x$}]
+ Return the numeric value for string $x$.
+\item[{\tt $x$ Sdiv $y$}]
+ Compute $x/y$ and return a numeric string.
+\item[{\tt $x$ Sleq $y$}]
+ Return the boolean result of the comparison $x\leq y$.
+\item[{\tt $x$ Smul $y$}]
+ Compute $x*y$ and return a numeric string.
+\item[{\tt $x$ Sneq $y$}]
+ Return the boolean result of the comparison $x\neq y$.
+\item[{\tt $x$ Ssub $y$}]
+ Compute $x-y$ and return a numeric string.
+\end{description}
+
+\subsection{Internal Variables and Constants}
+
+\begin{description}
+\item[{\tt Autoform}]
+ Format string used by {\tt autogrid}. Default: \verb|"%g"|.
+\item[{\tt Fe\_base}]
+ What precedes the exponent when typesetting a power of ten.
+\item[{\tt Fe\_plus}]
+ Picture of the leading plus sign for positive exponents.
+\item[{\tt Gmarks}]
+ Minimum number of tick marks per axis for {\tt auto} and {\tt autogrid}.
+ Default: 4.
+\item[{\tt Gminlog}]
+ Minimum largest/smallest ratio for logarithmic spacing with {\tt auto}
+ and {\tt autogrid}. Default: 3.0.
+\item[{\tt Gpaths}]
+ Code for coordinates used in {\tt gdraw} and {\tt gfill} paths:
+ {\tt linear} for standard form, {log} for ``{\tt Mlog} form''.
+\item[{\tt Mten}]
+ The ``{\tt Mlog} form'' for 10.0
+\end{description}
+
+
+
+\section{New Language Features}
+\label{nfeats}
+
+The {\tt graph.mp} macros and the arithmetic routines in {\tt marith.mp}
+and {\tt sarith.mp} use various language features that were introduced
+in Version 0.60 of the MetaPost language. We summarize these features here
+because they are not covered in existing documentation \cite{ho:mp3,ho:mp4}.
+Also new is the built-in macro
+$$ \hbox{\tt image($\descr{drawing commands}$)} $$
+that was used in Section~\ref{dfilesec} to find the picture produced by a
+sequence of drawing commands.
+
+\subsection{Reading and Writing Files}
+
+A new operator
+$$ {\tt readfrom}\ \descr{file name} $$
+returns a string giving the next line of input from the named file. The
+\tdescr{file name} can be any primary expression of type string. If the file
+has ended or cannot be read, the result is a string consisting of a single
+null character. The preloaded {\tt plain} macro package introduces the name
+{\tt EOF} for this string. After {\tt readfrom} has returned {\tt EOF},
+additional reads from the same file cause the file to be reread from the
+start.
+
+The opposite of {\tt readfrom} is the command
+$$ {\tt write}\ \descr{string expression}\ {\tt to} \descr{file name} $$
+This writes a line of text to the specified output file, opening the file
+first if necessary. All such files are closed automatically when the
+program terminates. They can also be closed explicitly by using {\tt EOF}
+as the \tdescr{string expression}. The only way to tell if a {\tt write}
+command has succeeded is to close the file and use {\tt readfrom} to look
+at it.
+
+\subsection{Extracting Information from Pictures}
+
+MetaPost pictures are composed of stroked lines, filled outlines, pieces
+of typeset text, clipping paths, and {\tt setbounds} paths. (A {\tt setbounds}
+path gives an artificial bounding box as is needed for \TeX\ output.)
+A picture can have many components of each type. They can be accessed via
+an iteration of the form
+$$ {\tt for}\ \descr{symbolic token}\ {\tt within}\
+ \descr{picture expression}\hbox{\tt:}\ \descr{loop text}\ {\tt endfor}
+$$
+The \tdescr{loop text} can be anything that is balanced with respect to
+{\tt for} and {\tt endfor}. The \tdescr{symbolic token} is a loop variable that
+scans the components of the picture in the order in which they were drawn. The
+component for a clipping or {\tt setbounds} path includes everything the path
+applies to. Thus if a single clipping or {\tt setbounds} path applies to
+everything in the \tdescr{picture expression}, the whole picture could be
+thought of as one big component. In order to make the contents of such a picture
+accessible, the {\tt for}\ldots{\tt within} iteration ignores the enclosing
+clipping or {\tt setbounds} path in this case.
+
+Once the {\tt for}\ldots{\tt within} iteration has found a picture component,
+there are numerous operators for identifying it and extracting relevant
+information. The operator
+$$ {\tt stroked}\ \descr{primary expression} $$
+tests whether the expression is a known picture whose first component is a
+stroked line. Similarly, the {\tt filled} and {\tt textual} operators
+return {\tt true} if the first component is a filled outline or a piece of
+typeset text. The {\tt clipped} and {\tt bounded} operators test whether
+the argument is a known picture that starts with a clipping path or a
+{\tt setbounds} path. This is true if the first component is clipped or
+bounded or if the entire picture is enclosed in a clipping or {\tt setbounds}
+path.
+
+There are also numerous part extraction operators that test the first component
+of a picture. If {\tt p} is a picture and {\tt stroked p} is true,
+{\tt pathpart p} is the path describing the line that got stroked,
+{\tt penpart p} is the pen that was used, {\tt dashpart p} is the dash
+pattern, and the color is
+$$ \hbox{\tt (redpart p, greenpart p, bluepart p)} $$
+If the line is not dashed, {\tt dashpart p} returns an empty picture.
+
+The same part extraction operators work when {\tt filled p} is true, except
+that {\tt dashpart p} is not meaningful in that case. For text components,
+{\tt textual p} is true, {\tt textpart p} gives the text that got
+typeset, {\tt fontpart p} gives the font that was used, and {\tt xpart~p},
+{\tt ypart~p}, {\tt xxpart~p}, {\tt xypart~p}, {\tt yxpart~p}, {\tt yypart~p}
+tell how the text has been shifted, rotated, and scaled. The {\tt redpart},
+{\tt greenpart}, and {\tt bluepart} operators also work for text components.
+
+When {\tt clipped p} or {\tt bounded p} is true, {\tt pathpart p} gives the
+clipping or {\tt setbounds} path and the other part extraction operators are
+not meaningful. Such non-meaningful part extractions do not generate
+errors---they return null values instead:
+the trivial path {\tt (0,0)} for {\tt pathpart},
+{\tt nullpen} for {\tt penpart},
+an empty picture for {\tt dashpart},
+zero for {\tt redpart}, {\tt greenpart}, {\tt bluepart},
+and the null string for {\tt textpart} or {\tt fontpart}.
+
+One final operator for extracting information from a picture is
+$$ {\tt length}\ \descr{picture primary} $$
+This returns the number of components that a {\tt for}\ldots {\tt within}
+iteration would find.
+
+\subsection{Other New Features}
+
+The {\tt marith.mp} and {\tt sarith.mp} packages use numbers of magnitude
+4096 more. Since such numbers can cause overflow problems in MetaPost's
+linear equation solving and path fitting algorithms, they are normally
+allowed only as intermediate results. This limitation is removed when
+the internal variable {\tt warningcheck} is zero. In earlier versions
+of MetaPost, the limitation could be removed for variables but explicit
+constants were always restricted to be less than 4096.
+
+For completeness, we also mention one other new feature of MetaPost
+Version 0.60. When \TeX\ material is included in a picture via the
+{\tt btex}\ldots{\tt etex} feature, the thickness of horizontal and
+vertical rules gets rounded to exactly the right number of pixels; i.e.,
+interpreting MetaPost output according to the PostScript\regmark\ scan
+conversion rules~\cite{ad:red} makes the pixel width equal to the ceiling
+of the unrounded width. In fact, a similar relationship holds for all line
+widths. The generated PostScript sets line widths by first transforming
+to device coordinates and rounding appropriately.
+
+
+
+
+
+
+\bibliographystyle{plain}
+\bibliography{mpgraph}
+
+
+
+
+\end{document}
+
+
+
+% Copyright 1990 - 1995 by AT&T Bell Laboratories.
+
+% Permission to use, copy, modify, and distribute this software
+% and its documentation for any purpose and without fee is hereby
+% granted, provided that the above copyright notice appear in all
+% copies and that both that the copyright notice and this
+% permission notice and warranty disclaimer appear in supporting
+% documentation, and that the names of AT&T Bell Laboratories or
+% any of its entities not be used in advertising or publicity
+% pertaining to distribution of the software without specific,
+% written prior permission.
+
+% AT&T disclaims all warranties with regard to this software,
+% including all implied warranties of merchantability and fitness.
+% In no event shall AT&T be liable for any special, indirect or
+% consequential damages or any damages whatsoever resulting from
+% loss of use, data or profits, whether in an action of contract,
+% negligence or other tortious action, arising out of or in
+% connection with the use or performance of this software.
+
+% In addition, John Hobby, the original author of MetaPost and this
+% manual, makes the following requests:
+% - I request that it remain clear that I am the author of
+% "A User's Manual for MetaPost" and "Drawing Graphs with MetaPost".
+% - I request to be consulted before significant changes are made.
diff --git a/Master/texmf-dist/doc/metapost/base/source/mpintro.bib b/Master/texmf-dist/doc/metapost/base/source/mpintro.bib
new file mode 100644
index 00000000000..dc90248f30b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/mpintro.bib
@@ -0,0 +1,48 @@
+@techreport{CSTR116,
+ author = "Kernighan, Brian W.",
+ title = "{PIC}---A Graphics Language for Typesetting",
+ type = "Computing Science Technical Report",
+ number = 116,
+ institution = "AT\&T Bell Laboratories",
+ address = "Murray Hill, New Jersey",
+ year = 1984
+}
+@incollection{ke:pic,
+ author = "Kernighan, Brian W.",
+ title = "Pic---A Graphics Language for Typesetting",
+ booktitle = "Unix Research System Papers, Tenth Edition",
+ publisher = "AT\&T Bell Laboratories",
+ pages = "53--77",
+ year = 1990
+}
+@book{kn:c,
+ key = "Knuth",
+ author = "D. E. Knuth",
+ title = "Computers and Typesetting",
+ volume = "C",
+ subtitle = "The {\MF}book",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@article{ho:mp1,
+ key = "Hobby",
+ author = "J. D. Hobby",
+ title = "A {\MF}-like System with {P}ost{S}cript Output",
+ journal = "Tugboat, the\/ {\TeX} User's Group Newsletter",
+ volume = 10,
+ number = 4,
+ pages = "505--512",
+ month = dec,
+ year = 1989
+}
+@book{kn:d,
+ key = "Knuth",
+ author = "D. E. Knuth",
+ title = "Computers and Typesetting",
+ volume = "D",
+ subtitle = "{\MF} the Program",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
diff --git a/Master/texmf-dist/doc/metapost/base/source/mpintro.tex b/Master/texmf-dist/doc/metapost/base/source/mpintro.tex
new file mode 100644
index 00000000000..99e487c46dd
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/mpintro.tex
@@ -0,0 +1,878 @@
+\documentstyle{article}
+\input epsf
+
+\author{John D. Hobby}
+\title{The MetaPost System}
+
+\font\textt=cmtex10
+
+\makeatletter
+\def\logo{\global\font\logo=logo10 at1\@ptsize\p@ \logo}
+\def\logosl{\global\font\logosl=logosl10 at1\@ptsize\p@ \logosl}
+\def\MF{{\ifdim \fontdimen\@ne\font >\z@ \def\logo{\logosl}\fi
+ {\logo META}\-{\logo FONT}}}
+\makeatother
+
+\def\descr#1{{\langle\hbox{#1}\rangle}}
+\def\lit#1{{\hbox{\textt#1}}}
+\def\okbreak{\vfil\penalty2000 \vfilneg}
+
+{\obeylines\obeyspaces\gdef\startverbatim{%
+\vcenter\bgroup\textt\catcode`\$=12\catcode`\}=12\catcode`\{=12\catcode`\_=12%
+\catcode`\\=12\catcode`\#=12\catcode`\^=12\catcode`\%=0%
+\obeyspaces\let =\ \obeylines\let^^M=\cr\halign\bgroup##\hfil}}
+\def\stopverbatim{\egroup\egroup}
+
+\begin{document}
+\maketitle
+
+\begin{abstract}
+The MetaPost system implements a picture-drawing language very much like Knuth's
+\MF\ except that it outputs PostScript commands instead of run-length-encoded
+bitmaps. MetaPost is a powerful language for producing figures for documents
+to be printed on PostScript printers. It provides easy access to all the
+features of PostScript and it includes facilities for integrating text and
+graphics.
+
+This document describes the system and its implementation. It also includes
+basic user documentation to be used in conjunction with {\it The \MF book}.
+Much of the source code was copied from the \MF\ sources by permission from
+the author.
+\end{abstract}
+
+
+\section{Overview}
+The MetaPost system is based on Knuth's \MF\footnote{\MF\ is a trademark
+of Addison Wesley Publishing company.}~\cite{kn:c} and much of the source
+code is copied with permission from the \MF\ sources. MetaPost is a graphics
+language like \MF, but with new primitives for integrating text and graphics and
+for accessing special features of PostScript\footnote{PostScript is a
+trademark of Adobe Systems Inc.} such as clipping, shading, and
+dashed lines. The language has the main features of \MF\ including first-class
+objects for curves, pictures, affine transformations, and pen shapes.
+Another feature borrowed from \MF\ is the ability to solve linear equations
+that are given implicitly, thus allowing many programs to be written in a
+largely declarative style.
+
+While MetaPost could be used as a tool for generating PostScript fonts,
+the intended application is to generate figures for \TeX\footnote{\TeX\ is a
+trademark of the American Mathematical Society.} and {\it troff\/} documents.
+The figures can be integrated into a \TeX\ document via a freely available
+program called {\tt dvips} as shown in Figure~1.\footnote{The C source for
+{\tt dvips} comes with the web2c \TeX\ distribution. Similar programs are
+available from other sources.} A similar procedure works with troff: the
+{\tt dpost} output processor includes PostScript figures when they are
+requested via troff's {\tt \char`\\X} command.
+
+\begin{figure}[htp]
+$$ \def\fbox#1{\hbox{\vrule
+ \vbox{\hrule\kern5pt\hbox{\kern5pt\hbox{#1}\kern5pt}\kern5pt\hrule}%
+ \vrule}}
+ \vbox{
+ \halign{$\hfil#\hfil$&\hskip1in$\hfil#\hfil$\cr
+ \hbox{Figures in MetaPost}&
+ \hbox{\TeX\ Document}
+ \cr
+ \bigg\downarrow&
+ \bigg\downarrow
+ \cr
+ \fbox{\vrule height.2in depth.133in width0pt
+ \kern .1in MetaPost\kern.1in}
+ &
+ \fbox{\vrule height.2in depth.133in width0pt
+ \kern .167in \TeX\kern.167in}
+ \cr
+ \bigg\downarrow&
+ \bigg\downarrow
+ \cr
+ \hbox{Figures in PostScript}&
+ \hbox{{\tt dvi} file}
+ \cr
+ \bigg\downarrow&
+ \bigg\downarrow
+ \cr
+ \fbox{\vrule height.2in depth.133in width0pt
+ \kern 1in {\tt dvips} \kern1in}
+ \span\omit\cr
+ \bigg\downarrow\span\omit\cr
+ \hbox{PostScript}\span\omit\cr}}
+ \atop
+ \vbox{\noindent Fig.~1: A diagram of the processing for a \TeX\ document with figures
+ done in Meta\-Post}
+$$
+\end{figure}
+
+Other than the new commands for integrating text and accessing features of
+PostScript, the main difference between the \MF\ and MetaPost languages is
+that the latter deals with continuous pictures rather than discrete ones.
+This affects the coordinate system and some of the subtler aspects of the
+language as outlined in the next two sections.
+
+Sections \ref{basic} and \ref{advanced} give a short summary of the language
+with numerous examples. Then Section~\ref{impsec} describes the implementation.
+A preliminary description of the language has already appeared~\cite{ho:mp1}.
+
+\section{Introduction to MetaPost}
+\label{basic}
+MetaPost is a lot like Knuth's \MF\
+except that it outputs PostScript programs instead
+of bitmaps. Knuth describes the \MF\ language in {\sl The \MF book\/}.~\cite{kn:d}
+
+This document introduces MetaPost via examples and references to key parts of
+{\sl The \MF book}. It is a good idea to start by reading chapters 2~and 3
+in {\sl The \MF book}. The introductory material in these chapters applies
+to MetaPost except that coordinates are in units of
+PostScript points by default (72 units per inch).
+
+To see MetaPost in action, consider a file \lit{fig.mp} containing the
+following text:\vadjust{\okbreak}
+$$ \startverbatim
+beginfig(1);
+a=.7in; b=0.5in;
+z0=(0,0); z1=(a,0); z2=(0,b);
+z0=.5[z1,z3]=.5[z2,z4];
+draw z1..z2..z3..z4..cycle;
+drawarrow z0..z1;
+drawarrow z0..z2;
+label.top(btex $a$ etex, .5[z0,z1]);
+label.lft(btex $b$ etex, .5[z0,z2]);
+endfig;
+end
+%stopverbatim$$
+Then the command \lit{mp} \lit{fig} produces an output file \lit{fig.1}
+that can be included in a
+\TeX\ document. After \lit{\string\input} \lit{epsf} the \TeX\ commands
+\lit{\$\$\string\epsfbox\char`\{fig.1\char`\}\$\$} produce
+$$ \epsfbox{examples.1} $$
+The \lit{beginfig(1)} line means that everything up to the next
+\lit{endfig} is to be used to create \lit{fig.1}. If there
+were more than one figure in \lit{fig.mp}, there would be additional
+\lit{beginfig} $\ldots$ \lit{endfig} blocks.
+
+The \lit{drawarrow} macro has been specially developed for MetaPost.
+There is also a command called \lit{drawdblarrow} that draws the
+following path with arrowheads on both ends. The line beginning with
+\lit{label.top} is a call to a standard macro for positioning text just
+above a given point. In this case, the point \lit{.5[z0,z1]} is the
+midpoint of the segment from \lit{z0} to \lit{z1} and the text is
+generated by the \TeX\ commands \lit{\$a\$}. In addition to \lit{label.top}
+and \lit{label.lft}, there is also \lit{label.bot}, \lit{label.rt},
+and four other versions \lit{label.ulft} for upper-left etc. Just
+plain \lit{label} without any suffix centers the
+label on the given point.
+
+The discussion of pens in Chapter~4 of {\sl The \MF book\/} applies
+to MetaPost as well, but simple figures often do not need to refer to
+pens explicitly because they can just use the default pen which is a
+circle $0.5{\it bp}$ in diameter.\footnote{The letters ``{\it bp}''
+stand for ``big point'' ($1\over72$ inch). This is one of the standard
+units of measure in \TeX\ and \MF\ and it is the default unit for
+MetaPost. A complete listing of predefined units is given on page~92 of
+{\sl The \MF book}.} This produces lines of uniform thickness
+$0.5{\it bp}$ regardless of the direction of the line.
+
+Chapter 5 of {\sl The \MF book\/} does not apply to MetaPost.
+In particular, there is no \lit{mode\_setup} macro or ``sharped units''
+and \lit{mp} does not output \lit{gf} files. MetaPost does have
+a set of preloaded macros but they are not the same as \MF's plain base.
+If there were an
+analogous chapter about running MetaPost, it would probably mention that
+\lit{mp} skips over \lit{btex} $\ldots$ \lit{etex} blocks
+and depends on a preprocessor to translate them into low level MetaPost
+commands. If the main file is \lit{fig.mp}, the translated \TeX\
+material is placed in a file named \lit{fig.mpx}. This is normally
+done silently without any user intervention but it could fail if one of
+the \lit{btex} $\ldots$ \lit{etex} blocks contains an erroneous
+\TeX\ command. If this happens, the erroneous \TeX\ input is saved in
+the file \lit{mpxerr.tex} and the error messages appear in
+\lit{mpxerr.log}.
+
+If there is a need for \TeX\ macro definitions or any other auxiliary
+\TeX\ commands, they can be enclosed in a
+\lit{verbatimtex} $\ldots$ \lit{etex} block. The difference between
+\lit{btex} and \lit{verbatimtex} is that the former generates a picture
+expression while the latter does not.
+
+On Unix systems, an environment variable can be used to specify that
+\lit{btex} $\ldots$ \lit{etex} and \lit{verbatimtex} $\ldots$ \lit{etex}
+blocks are in {\it troff\/} instead of \TeX. When using this option,
+it is a good idea to give the MetaPost command \lit{prologues:=1}.
+This tells \lit{mp} to output structured PostScript and assume that
+text comes from built-in PostScript fonts.
+
+Chapters 6--10 of {\sl The \MF book\/} cover important aspects of \MF\
+that are almost identical in MetaPost. The only change to the tokenization
+process described in Chapter~6 is that \TeX\ material can contain
+percent signs and unmatched double quote characters so these are
+treated like spaces when skipping \TeX\ material. The preprocessor gives
+\TeX\ everything between \lit{btex} and \lit{etex} except for leading
+and trailing spaces.
+
+Chapters 7--10 discuss the types of variables and expressions that \MF\
+understands. MetaPost has an additional type ``\lit{color}'' that is
+a lot like \lit{pair} except that it has three components instead of
+two. The operations allowed on colors are addition, subtraction, scalar
+multiplication, and scalar division. MetaPost also understands mediation
+expressions involving colors since
+\lit{.3[w,b]} is equivalent to \lit{w+.3(b-w)} which is allowed
+even when \lit{w} and \lit{b} are colors. Colors can be specified
+in terms of the predefined constants \lit{black}, \lit{white},
+\lit{red}, \lit{green}, \lit{blue}, or the red, green, and blue
+components can be given explicitly. Black is \lit{(0,0,0)} and white
+is \lit{(1,1,1)}. There is no restriction against colors ``blacker
+than black'' or ``whiter than white'' except all components are snapped
+back to the $[0,1]$ range when a color is given in an output file.
+MetaPost solves linear equations involving colors the same way it does
+so for pairs. (This is explained in Chapter~9).
+
+Let's consider another example that uses some of the ideas discussed above.
+The MetaPost program\vadjust{\okbreak}
+$$ \startverbatim
+beginfig(2);
+h=2in; w=2.7in;
+path p[], q[], pp;
+for i=1.5,2,4: ii:=i**2;
+ p[i] = (w/ii,h){1/ii,-1}...(w/i,h/i)...(w,h/ii){1,-1/ii};
+endfor
+for i=.5,1.5: q[i] = origin..(w,i*h) cutafter p1.5; endfor
+pp = buildcycle(q0.5, p2, q1.5, p4);
+fill pp withcolor .8white;
+z0=center pp;
+picture lab; lab=thelabel(btex $f>0$ etex, z0);
+unfill bbox lab; draw lab;
+draw q0.5; draw p2; draw q1.5; draw p4;
+makelabel.top(btex $P$ etex, p2 intersectionpoint q0.5);
+makelabel.rt(btex $Q$ etex, p2 intersectionpoint q1.5);
+endfig;
+%stopverbatim$$
+produces the following figure:\vadjust{\okbreak}
+$$ \epsfbox{examples.2} $$
+
+The third line declares arrays of paths \lit{p} and \lit{q} as explained
+in Chapter~7. Note that \lit{q1.5} is the same as \lit{q[i]} when
+$\lit{i}=1.5$. The \lit{for} loops make each \lit{p[i]}
+an approximation to an arc of the hyperbola
+$$xy={wh\over i^2} $$
+and each \lit{q[i]} a segment of slope $ih/w$. (Loops are discussed in
+Chapter~19 of {\sl The \MF book\/}).
+
+The \lit{cutafter} operator is used to cut off the part of \lit{q[i]} after
+the intersection with \lit{p1.5}. (There is no ``\lit{draw} \lit{p1.5}'' in
+the input for the above figure so this hyperbola is invisible). There is also a
+\lit{cutbefore} operator defined to make
+$$ a \lit{ cutbefore } b $$
+what's left of path~$a$ when everything before its intersection with~$b$ is
+removed. In case of multiple intersections \lit{cutbefore} and \lit{cutafter}
+try to cut off as little as possible.
+
+The shaded region in the above figure is due to the line
+$$ \lit{fill pp withcolor .8white} $$
+The boundary of this region is the path \lit{pp} that the \lit{buildcycle}
+macro creates by piecing together the four paths given as arguments. In other
+words, \lit{pp} is constructed by going along \lit{q0.5} until it
+intersects \lit{p2}, then going along \lit{p2} until hitting
+\lit{q1.5}, etc. It turns out that this requires going backwards along
+\lit{p2} and \lit{q1.5}. The \lit{buildcycle} macro tries to avoid
+going backwards if it has a choice as to which intersection points to choose,
+but in this example each pair of consecutive path arguments has a unique
+intersection point. It is generally a good idea to avoid multiple intersections
+because they can lead to unpleasant surprises.
+
+The \lit{fill} and \lit{unfill} macros in plain MetaPost are similar to
+the corresponding macros discussed in Chapter~13 of {\sl The \MF book\/}
+but MetaPost assigns colors to regions rather than assigning weights to pixels.
+There is no \lit{cull} command or \lit{withweight} option in MetaPost.
+The \lit{unfill} macro used to erase the rectangle containing the label
+``$f>0$'' in the above figure works by specifying ``\lit{withcolor}
+\lit{background}''
+where \lit{background}'' is usually equal to \lit{white}. The complete
+syntax for primitive drawing commands in MetaPost is as follows:
+$$\tabskip=0.0pt plus 1000.0pt minus 1000.0pt
+ \halign to\hsize{$#$\hfil\cr
+ \descr{picture command} \rightarrow
+ \descr{addto command} \mid \descr{clip command} \cr
+ \descr{addto command} \rightarrow {} \cr
+ \qquad \lit{addto }\descr{picture variable} \lit{ also }
+ \descr{picture expression} \descr{with list} \cr
+ \qquad {}\mid \lit{addto } \descr{picture variable} \lit{ contour }
+ \descr{path expression} \descr{with list} \cr
+ \qquad {}\mid \lit{addto } \descr{picture variable} \lit{ doublepath }
+ \descr{path expression} \descr{with list} \cr
+ \descr{with list} \rightarrow \descr{empty} \mid
+ \descr{with clause} \descr{with list} \cr
+ \descr{with clause} \rightarrow \lit{withcolor } \descr{color expression}\cr
+ \qquad {} \mid \lit{withpen } \descr{pen expression}
+ \mid \lit{dashed } \descr{picture expression}\cr
+ \descr{clip command} \rightarrow \lit{clip }
+ \descr{picture variable} \lit{ to } \descr{path expression} \cr}
+$$
+If $P$ stands for \lit{currentpicture}, $q$ stands for
+\lit{currentpen}, and $b$ stands for \lit{background}, the standard
+drawing macros have roughly the following meanings:
+$$ \tabskip=0.0pt plus 1000.0pt minus 1000.0pt
+ \halign to\hsize{$#$\hfil&\quad means\quad $#$\hfil\cr
+ \lit{draw }p& \lit{addto }P\lit{ doublepath }p\lit{ withpen }q\cr
+ \lit{fill }c& \lit{addto }P\lit{ contour }c\cr
+ \lit{filldraw }c& \lit{addto }P\lit{ contour }c\lit{ withpen }q\cr
+ \lit{undraw }p& \lit{addto }P\lit{ doublepath }p\lit{ withpen }q
+ \lit{ withcolor }b\cr
+ \lit{unfill }c& \lit{addto }P\lit{ contour }c\lit{ withcolor }b\cr
+ \lit{unfilldraw }c& \lit{addto }P\lit{ contour }c\lit{ withpen }q
+ \lit{ withcolor }b\cr}
+$$
+The expressions denoted by $c$ in the table must be cyclic paths, while path
+expressions $p$ need not be cyclic. It is also possible to use \lit{draw}
+and \lit{undraw} when the argument is a picture~$r$:
+$$ \tabskip=0.0pt plus 1000.0pt minus 1000.0pt
+ \halign to\hsize{$#$\hfil&\quad means\quad $#$\hfil\cr
+ \lit{draw }r& \lit{addto }P\lit{ also }r\cr
+ \lit{undraw }r& \lit{addto }P\lit{ also }r\lit{ withcolor }b\cr}
+$$
+
+The argument to \lit{unfill} in the last example is \lit{bbox lab}.
+This is a call to a standard macro that gives the bounding box of a picture
+as a rectangular path. The \lit{center} macro used two lines previously
+makes \lit{z0} the center of the bounding box for path \lit{pp}. (This
+works for paths and pictures). The expression
+$$ \lit{thelabel(btex \$f>0\$ etex, z0)} $$
+computes a picture containing the text ``$f>0$'' centered on the point
+\lit{z0}.
+
+Here is the complete syntax for labeling commands:
+$$\tabskip=0.0pt plus 1000.0pt minus 1000.0pt
+ \halign to\hsize{$#$\hfil\cr
+ \descr{label command} \rightarrow
+ \descr{command name} \descr{position suffix}
+ (\descr{label text},\ \descr{label loc}) \cr
+ \qquad {}\mid \lit{labels} \descr{position suffix} (\descr{suffix list}) \cr
+ \descr{command name} \rightarrow \lit{label}
+ \mid \lit{thelabel} \mid \lit{makelabel} \cr
+ \descr{position suffix} \rightarrow
+ \descr{empty} \mid \lit{.lft} \mid \lit{.rt} \mid \lit{.top}
+ \mid \lit{.bot} \cr
+ \qquad {}\mid \lit{.ulft} \mid \lit{.urt} \mid \lit{.llft}
+ \mid \lit{.lrt}\cr
+ \descr{label text} \rightarrow \descr{picture expression}
+ \mid \descr{string expression} \cr
+ \descr{label loc} \rightarrow \descr{pair expression} \cr
+ \descr{suffix list} \rightarrow \descr{suffix}
+ \mid \descr{suffix}, \descr{suffix list} \cr}
+$$
+The \lit{label} command adds text to \lit{currentpicture} near the
+position $\descr{label loc}$ as determined by the $\descr{position suffix}$.
+An empty suffix centers the label and the other options offset it slightly so
+that it does not overlap the $\descr{label loc}$. Using \lit{thelabel} just
+creates a picture expression rather than actually adding it to
+\lit{currentpicture}. Using \lit{makelabel} instead of \lit{label} adds a dot
+at the location being labeled. Finally, the \lit{labels}
+command does
+$$ \lit{makelabel} \descr{position suffix}
+ (\lit{str}\,\descr{suffix},\,\lit{z}\descr{suffix})
+$$
+for each $\descr{suffix}$ in the $\descr{suffix list}$, using the \lit{str}
+operator to convert the suffix to a string. Thus \lit{labels.top(1,2a)} places
+labels ``\lit{1}'' and ``\lit{2a}'' just above \lit{z1} and \lit{z2a}.
+
+The examples given so far have all used $\descr{label text}$ of the form
+$$ \lit{btex}\ \descr{\TeX\ commands}\ \lit{etex}.
+$$
+This gets converted into a picture expression. If the label is simple enough,
+it can be given directly as a string expression in which case it is typeset
+in \lit{defaultfont} at \lit{defaultscale} times its design size.
+Normally,
+$$ \lit{defaultfont="cmr10"}
+ \quad{\rm and}\quad \lit{defaultscale=1},
+$$
+but these can be reset if desired. Using \lit{cmtex10} instead of
+\lit{cmr10} would allow the label to contain spaces and special characters.
+If there is any doubt about what the design size is, use the \lit{fontsize}
+operator to find it as follows:
+$$ \lit{defaultfont:="Times";}
+ \qquad \lit{defaultscale:=10/fontsize "Times"}
+$$
+
+Notice that a $\descr{with clause}$ can be
+``\lit{dashed} $\descr{picture expression}$.'' The picture
+gives a template that tells how the line being drawn is to be dashed. There
+is a standard template called \lit{evenly} that makes dashes $3bp$ long
+separated by gaps of length $3bp$. It is possible to scale the template in
+order to get a finer or coarser pattern. Thus
+$$ \lit{draw z1..z2 dashed evenly scaled 2} $$
+draws a line with dashes $6bp$ long with gaps of $6bp$.
+
+The following MetaPost input illustrates the use of dashed
+lines:\vadjust{\okbreak}
+$$ \startverbatim
+beginfig(3);
+3.2scf = 2.4in;
+path fun;
+# = .1;
+fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}
+ ..{curl .1}(3.2,2#)) scaled scf yscaled(1/#);
+vardef vertline primary x = (x,-infinity)..(x,infinity) enddef;
+primarydef f atx x = (f intersectionpoint vertline x) enddef;
+primarydef f whenx x = xpart(f intersectiontimes vertline x)
+ enddef;
+z1a = (2.5scf,0);
+z1 = fun atx x1a;
+y2a=0; z1-z2a=whatever*direction fun whenx x1 of fun;
+z2 = fun atx x2a;
+y3a=0; z2-z3a=whatever*direction fun whenx x2 of fun;
+draw fun withpen pencircle scaled 1pt;
+drawarrow (0,0)..(3.2scf,0);
+label.bot(btex $x_1$ etex, z1a);
+draw z1a..z1 dashed evenly;
+makelabel(nullpicture, z1);
+draw z1..z2a withpen pencircle scaled .3;
+label.bot(btex $x_2$ etex, z2a);
+draw z2a..z2 dashed evenly;
+makelabel(nullpicture, z2);
+draw z2..z3a withpen pencircle scaled .3;
+label.bot(btex $x_3$ etex, z3a);
+endfig;
+%stopverbatim$$
+This produces the following figure:\vadjust{\okbreak}
+$$ \epsfbox{examples.3} $$
+
+The above figure uses some of the more advanced properties of paths discussed
+in Chapter~14 of {\sl The \MF book}. All of this material applies to
+MetaPost as well as \MF\ except for the explanation of ``strange paths'' which
+fortunately cannot occur in MetaPost. The parts most relevant to this figure
+are the explanation of ``curl'' specifications and the \lit{direction},
+\lit{intersectiontimes}, and \lit{intersectionpoint} operators.
+In order to ensure that the path \lit{fun} makes $y$ a unique function
+of~$x$, the path is first constructed with the $y$-coordinates compressed
+by a factor of ten. The final ``\lit{yscaled(1/\char`\#)}'' restores
+the original aspect ratio after MetaPost has chosen a cubic spline that
+interpolates the given points.
+
+The \lit{yscaled} operator is an example of a very important class of
+operators that apply affine transformations to pairs, paths, pens, pictures,
+and other transforms. The discussion in Chapter~15 is relevant and
+important. The only differences are that MetaPost has no
+{\it currenttransform} and there is no restriction on the type of
+transformations that can be applied to pictures.
+
+\section{More Advanced Topics}
+\label{advanced}
+MetaPost does have pens like those in \MF\ but they aren't very important
+to the casual user except occasionally to specify changes in line widths
+as in the preceding figure. Anyone reading the description in Chapter~16 of
+{\sl The \MF book} should beware that there is no such thing as a
+``future pen'' in MetaPost and elliptical pens are never converted into
+polygons. Furthermore, there is no need for \lit{cutoff} and
+\lit{cutdraw} because the same effect can be achieved by setting the
+internal parameter \lit{linecap:=butt}.\vadjust{\okbreak}
+$$\startverbatim
+beginfig(4);
+for i=0 upto 2:
+ z[i]=(0,40i); z[i+3]-z[i]=(100,30);
+endfor
+pickup pencircle scaled 18;
+def gray = withcolor .8white enddef;
+draw z0..z3 gray;
+linecap:=butt; draw z1..z4 gray;
+linecap:=squared; draw z2..z5 gray;
+labels.top(0,1,2,3,4,5);
+endfig; linecap:=rounded;
+%stopverbatim
+\qquad
+\vcenter{\epsfbox{examples.4}}
+$$
+
+There is also a \lit{linejoin} parameter as illustrated below.
+The default values of \lit{linecap} and \lit{linejoin} are both
+\lit{rounded}.\vadjust{\okbreak}
+$$ \startverbatim
+beginfig(5);
+for i=0 upto 2:
+ z[i]=(0,50i); z[i+3]-z[i]=(60,40);
+ z[i+6]-z[i]=(120,0);
+endfor
+pickup pencircle scaled 24;
+def gray = withcolor .8white enddef;
+draw z0--z3--z6 gray;
+linejoin:=mitered; draw z1..z4--z7 gray;
+linejoin:=beveled; draw z2..z5--z8 gray;
+labels.bot(0,1,2,3,4,5,6,7,8);
+endfig; linejoin:=rounded;
+%stopverbatim
+\qquad
+\vcenter{\epsfbox{examples.5}}
+\mskip-54mu % allow it to hang into the margin
+$$
+
+Another way to adjust the behavior of drawing commands is by giving the
+declaration
+$$ \lit{drawoptions}(\descr{with list}) $$
+For instance,
+$$ \lit{drawoptions(withcolor blue)} $$
+gives subsequent drawing commands the default color blue. This can still
+be overridden by giving another \lit{withcolor} clause as in
+$$ \lit{draw p withcolor red} $$
+The options apply only to relevant drawing commands:
+$$ \lit{drawoptions(dashed dd)} $$
+will affect \lit{draw} commands but not fill commands.
+
+Chapters 17--20 of {\sl The \MF book} describe the programming constructs
+necessary to customize the language to a particular problem. These features
+work the same way in MetaPost but a few additional comments are needed.
+These chapters mention certain macros from plain \MF\ that are not in the
+plain macro package for MetaPost. Generally if it sounds as though it's
+for making fonts, MetaPost doesn't have it. Remember that \lit{beginfig}
+and \lit{endfig} play the role of \MF's \lit{beginchar} and \lit{endchar}.
+Look in the file \lit{plain.mp} in the standard macro area if there is any
+doubt about what macros are predefined. This file is also a good source of
+examples.
+
+Chapter 17 explains how the \lit{interim} statement makes temporary changes
+to internal quantities. This works the same way in MetaPost except that
+the example involving {\it autorounding} is inappropriate because MetaPost
+doesn't have that particular quantity. Here is a complete list of the
+internal quantities found in \MF\ but not MetaPost:
+$$\vcenter{\hsize=.8\hsize \raggedright \multiply\rightskip by3 \textt\noindent
+ \lit{autorounding}, \lit{fillin}, \lit{granularity}, \lit{hppp},
+ \lit{proofing}, \lit{smoothing}, \lit{tracingedges},
+ \lit{tracingpens}, \lit{turningcheck}, \lit{vppp}, \lit{xoffset},
+ \lit{yoffset}}
+$$
+The following additional quantities are defined in plain \MF\ but not in
+plain MetaPost:
+$$\vcenter{\hsize=.8\hsize \raggedright \multiply\rightskip by3 \textt\noindent
+ \lit{pixels\_per\_inch}, \lit{blacker}, \lit{o\_correction},
+ \lit{displaying}, \lit{screen\_rows}, \lit{screen\_cols},
+ \lit{currentwindow}}
+$$
+
+There are also some internal quantities that are unique to MetaPost.
+The \lit{linecap} and \lit{linejoin} parameters have already been mentioned.
+There is also a \lit{miterlimit} parameter that behaves like the similarly
+named parameter in PostScript. Another parameter, \lit{tracing\_lost\_chars}
+suppresses error messages about attempts to typeset missing characters.
+This is probably only relevant when using string parameters in the labeling
+macros since expressions generated by \lit{btex} $\ldots$ \lit{etex}
+blocks are not likely to use missing characters.
+
+The \lit{prologues} parameter was referred to earlier when we recommended
+setting it to one when including MetaPost output in a {\it troff\/} document.
+Any positivie value causes the output files to be ``conforming PostScript''
+that assumes only standard Adobe fonts are used. This makes the output
+more portable but on most implementations, it precludes the use of the use
+of \TeX\ fonts such as \lit{cmr10}. Software for sending \TeX\ output to
+PostScript printers generally downloads such fonts one character at a time
+and does not make them available in included PostScript figures.
+
+Plain MetaPost also has
+internals \lit{bboxmargin}, \lit{labeloffset} and \lit{ahangle}
+as well as \lit{defaultscale} which controls the size of the default label
+font as explained above. The \lit{bboxmargin} parameter is the amount of
+extra space that the \lit{bbox} operator leaves; \lit{labeloffset} gives the
+distance by which labels are offset from the point being labeled;
+\lit{ahangle} is the angle of the pointed ends of arrowheads
+($45^\circ$ by default). There is also a path \lit{ahcirc} that controls
+the size of the arrowheads. The statement
+$$ \lit{ahcirc := fullcircle scaled d} $$
+changes the arrowhead length to $\lit{d}/2$.
+
+The only relevant new material in {\sl The \MF book\/} not mentioned so far
+is in Chapters 21--22 and Appendix~D. Chapters 23 and~24 do not apply to
+MetaPost at all. The grammar given in Chapters 25 and~26 isn't exactly a
+grammar of MetaPost, but most of the differences have been mentioned above.
+There are \lit{redpart}, \lit{bluepart}, and \lit{greenpart} operators for
+colors and there is no \lit{totalweight} operator. The new primitive for
+label text in pictures is
+$$ \descr{picture secondary} \rightarrow
+ \descr{picture secondary} \lit{ infont } \descr{string primary}
+$$
+Bounding box information can be obtained via the operators
+\begin{eqnarray*}
+ \descr{pair primary} &\rightarrow& \descr{corner selector}
+ \descr{picture primary}\\
+ \descr{corner selector} &\rightarrow& \lit{llcorner} \mid \lit{urcorner}
+ \mid \lit{lrcorner} \mid \lit{urcorner}
+\end{eqnarray*}
+The main reason for having these in the MetaPost language is for measuring
+text but they work for pictures containing any mixture of text and graphics.
+
+The command
+$$ \lit{special }\descr{string expression} $$
+adds a line of text at the beginning of the next output file. For instance,
+the following commands add PostScript definitions that allow MetaPost output
+to use the built-in font \lit{Times-Roman}.
+$$ \startverbatim
+special "/Times-Roman /Times-Roman def";
+special "/fshow {exch findfont exch scalefont setfont show}";
+special " bind def";
+%stopverbatim
+$$
+A similar definition is generated automatically when you set \lit{prologues:=1}.
+With \lit{prologues=0}, it is assumed that the program that translates \TeX\
+output and includes PostScript figures will add the necessary definition.%
+\footnote{A full description of how to avoid including your
+output in a \TeX\ document is beyond the scope of this documentation.
+MetaPost output generated with \lit{prologues:=1} can be sent directly to a
+PostScript printer if it uses only built-in fonts like \lit{Helvetica}.}
+
+Another new feature of MetaPost that needs further explanation is the idea of
+a dash pattern. It is easiest if you can just get by with the dash pattern
+called \lit{evenly} that is defined in plain MetaPost, but it seems necessary
+to give the exact rules just in case they are needed.
+
+A dash pattern is a picture containing one or more horizontal
+line segments. It doesn't matter what pen is used to draw the line segments.
+MetaPost behaves as though the dash pattern is replicated to form an
+infinitely long horizontal dashed line to be used as a template for dashed
+lines. For example, the following commands create a dash pattern~\lit{dd}:
+$$\startverbatim
+draw (1,0)..(3.0); draw (5,0)..(6,0);
+picture dd; dd=currentpicture; clearit;
+%stopverbatim
+$$
+Lining up an infinite number of copies of \lit{dd} produces a set of line
+segments
+$$ \{\,(5i,0)\ldots(5i+3,0) \mid \hbox{for all integer $i$}\,\}. $$
+This template is used by starting from the $y$-axis and going to the right,
+producing dashes $3bp$ long separated by gaps of length $2bp$.
+
+In this example, successive copies of \lit{dd} are offset by $5bp$ because
+the range of $x$ coordinates covered by the line segments in \lit{dd} is
+$6-1$ or $5bp$. The offset can be increased by shifting the dash pattern
+vertically so that it lies at a $y$-coordinate greater that $5bp$ in
+absolute value. The rule is that the horizontal offset between copies of
+the dash pattern is the maximum of $|y|$ and the range of $x$-coordinates.
+
+\bigbreak
+\centerline{\bf Making Boxes}
+\nobreak\medskip
+There are auxiliary macros not included in plain MetaPost that make it
+convenient to do things that {\it pic} is good at. What follows
+is a description of how to use the macros contained in the file \lit{boxes.mp}.
+This may be of some interest to users who don't need these macros but want to
+see additional examples of what can be done in MetaPost.
+
+The main idea is that one should say
+$$ \lit{boxit} \descr{suffix}(\descr{picture expression}) $$
+in order to create pair variables $\descr{suffix}\lit{.c}$,
+$\descr{suffix}\lit{.n}$, $\descr{suffix}\lit{.e}$, etc. These can then be
+used for positioning the picture before drawing it with a separate command such
+as
+$$ \lit{drawboxed}(\descr{suffix}) $$
+The command \lit{boxit.bb(pic)} makes \lit{bb.c} the position where the center
+of picture \lit{pic} is to be placed and defines \lit{bb.sw}, \lit{bb.se},
+\lit{bb.ne}, and \lit{bb.nw} to be the corners of a rectangular path that will
+surround the resulting picture. Variables \lit{bb.dx} and \lit{bb.dy} give
+the spacing between the shifted version of \lit{pic} and the surrounding
+rectangle and \lit{bb.off} is the amount by which \lit{pic} has to be shifted
+to achieve all this.
+
+The \lit{boxit} macro gives linear equations that force \lit{bb.sw},
+\lit{bb.se}, $\ldots$ to be the corners of a rectangle aligned on the $x$ and
+$y$ axes with the picture \lit{pic} centered inside. The values of \lit{bb.dx},
+\lit{bb.dy}, and \lit{bb.c} are left unspecified so that the user can give
+equations for positioning the boxes. If no such equations are given, macros
+such as \lit{drawbox} can detect this and give default values.\vadjust{\okbreak}
+$$ \epsfbox{examples.6} $$
+
+\okbreak
+
+The following example shows how this works in practice.
+$$ \startverbatim
+input boxes
+beginfig(7); boxjoin(a.se=b.sw; a.ne=b.nw);
+boxit.a(btex $\cdots$ etex); boxit.ni(btex $n_i$ etex);
+boxit.di(btex $d_i$ etex); boxit.nii(btex $n_{i+1}$ etex);
+boxit.dii(btex $d_{i+1}$ etex); boxit.aa(pic_.a);
+boxit.nk(btex $n_k$ etex); boxit.dk(btex $d_k$ etex);
+di.dy = 2;
+drawboxed(a,ni,di,nii,dii,aa,nk,dk); label.lft("ndtable:", a.w);
+boxjoin(a.sw=b.nw; a.se=b.ne);
+interim defaultdy:=7;
+boxit.ba(); boxit.bb(); boxit.bc();
+boxit.bd(btex $\vdots$ etex); boxit.be(); boxit.bf();
+bd.dx=8; ba.ne=a.sw-(15,10);
+drawboxed(ba,bb,bc,bd,be,bf); label.lft("hashtab:",ba.w);
+def ndblock suffix $ =
+ boxjoin(a.sw=b.nw; a.se=b.ne);
+ forsuffixes $$=$a,$b,$c: boxit$$(); ($$dx,$$dy)=(5.5,4);
+ endfor; enddef;
+ndblock nda; ndblock ndb; ndblock ndc;
+nda.a.c-bb.c = ndb.a.c-nda.c.c = (whatever,0);
+xpart ndb.c.se = xpart ndc.a.ne = xpart di.c;
+ndc.a.c - be.c = (whatever,0);
+drawboxes(nda.a,nda.b,nda.c,ndb.a,ndb.b,ndb.c,ndc.a,ndc.b,ndc.c);
+drawarrow bb.c .. nda.a.w;
+drawarrow be.c .. ndc.a.w;
+drawarrow nda.c.c .. ndb.a.w;
+drawarrow nda.a.c{right}..{curl0}ni.c cutafter bpath ni;
+drawarrow nda.b.c{right}..{curl0}di.c cutafter bpath di;
+drawarrow ndc.a.c{right}..{curl0}nii.c cutafter bpath nii;
+drawarrow ndc.b.c{right}..{curl0}dii.c cutafter bpath dii;
+drawarrow ndb.a.c{right}..nk.c cutafter bpath nk;
+drawarrow ndb.b.c{right}..dk.c cutafter bpath dk;
+x.ptr=xpart aa.c; y.ptr=ypart ndc.a.ne;
+drawarrow subpath (0,.7) of (z.ptr..{left}ndc.c.c);
+label.rt(btex ndblock etex, z.ptr); endfig;
+%stopverbatim
+$$
+It is instructive to compare the MetaPost output below with the similar figure
+in the {\it pic} manual \cite{ke:pic}.\vadjust{\okbreak}
+$$ \epsfbox{examples.7} $$
+
+The second line of input for the above figure contains
+$$ \lit{boxjoin(a.se=b.sw; a.ne=b.nw)} $$
+This causes boxes to line up horizontally by giving additional equations that
+are invoked each time some box \lit{a} is followed by some other box~\lit{b}.
+These equations are first invoked on the next line when box~\lit{a} is followed
+by box~\lit{ni}. This yields
+$$ \lit{a.se=ni.sw; a.ne=ni.nw} $$
+The next pair of boxes is box~\lit{ni} and box~\lit{di}. This time the
+implicitly generated equations are
+$$ \lit{ni.se=di.sw; ni.ne=di.nw} $$
+This process continues until a new \lit{boxjoin} is given. In this case the
+new declaration is
+$$ \lit{boxjoin(a.sw=b.nw; a.se=b.ne)} $$
+which causes boxes to be stacked below each other.
+
+After calling \lit{boxit} for the first eight boxes \lit{a} through \lit{dk},
+the example gives the single equation $\lit{di.dy}=2$ followed by a call to
+\lit{drawboxed} that draws the eight boxes with the given text inside of them.
+The equation forces there to be $2bp$ of space above and below the contents
+of box~\lit{di} (the label ``$d_i$''). Since this doesn't fully specify the
+sizes and positions of the boxes, the \lit{drawboxed} macro starts by
+selecting default values, setting \lit{a.dx} through \lit{dk.dx} equal to
+the default value of $3bp$.
+
+The argument to boxit can be omitted as in \lit{boxit.ba()}
+or \lit{boxit.bb()}. This is like calling \lit{boxit} with an empty picture.
+Alternatively the argument can be a string expression instead of a picture
+expression in which case the string is typeset in the default font.
+
+In addition to the corner points \lit{a.sw}, \lit{a.se}, $\ldots$, a command
+like \lit{boxit.a} defines points \lit{a.w}, \lit{a.s}, \lit{a.e} and
+\lit{a.n} at the midpoints of the outer rectangle.
+If this bounding rectangle is needed for something other than just being drawn
+by the \lit{drawboxed} macro, it can be referred to as \lit{bpath.a} or in
+general
+$$ \lit{bpath} \descr{box name} $$
+
+The \lit{bpath} macro is used in the arguments to \lit{drawarrow} in the
+previous example. For instance
+$$ \lit{nda.a.c\char`\{right\char`\}..\char`\{curl0\char`\}ni.c} $$
+is a path from the center of box \lit{nda.a} to the center of box \lit{ni}.
+Following this with ``\lit{cutafter} \lit{bpath.ni}'' makes the arrow
+go towards the center of the box but stop when it hits the outer rectangle.
+
+The next example also uses this technique of cutting connecting arrows when
+they hit a bounding path, but in this case the bounding paths are circles
+and ovals instead of rectangles. The circles and ovals are created by using
+\lit{circleit} in place of \lit{boxit}. Saying \lit{circleit.a(pic)}
+defines points \lit{a.c}, \lit{a.s}, \lit{a.e}, \lit{a.n}, \lit{a.w}
+and distances \lit{a.dx} and \lit{a.dy}. These variables describe how the
+picture is centered in an oval as can be seen from the following
+diagram:\vadjust{\okbreak}
+$$ \epsfbox{examples.8} $$
+
+\okbreak
+
+Here is the input for the figure that uses \lit{circleit}:
+$$\startverbatim
+beginfig(9);
+vardef cuta(suffix a,b) expr p =
+ drawarrow p cutbefore bpath.a cutafter bpath.b;
+ point .5*length p of p
+enddef;
+vardef self@# expr p =
+ cuta(@#,@#) @#.c{curl0}..@#.c+p..{curl0}@#.c enddef;
+verbatimtex
+ \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
+circleit.aa("Start"); aa.dx=aa.dy;
+circleit.bb(btex \stk B{(a|b)^*a} etex);
+circleit.cc(btex \stk C{b^*} etex);
+circleit.dd(btex \stk D{(a|b)^*ab} etex);
+circleit.ee("Stop"); ee.dx=ee.dy;
+numeric hsep;
+bb.c-aa.c = dd.c-bb.c = ee.c-dd.c = (hsep,0);
+cc.c-bb.c = (0,.8hsep);
+xpart(ee.e - aa.w) = 3.8in;
+drawboxed(aa,bb,cc,dd,ee);
+label.ulft(btex$b$etex, cuta(aa,cc) aa.c{dir50}..cc.c);
+label.top(btex$b$etex, self.cc(0,30pt));
+label.rt(btex$a$etex, cuta(cc,bb) cc.c..bb.c);
+label.top(btex$a$etex, cuta(aa,bb) aa.c..bb.c);
+label.llft(btex$a$etex, self.bb(-20pt,-35pt));
+label.top(btex$b$etex, cuta(bb,dd) bb.c..dd.c);
+label.top(btex$b$etex, cuta(dd,ee) dd.c..ee.c);
+label.lrt(btex$a$etex, cuta(dd,bb) dd.c..{dir140}bb.c);
+label.bot(btex$a$etex,
+ cuta(ee,bb) ee.c..tension1.3 ..{dir115}bb.c);
+label.urt(btex$b$etex,
+ cuta(ee,cc) ee.c{(cc.c-ee.c)rotated-15}..cc.c);
+endfig;
+%stopverbatim
+$$
+The ``boxes'' produced when using \lit{circleit} come out circular unless
+something forces a different aspect ratio.\vadjust{\okbreak}
+$$ \epsfbox{examples.9} $$
+
+In the above figure, the equations \lit{aa.dx=aa.dy} and \lit{ee.dx=ee.dy} after
+$$ \lit{circleit.aa("Start")}
+ \quad{\rm and}\quad \lit{circleit.ee("Stop")}
+$$
+make the start and stop nodes non-circular.
+
+The general rule is that $\lit{bpath.}c$ comes out circular if
+$c\lit{.dx}$, $c\lit{.dy}$, and $c\lit{.dx}-c\lit{.dy}$ are all unspecified.
+Otherwise the macros select an oval just big enough to contain the given
+picture. (The margin of safety is given by the internal parameter
+\lit{circmargin}).
+
+There is also a \lit{pic} macro that makes $\lit{pic.}c$ the picture that
+goes inside $\lit{bpath.}c$ In addition to the \lit{drawboxed} macro
+that draws the picture and the surrounding rectangle or oval, there are
+\lit{drawunboxed} and \lit{drawboxes} macros that draw the pictures and
+the surrounding paths separately.
+
+\section{Implementation}
+\label{impsec}
+
+The MetaPost interpreter is written in Knuth's {\tt WEB} language which
+can be thought of as PASCAL with macros. This choice allows the
+sharing of code with the \MF\ interpreter.~\cite{kn:d} Indeed, about
+three fourths of the code in the main source file {\tt mp.web} is copied
+from this source by permission from the author.
+
+In accordance with the standard methodology for {\tt WEB} programs,
+parts of the program that are specific to the UNIX\footnote{UNIX is a
+registered trademark of UNIX System Laboratories.} system are given in a
+separate file {\tt mp.ch} that
+the {\tt tangle} processor merges with {\tt mp.web} to form a PASCAL
+program. (It is then automatically translated into C using a
+special-purpose translator that is included with the UNIX version
+of \TeX.) The only other code required by the MetaPost interpreter
+is a short external C program {\tt mpext.c} and a small include file
+{\tt mp.h} to tie it all together.
+
+In addition to the main interpreter, there are some programs that control
+the translation of typesetting commands in \lit{btex} $\ldots$ \lit{etex}
+blocks. When the interpreter encounters \lit{btex} in some input file
+\lit{foo.mp}, it needs to start reading from an auxiliary file \lit{foo.mpx}.
+This file should contain translations of the \lit{btex} $\ldots$ \lit{etex}
+blocks in \lit{foo.mp} into low-level MetaPost commands. If \lit{foo.mpx} is
+out of date or does not exist, the MetaPost interpreter invokes a shell script
+that generates the file.
+
+The generation of an auxiliary file \lit{foo.mpx} from an input file
+\lit{foo.mp} is a three step process: a C~program called \lit{mptotex}
+strips out the \TeX\ commands; then \TeX\ produces a binary file that
+gives low-level typesetting instructions; and finally, a {\tt WEB} program
+\lit{dvitomp} writes equivalent MetaPost commands in the \lit{foo.mpx}
+file. When using troff, C~programs \lit{mptotr} and \lit{dmp} replace
+\lit{mptotex} and \lit{dvitomp}.
+
+
+
+\bibliographystyle{plain}
+\bibliography{mpintro}
+
+
+\end{document}
diff --git a/Master/texmf-dist/doc/metapost/base/source/mpman.bib b/Master/texmf-dist/doc/metapost/base/source/mpman.bib
new file mode 100644
index 00000000000..ef846d5a79b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/mpman.bib
@@ -0,0 +1,80 @@
+@string{dcg = "Discrete and Computational Geometry"}
+
+@techreport{CSTR116,
+ author = "Kernighan, Brian W.",
+ title = "{PIC}---A Graphics Language for Typesetting",
+ type = "Computing Science Technical Report",
+ number = 116,
+ institution = "AT\&T Bell Laboratories",
+ address = "Murray Hill, New Jersey",
+ year = 1984
+}
+@incollection{ke:pic,
+ author = "Kernighan, Brian W.",
+ title = "Pic---A Graphics Language for Typesetting",
+ booktitle = "Unix Research System Papers, Tenth Edition",
+ publisher = "AT\&T Bell Laboratories",
+ pages = "53--77",
+ year = 1990
+}
+@book{kn:a,
+ author = "D. E. Knuth",
+ note = "Volume A of {\it Computers and Typesetting}",
+ title = "The {\TeX}book",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@book{kn:c,
+ author = "D. E. Knuth",
+ note = "Volume C of {\it Computers and Typesetting}",
+ title = "The {\MF}book",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@article{kn:mf3,
+ author = "D. E. Knuth",
+ title = "The New Versions of {\TeX} and {\MF}",
+ journal = "{TUG}boat, the\/ {\TeX} User's Group Newsletter",
+ volume = 10,
+ number = 3,
+ pages = "325--328",
+ month = nov,
+ year = 1989
+}
+@book{kn:e,
+ author = "D. E. Knuth",
+ note = "Volume E of {\it Computers and Typesetting}",
+ title = "Computer Modern Typefaces",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@book{ad:red,
+ author = "{Adobe Systems Inc.}",
+ title = "{P}ost{S}cript Language Reference Manual",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@article{ho:mp1,
+ author = "J. D. Hobby",
+ title = "A {\MF}-like System with {P}ost{S}cript Output",
+ journal = "{TUG}boat, the\/ {\TeX} User's Group Newsletter",
+ volume = 10,
+ number = 4,
+ pages = "505--512",
+ month = dec,
+ year = 1989
+}
+@article{ho:splin,
+ key = "Hobby",
+ author = "J. D. Hobby",
+ title = "Smooth, Easy to Compute Interpolating Splines",
+ journal = dcg,
+ volume = 1,
+ number = 2,
+ pagest = "123--140",
+ year = 1986
+} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/base/source/mpman.ist b/Master/texmf-dist/doc/metapost/base/source/mpman.ist
new file mode 100644
index 00000000000..c808a5544bf
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/mpman.ist
@@ -0,0 +1,4 @@
+% MakeIndex style file mpman.ist
+
+% @ is a valid character in some entries
+actual '?' % ? instead of @
diff --git a/Master/texmf-dist/doc/metapost/base/source/mpman.tex b/Master/texmf-dist/doc/metapost/base/source/mpman.tex
new file mode 100644
index 00000000000..4c75733f3ba
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/mpman.tex
@@ -0,0 +1,5483 @@
+\documentclass{article} % article is NOT the original style
+\usepackage{makeidx}
+\usepackage{fancyvrb}
+\usepackage{ctabbing}
+\RecustomVerbatimEnvironment
+ {verbatim}{BVerbatim}{baseline=c}
+\usepackage{epsf}
+\usepackage[textwidth=6in,textheight=8.75in]{geometry}
+\usepackage{tocloft}
+\setlength\cftbeforesecskip{1.5ex plus 0.2ex minus 0.1ex}
+
+ \makeatletter
+ \def\logo{\global\font\logo=logo10 at1\@ptsize\p@ \logo}
+ \def\logosl{\global\font\logosl=logosl10 at1\@ptsize\p@ \logosl}
+ \def\MF{{\ifdim \fontdimen\@ne\font >\z@ \def\logo{\logosl}\fi
+ {\logo META}\-{\logo FONT}}}
+ \makeatother
+
+% \def\MF{{META\-FONT}} % Replacement for the above when using times.sty
+
+
+\newfont\psyvii{rpsyr at 7pt}
+\newcommand\reg{$^{\hbox{\psyvii\char'322}}$} % Registered trademark
+
+\newcommand\descr[1]{{\langle\hbox{#1}\rangle}}
+\newcommand\invisgap{\nobreak\hskip0pt\relax}
+\newcommand\tdescr[1]{$\langle$\invisgap#1\invisgap$\rangle$}
+
+\newcommand\pl{\dag}
+\newcommand\bx{\ddag}
+
+\newcommand\mathcenter[1]{\vcenter{\hbox{#1}}}
+
+
+\renewcommand{\topfraction}{.85}
+\renewcommand{\bottomfraction}{.7}
+\renewcommand{\textfraction}{.15}
+\renewcommand{\floatpagefraction}{.66}
+\renewcommand{\dbltopfraction}{.66}
+\renewcommand{\dblfloatpagefraction}{.66}
+\setcounter{topnumber}{9}
+\setcounter{bottomnumber}{9}
+\setcounter{totalnumber}{20}
+\setcounter{dbltopnumber}{9}
+
+\makeindex
+
+\begin{document}
+\VerbatimFootnotes
+\author{John D. Hobby}
+\title{A User's Manual for MetaPost}
+\date{}
+\maketitle
+
+\begin{abstract}
+The MetaPost system implements a picture-drawing language very much like Knuth's
+\MF\ except that it outputs PostScript commands instead of run-length-encoded
+bitmaps. MetaPost is a powerful language for producing figures for documents
+to be printed on PostScript printers. It provides easy access to all the
+features of PostScript and it includes facilities for integrating text and
+graphics.
+
+This document serves as an introductory user's manual. It does not require
+knowledge of \MF\ or access to {\it The \MF book}, but both are beneficial.
+An appendix explains the differences between MetaPost and \MF.
+\end{abstract}
+\thispagestyle{empty}
+\newpage
+\setcounter{page}{1}
+\pagestyle{plain}
+\pagenumbering{roman}
+\tableofcontents
+\newpage
+\setcounter{page}{1}
+\pagestyle{headings}
+\pagenumbering{arabic}
+\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}
+
+\section{Introduction}
+\label{intro}
+
+MetaPost is a programming language much like Knuth's \MF\footnote{\MF\ is a
+trademark of Addison Wesley Publishing company.}\index{metafont?\MF}~\cite{kn:c}
+except that it outputs PostScript programs instead of bitmaps. Borrowed from \MF\
+are the basic tools for creating and manipulating pictures. These include numbers,
+coordinate pairs, cubic splines, affine transformations, text strings, and boolean
+quantities. Additional features facilitate integrating text and graphics and
+accessing special features of PostScript\footnote{PostScript is a
+trademark of Adobe Systems Inc.}\index{PostScript} such as clipping, shading, and
+dashed lines.
+Another feature borrowed from \MF\ is the ability to solve linear equations
+that are given implicitly, thus allowing many programs to be written in a
+largely declarative style. By building complex operations
+from simpler ones, MetaPost achieves both power and flexibility.
+
+MetaPost is particularly
+well-suited to generating figures for technical documents where some aspects of a
+picture may be controlled by mathematical or geometrical constraints that are
+best expressed symbolically. In other words, MetaPost is not meant to take the
+place of a freehand drawing tool or even an interactive graphics editor.
+It is really a programming language for generating graphics, especially figures
+for \TeX\footnote{\TeX\ is a trademark of the American Mathematical
+Society.}\index{TeX?\TeX} and troff\index{troff} documents.
+The figures can be integrated into a \TeX\ document via a freely available
+program called {\tt dvips}\index{dvips} as shown in
+Figure~\ref{fig0}.\footnote{The C
+source for {\tt dvips} comes with the web2c \TeX\ distribution. Similar programs
+are available from other sources.} A similar procedure works with troff: the
+{\tt dpost} output processor includes PostScript figures when they are
+requested via troff's {\tt \char`\\X} command.
+
+\begin{figure}[htp]
+$$ \def\fbox#1{\hbox{\vrule
+ \vbox{\hrule\kern5pt\hbox{\kern5pt\hbox{#1}\kern5pt}\kern5pt\hrule}%
+ \vrule}}
+ \vbox{
+ \halign{$\hfil#\hfil$&\hskip1in$\hfil#\hfil$\cr
+ \hbox{Figures in MetaPost}&
+ \hbox{\TeX\ Document}
+ \cr
+ \bigg\downarrow&
+ \bigg\downarrow
+ \cr
+ \fbox{\vrule height.2in depth.133in width0pt
+ \kern .1in MetaPost\kern.1in}
+ &
+ \fbox{\vrule height.2in depth.133in width0pt
+ \kern .167in \TeX\kern.167in}
+ \cr
+ \bigg\downarrow&
+ \bigg\downarrow
+ \cr
+ \hbox{Figures in PostScript}&
+ \hbox{{\tt dvi} file}
+ \cr
+ \bigg\downarrow&
+ \bigg\downarrow
+ \cr
+ \fbox{\vrule height.2in depth.133in width0pt
+ \kern 1in {\tt dvips} \kern1in}
+ \span\omit\cr
+ \bigg\downarrow\span\omit\cr
+ \hbox{PostScript}\span\omit\cr}}
+$$
+\caption[A diagram of the processing for a document with MetaPost figures]
+ {A diagram of the processing for a \TeX\ document with figures
+ in MetaPost}
+\label{fig0}
+\end{figure}
+
+To use MetaPost, you prepare an input file containing MetaPost code and then
+invoke MetaPost, usually by giving a command of the form\index{mp?\texttt{mp}}
+$$ {\tt mp}\, \descr{file name} $$
+(This syntax could be system dependent).
+MetaPost input files\index{files!input} normally have names ending ``{\tt .mp}''
+but this part of the name can be omitted when invoking MetaPost. For an input
+file {\tt foo.mp}
+$$ \hbox{\tt mp foo} $$
+invokes MetaPost and produces output files with names like {\tt foo.1} and
+{\tt foo.2}. Any terminal I/O is summarized in a
+transcript\index{files!transcript}\index{transcript file}
+file called {\tt foo.log}. This includes
+error messages and any MetaPost commands entered interactively.%
+\footnote{A {\tt *}\index{*?\texttt{*}} prompt is used for interactive input and a
+{\tt **}\index{**?\texttt{**}} prompt
+indicates that an input file name is expected. This can be avoided by invoking
+MetaPost on a file that ends with an {\tt end}\index{end?\texttt{end}} command.}
+The transcript file starts with a banner line that tells what version of MetaPost
+you are using.
+
+This document introduces the MetaPost language, beginning with the features that
+are easiest to use and most important for simple applications. The first few
+sections describe the language as it appears to the novice user with key parameters
+at their default values. Some features described in these sections are part of a
+predefined macro package called Plain. Later sections summarize the
+complete language and distinguish between primitives and preloaded macros
+from the Plain macro package\index{Plain macros}.
+Since much of the language is identical to Knuth's \MF, the appendix gives a
+detailed comparison so that advanced users can learn more about MetaPost by
+reading {\sl The \MF book\/}.~\cite{kn:c}
+
+
+\section{Basic Drawing Statements}
+\label{basic}
+
+The simplest drawing statements are the ones that generate straight lines.
+Thus\index{draw?\texttt{draw}}\index{--?\texttt{--}}
+$$ \hbox{\verb|draw (20,20)--(0,0)|} $$
+draws\index{draw?\texttt{draw}} a diagonal line and
+$$ \hbox{\verb|draw (20,20)--(0,0)--(0,30)--(30,0)--(0,0)|} $$
+draws a polygonal line like this:
+$$ \epsfbox{manfig.0} $$
+
+What is meant by coordinates like \verb|(30,0)|? MetaPost uses the same default
+coordinate system that PostScript\index{PostScript} does. This means that
+\verb|(30,0)| is 30 units
+to the right of the origin, where a unit is $1\over72$ of an inch. We shall refer
+to this default unit as a
+{\sl PostScript point\/}\index{PostScript!point}\index{point!PostScript}
+to distinguish it from the standard printer's point\index{point!printer's}
+which is $1\over72.27$ inches.
+
+MetaPost uses the same names for units of measure that \TeX\ and \MF\ do. Thus
+\verb|bp|\index{bp?\texttt{bp}}\label{Dbp} refers to PostScript points (``big points'')
+and \verb|pt|\index{pt?\texttt{pt}}\label{Dpt} refers to printer's points.
+Other units of measure
+include \verb|in|\index{in?\texttt{in}}\label{Din} for inches,
+\verb|cm|\index{cm?\texttt{cm}}\label{Dcm} for centimeters,
+and \verb|mm|\index{mm?\texttt{mm}}\label{Dmm} for
+millimeters. For example,
+$$ \hbox{\verb|(2cm,2cm)--(0,0)--(0,3cm)--(3cm,0)--(0,0)|} $$
+generates a larger version of the above diagram. It is OK to say \verb|0| instead
+\verb|0cm| because {\tt cm} is really just a conversion factor and {\tt 0cm} just
+multiplies the conversion factor by zero. (MetaPost understands constructions
+like {\tt 2cm}\index{multiplication!implicit} as shorthand for \verb|2*cm|).
+
+It is often convenient to introduce your own scale factor, say $u$.
+Then you can define coordinates in terms of $u$ and decide later whether you want
+to begin with \verb|u=1cm| or \verb|u=0.5cm|. This gives you control over what
+gets scaled and what does not so that changing $u$ will not affect features such
+as line widths.
+
+There are many ways to affect the appearance of a line besides just changing its
+width, so the width-control mechanisms allow a lot of generality that we do not need
+yet.
+This leads to the strange looking statement\index{pickup?\texttt{pickup}}\index{pencircle?\texttt{pencircle}}%
+\index{scaled?\texttt{scaled}}
+$$ \hbox{\verb|pickup pencircle scaled 4pt|} $$
+for setting the line width for subsequent \verb|draw| statements to 4 points.
+(This is about eight times the default line width).
+
+With such a wide line width, even a line of zero length comes out as a big bold
+dot\index{dots}. We can use this to make a grid of bold dots by having one
+\verb|draw| statement
+for each grid point. Such a repetitive sequence of \verb|draw| statements is
+best written as a pair of nested loops:\index{loops}%
+\index{for?\texttt{for}}\index{endfor?\texttt{endfor}}
+$$\begin{verbatim}
+for i=0 upto 2:
+ for j=0 upto 2: draw (i*u,j*u); endfor
+endfor
+\end{verbatim}
+$$
+The outer loop runs for $i=0,1,2$ and the inner loop runs for $j=0,1,2$.
+The result is a three-by-three grid of bold dots as shown in Figure~\ref{fig1}.
+The figure also includes a larger version of the polygonal line diagram that we
+saw before.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(2);
+u=1cm;
+draw (2u,2u)--(0,0)--(0,3u)--(3u,0)--(0,0);
+pickup pencircle scaled 4pt;
+for i=0 upto 2:
+ for j=0 upto 2: draw (i*u,j*u); endfor
+endfor
+endfig;
+\end{verbatim}
+\quad \mathcenter{\epsfbox{manfig.2}}
+$$
+\caption{MetaPost commands and the resulting output}
+\label{fig1}
+\end{figure}
+
+Note that the program in Figure~\ref{fig1} starts with
+\verb|beginfig(2)|\index{beginfig?\texttt{beginfig}} and
+ends with \verb|endfig|\index{endfig?\texttt{endfig}}.
+These are macros that perform various administrative
+functions and ensure that the results of all the \verb|draw| statements get
+packaged up and translated into PostScript. A MetaPost input file normally
+contains a sequence of \verb|beginfig|, \verb|endfig| pairs with an
+{\tt end}\index{end?\texttt{end}}
+statement after the last one. If this file is named {\tt fig.mp}, the output
+from \verb|draw| statements between \verb|beginfig(1)| and the next \verb|endfig|
+is written in a file {\tt fig.1}\index{files!output}.
+In other words, the numeric argument to the \verb|beginfig| macro determines the
+name of the corresponding output file.
+
+What does one do with all the PostScript files? They can be included as figures
+in a \TeX\index{TeX?\TeX} or troff\index{troff} document if you have an
+output driver that can handle
+encapsulated PostScript figures. If your standard \TeX\ macro directory contains
+a file {\tt epsf.tex}\index{epsf.tex?\texttt{epsf.tex}}, you can probably include {\tt fig.1}
+in a \TeX\ document as follows:
+$$ \begin{array}{c}
+ \hbox{\verb|\input epsf |}\\
+ \vdots\\
+ \hbox{\verb|$$\epsfbox{fig.1}$$|}
+ \end{array}
+$$
+The \verb|\epsfbox| macro figures out how much room to leave for the figure and
+uses \TeX's \verb|\special| command to insert a request for {\tt fig.1}.
+
+It is also possible to include MetaPost output in a {\em troff\/} document.
+The {\tt -mpictures\/} macro package defines a command \verb|.BP| that includes
+an encapsulated PostScript file. For instance, the {\em troff\/} command
+$$ \hbox{\verb|.BP fig.1 3c 3c|} $$
+includes {\tt fig.1} and specifies that its height and width are both three
+centimeters.
+
+
+\section{Curves}
+\label{curves}
+
+MetaPost is perfectly happy to draw curved lines as well as straight ones.
+A \verb|draw| statement with the points separated by \verb|..| draws
+a smooth curve through the points. For example consider the result of
+$$ \hbox{\verb|draw z0..z1..z2..z3..z4|} $$
+after defining five points as follows:
+$$\begin{verbatim}
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+\end{verbatim}
+$$
+Figure~\ref{fig2} shows the curve with points \verb|z0| through \verb|z4|
+labeled.
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.3}
+$$
+\caption[A curve through points 0, 1, 2, 3, and 4]
+ {The result of {\tt draw z0..z1..z2..z3..z4}}
+\label{fig2}
+\end{figure}
+
+There are many other ways to draw a curved path through the same five points.
+To make a smooth closed curve, connect \verb|z4| back to the beginning by
+appending \verb|..cycle|\index{cycle?\texttt{cycle}} to the \verb|draw| statement as shown
+in Figure~\ref{fig3}a. It is also possible in a single \verb|draw| statement
+to mix curves and straight lines as shown in Figure~\ref{fig3}b. Just use
+\verb|--| where you want straight lines and \verb|..| where you want curves.
+Thus
+$$ \hbox{\verb|draw z0..z1..z2..z3--z4--cycle|} $$
+produces a curve through points 0,~1, 2, and~3, then a polygonal line from
+point~3 to point~4 and back to point~0. The result is essentially the same
+as having two draw statements
+\begin{eqnarray*}
+ \hbox{\verb|draw z0..z1..z2..z3|}\\
+\noalign{\hbox{and}}
+ \hbox{\verb|draw z3--z4--z0|}
+\end{eqnarray*}
+
+\begin{figure}[htp]
+$$ {\epsfbox{manfig.104} \atop (a)}
+ \qquad {\epsfbox{manfig.204} \atop (b)}
+$$
+\caption[Closed curves through five points]
+ {(a)~The result of {\tt draw z0..\linebreak[0]z1..\linebreak[0]%
+ z2..\linebreak[0]z3..\linebreak[0]z4..\linebreak[0]cycle};
+ (b)~the result of {\tt draw z0..\linebreak[0]z1..\linebreak[0]%
+ z2..\linebreak[0]z3--\linebreak[0]z4--\linebreak[0]cycle}.}
+\label{fig3}
+\end{figure}
+
+\subsection{B\'ezier Cubic Curves}
+
+When MetaPost is asked to draw a smooth curve through a sequence of points,
+it constructs a piecewise cubic curve with continuous slope and approximately
+continuous curvature\index{curvature}. This means that a path specification such
+as
+$$ \hbox{\verb|z0..z1..z2..z3..z4..z5|} $$
+results in a curve that can be defined parametrically\index{parameterization}
+as $(X(t),Y(t))$ for
+$0\le t\le5$, where $X(t)$ and $Y(t)$ are piecewise cubic functions. That is,
+there is a different pair of cubic functions for each integer-bounded
+$t$-interval. If ${\tt z0}=(x_0,y_0)$, ${\tt z1}=(x_1,y_1)$,
+${\tt z2}=(x_2,y_2)$, \ldots, MetaPost selects
+B\'ezier control\index{control points} points
+$(x_0^+,y_0^+)$, $(x_1^-,y_1^-)$, $(x_1^+,y_1^+)$, \ldots, where
+\begin{eqnarray*}
+ X(t+i) &=& (1-t)^3x_i + 3t(1-t)^2x_i^+ + 3t^2(1-t)x_{i+1}^- + t^3x_{i+1},\\
+ Y(t+i) &=& (1-t)^3y_i + 3t(1-t)^2y_i^+ + 3t^2(1-t)y_{i+1}^- + t^3y_{i+1}
+\end{eqnarray*}
+for $0\le t\le1$. The precise rules for choosing the B\'ezier control points
+are described in \cite{ho:splin} and in {\sl The \MF book\/}~\cite{kn:c}.
+
+In order for the path to have a continuous slope at $(x_i,y_i)$, the incoming
+and outgoing directions at $(X(i),Y(i))$ must match. Thus the vectors
+$$ (x_i-x_i^-,\,y_i-y_i^-) \qquad \hbox{and}
+ \qquad (x_i^+-x_i,\,y_i^+-y_i)
+$$
+must have the same direction; i.e., $(x_i,y_i)$ must be on the line segment
+between $(x_i^-,y_i^-)$ and $(x_i^+,y_i^+)$. This situation is illustrated
+in Figure~\ref{fig4} where the B\'ezier control points selected by MetaPost
+are connected by dashed lines. For those who are familiar with the interesting
+properties of this construction, MetaPost allows the control points to be
+specified directly in the following format:\index{controls?\texttt{controls}}
+$$ \begin{verbatim}
+draw (0,0)..controls (26.8,-1.8) and (51.4,14.6)
+ ..(60,40)..controls (67.1,61.0) and (59.8,84.6)
+ ..(40,90)..controls (25.4,94.0) and (10.5,84.5)
+ ..(10,70)..controls ( 9.6,58.8) and (18.8,49.6)
+ ..(30,50);
+\end{verbatim}
+$$
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.5}
+$$
+\caption[A curve and the control polygon]
+ {The result of {\tt draw z0..z1..z2..z3..z4} with the
+ automatically-selected B\'ezier control polygon illustrated by dashed
+ lines.}
+\label{fig4}
+\end{figure}
+
+\subsection{Specifying Direction, Tension, and Curl}
+\label{tenscurl}
+
+MetaPost provides many ways of controlling the behavior of a curved path without
+actually specifying the control points. For instance, some points on the path
+may be selected as vertical or horizontal extrema. If \verb|z1| is to be a
+horizontal extreme and \verb|z2| is to be a vertical extreme, you can specify
+that $(X(t),Y(t))$ should go upward at \verb|z1| and to the left at \verb|z2|:
+$$ \hbox{\verb|draw z0..z1{up}..z2{left}..z3..z4;|} $$
+The resulting shown in Figure~\ref{fig5} has the desired vertical and horizontal
+directions at \verb|z1| and \verb|z2|, but it does not look as smooth as the
+curve in Figure~\ref{fig2}. The reason is the large discontinuity in
+curvature\index{curvature}
+at \verb|z1|. If it were not for the specified direction at \verb|z1|, the
+MetaPost interpreter would have chosen a direction designed to make the curvature
+above \verb|z1| almost the same as the curvature below that point.
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.6}
+$$
+\caption[A curve and the control polygon]
+ {The result of {\tt draw z0..z1\char`\{up\char`\}..z2\char`\{left\char`\}%
+ ..z3..z4}.}
+\label{fig5}
+\end{figure}
+
+How can the choice of directions at given points on a curve determine whether
+the curvature will be continuous? The reason is that curves used in MetaPost
+come from a family where a path is determined by its endpoints and the
+directions there. Figures \ref{fig6} and~\ref{fig7} give a good idea of what
+this family of curves is like.
+
+\begin{figure}[htp]
+$$ \mathcenter{\epsfbox{manfig.7}} \quad
+\begin{verbatim}
+beginfig(7)
+for a=0 upto 9:
+ draw (0,0){dir 45}..{dir -10a}(6cm,0);
+endfor
+endfig;
+\end{verbatim}
+$$
+\caption{A curve family and the MetaPost instructions for generating it}
+\label{fig6}
+\end{figure}
+
+\begin{figure}[htp]
+$$ \mathcenter{\epsfbox{manfig.8}} \quad
+\begin{verbatim}
+beginfig(8)
+for a=0 upto 7:
+ draw (0,0){dir 45}..{dir 10a}(6cm,0);
+endfor
+endfig;
+\end{verbatim}
+$$
+\caption{Another curve family with the corresponding MetaPost instructions}
+\label{fig7}
+\end{figure}
+
+Figures \ref{fig6} and~\ref{fig7} illustrate a few new MetaPost features.
+The first is the {\tt dir}\index{dir?\texttt{dir}}\label{Ddirop} operator that takes an
+angle in degrees
+and generates a unit vector in that direction. Thus \verb|dir 0| is equivalent
+to {\tt right}\index{right?\texttt{right}}\label{Dright} and \verb|dir 90| is equivalent to
+{\tt up}\index{up?\texttt{up}}\label{Dup}. There are also predefined direction vectors
+{\tt left}\index{left?\texttt{left}}\label{Dleft}
+and {\tt down}\index{down?\texttt{down}}\label{Ddown} for {\tt dir 180}
+and {\tt dir 270}.
+
+The direction
+vectors given in \verb|{}| can be of any length, and they can come before a
+point as well as after one. It is even possible for a path specification
+to have directions given before and after a point. For example a path
+specification containing
+$$ \hbox{\verb|..{dir 60}(10,0){up}..|} $$
+produces a curve with a corner at $(10,0)$.
+
+Note that some of the curves in Figure~\ref{fig6} have points of
+inflection\index{inflections}.
+This is necessary in order to produce smooth curves in situations like
+Figure~\ref{fig3}a, but it is probably not desirable when dealing with vertical
+and horizontal extreme points as in Figure~\ref{fig8}a. If \verb|z1| is supposed
+to be the topmost point on the curve, this can be achieved by using
+\verb|...|\index{...?\texttt{...}}
+instead of \verb|..| in the path specification as shown in Figure~\ref{fig8}b.
+The meaning of \verb|...| is ``choose an inflection-free path between these
+points unless the endpoint directions make this impossible.'' (It would be
+possible to avoid inflections in Figure~\ref{fig6}, but not in Figure~\ref{fig7}).
+
+\begin{figure}[htp]
+$$ {\mathcenter{\epsfbox{manfig.109}} \atop
+ \hbox{\verb|draw z0{up}..z1{right}..z2{down}|}}
+ \quad
+ {\mathcenter{\epsfbox{manfig.209}} \atop
+ \hbox{\verb|draw z0{up}...z1{right}...z2{down}|}}
+$$
+\caption{Two {\tt draw} statements and the resulting curves.}
+\label{fig8}
+\end{figure}
+
+Another way to control a misbehaving path is to increase the
+``tension''\index{tension} parameter.
+Using \verb|..| in a path specification sets the tension parameter to the default
+value~1. If this makes some part of a path a little too wild, we can selectively
+increase the tension. If Figure~\ref{fig9}a is considered ``too wild,'' a
+{\tt draw} statement of the following form increases the tension between
+{\tt z1} and {\tt z2}:
+$$ \hbox{\verb|draw z0..z1..tension 1.3..z2..z3|} $$
+This produces Figure~\ref{fig9}b. For an asymmetrical effect like
+Figure~\ref{fig9}c, the \verb|draw| statement becomes
+$$ \hbox{\verb|draw z0..z1..tension 1.6 and 1..z2..z3|} $$
+The tension parameter can be less than one, but it must be at least $3\over4$.
+
+\begin{figure}[htp]
+$$ {\mathcenter{\epsfbox{manfig.110}} \atop (a)}
+ \quad
+ {\mathcenter{\epsfbox{manfig.210}} \atop (b)}
+ \quad
+ {\mathcenter{\epsfbox{manfig.310}} \atop (c)}
+$$
+\caption[Effects of changing the tension parameter]
+ {Results of {\tt draw z0..z1..tension} $\alpha$ {\tt and} $\beta$
+ {\tt ..z2..z3} for various $\alpha$ and $\beta$:
+ (a)~$\alpha=\beta=1$; (b)~$\alpha=\beta=1.3$;
+ (c)~$\alpha=1.5$, $\beta=1$.}
+\label{fig9}
+\end{figure}
+
+MetaPost paths also have a parameter called ``curl''\index{curl?\texttt{curl}} that affects
+the ends of a
+path. In the absence of any direction specifications, the first and last segments
+of a non-cyclic path are approximately circular arcs as in the $c=1$ case of
+Figure~\ref{fig10}. To use a different value for the curl parameter, specify
+\verb|{curl c}| for some other value of $c$. Thus
+$$ \hbox{\verb|draw z0{curl c}..z1..{curl c}z2|} $$
+sets the curl parameter for \verb|z0| and \verb|z2|. Small values of the curl
+parameter reduce the curvature\index{curvature} at the indicated path endpoints,
+while large values
+increase the curvature as shown in Figure~\ref{fig10}. In particular, a curl value
+of zero makes the curvature approach zero.
+
+\begin{figure}[htp]
+$$ {\mathcenter{\epsfbox{manfig.111}} \atop c=0}
+ \qquad
+ {\mathcenter{\epsfbox{manfig.211}} \atop c=1}
+ \qquad
+ {\mathcenter{\epsfbox{manfig.311}} \atop c=2}
+ \qquad
+ {\mathcenter{\epsfbox{manfig.411}} \atop c=\infty}
+$$
+\caption[Effects of changing the curl parameter]
+ {Results of {\tt draw z0\char`\{curl c\char`\}..z1..%
+ \char`\{curl c\char`\}z2} for various values
+ of the curl parameter~$c$.}
+\label{fig10}
+\end{figure}
+
+\subsection{Summary of Path Syntax}
+
+There are a few other features of MetaPost path syntax, but they are relatively
+unimportant. Since \MF\ uses the same path syntax, interested readers can refer
+to \cite[chapter 14]{kn:c}. The summary of path syntax in Figure~\ref{sypath}
+includes everything discussed so far including the \verb|--| and \verb|...|
+constructions which \cite{kn:c} shows to be macros rather than primitives.
+A few comments on the semantics are in order here: If there is a non-empty
+$\descr{direction specifier}$ before a $\descr{path knot}$ but not after it,
+or vice versa, the specified direction (or curl amount) applies to both the
+incoming and outgoing path segments. A similar arrangement applies when a
+$\descr{controls}$ specification gives only one $\descr{pair primary}$.
+Thus
+$$ \hbox{\verb|..controls (30,20)..|} $$
+is equivalent to
+$$ \hbox{\verb|...controls (30,20) and (30,20)..|} $$
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\descr{path expression} \rightarrow
+ \descr{path subexpression}$\\
+\qquad \= ${}\mid \descr{path subexpression} \descr{direction specifier}$\\
+\> ${}\mid \descr{path subexpression} \descr{path join}$ \verb|cycle|\\
+$\descr{path subexpression} \rightarrow
+ \descr{path knot}$\\
+\> ${}\mid \descr{path expression} \descr{path join} \descr{path knot}$\\
+$\descr{path join} \rightarrow
+ \hbox{\verb|--|}$\\
+\> ${}\mid \descr{direction specifier} \descr{basic path join}
+ \descr{direction specifier}$\\
+$\descr{direction specifier} \rightarrow
+ \descr{empty}$\\
+\> ${}\mid {}$\verb|{curl| $\descr{numeric expression}$\verb|}|\\
+\> ${}\mid {}$\verb|{|$\descr{pair expression}$\verb|}|\\
+\> ${}\mid {}$\verb|{|$\descr{numeric expression}$\verb|,|%
+ $\descr{numeric expression}$\verb|}|\\
+$\descr{basic path join} \rightarrow
+ \hbox{\verb|..|}
+ \mid \hbox{\verb|...|}
+ \mid \hbox{\verb|..|}\descr{tension}\hbox{\verb|..|}
+ \mid \hbox{\verb|..|}\descr{controls}\hbox{\verb|..|}$\\
+$\descr{tension} \rightarrow
+ \hbox{\verb|tension|}\descr{numeric primary}$\\
+\> ${}\mid \hbox{\verb|tension|}\descr{numeric primary}
+ \hbox{\verb|and|}\descr{numeric primary}$\\
+$\descr{controls} \rightarrow
+ \hbox{\verb|controls|}\descr{pair primary}$\\
+\> ${}\mid \hbox{\verb|controls|}\descr{pair primary}
+ \hbox{\verb|and|}\descr{pair primary}$
+\end{ctabbing}
+\caption{The syntax for path construction}
+\label{sypath}
+\end{figure}
+
+A pair of coordinates like \verb|(30,20)| or a \verb|z| variable that represents a
+coordinate pair is what Figure~\ref{sypath} calls a $\descr{pair primary}$.
+A $\descr{path knot}$ is similar except that it can take on other forms such as
+a path expression in parentheses. Primaries and expressions of various types will
+be discussed in full generality in Section~\ref{exprs}.
+
+
+\section{Linear Equations}
+\label{lin.eq}
+
+An important feature taken from \MF\ is the ability to solve linear
+equations so that programs can be written in a partially declarative fashion.
+For example, the MetaPost interpreter can read
+$$ \hbox{\verb|a+b=3; 2*a=b+3;|} $$
+and deduce that $a=2$ and $b=1$. The same equations can be written slightly more
+compactly by stringing them together with multiple equal signs:
+$$ \hbox{\verb|a+b = 2*a-b = 3;|} $$
+Whichever way you give the equations, you can then give the command\index{show?\texttt{show}}
+$$ \hbox{\tt show a,b;} $$
+to see the values of {\tt a} and {\tt b}. MetaPost responds by typing
+$$\begin{verbatim}
+>> 2
+>> 1
+\end{verbatim}
+$$
+
+Note that {\tt =}\index{=?\texttt{=}} is not an assignment operator; it simply declares
+that the left-hand side equals the right-hand side. Thus {\tt a=a+1} produces an
+error message complaining about an
+``inconsistent equation\index{Inconsistent equation?\texttt{Inconsistent equation}}.'' The way to increase
+the value of {\tt a} is to use the assignment\index{assignment} operator
+{\tt :=}\index{:=?\texttt{:=}} as follows:
+$$ \hbox{\tt a:=a+1;} $$
+In other words, {\tt :=} is for changing existing values while {\tt =} is for
+giving linear equations to solve.
+
+There is no restriction against mixing equations and assignment operations as in
+the following example:
+$$ \hbox{\tt a = 2; b = a; a := 3; c = a;} $$
+After the first two equations set {\tt a} and~{\tt b} equal to 2, the assignment
+operation changes {\tt a} to~3 without affecting {\tt b}. The final value of
+{\tt c} is 3 since it is equated to the new value of {\tt a}. In general, an
+assignment operation is interpreted by first computing the new value, then
+eliminating the old value from all existing equations before actually assigning
+the new value.
+
+\subsection{Equations and Coordinate Pairs}
+
+MetaPost can also solve linear equations involving coordinate pairs. We have
+already seen many trivial examples of this in the form of equations like
+$$ \hbox{\verb|z1=(0,.2in)|} $$
+Each side of the equation must be formed by adding or subtracting coordinate pairs
+and multiplying or dividing them by known numeric quantities. Other ways of
+naming pair-valued variables will be discussed later, but the
+${\tt z}\descr{number}$\index{z convention?{\tt z} convention} is convenient because it is
+an abbreviation for
+$$ \hbox{\tt (x}\descr{number} \hbox{\tt, y}\descr{number}\hbox{\tt)} $$
+This makes it possible to give values to \verb|z| variables by giving equations
+involving their coordinates. For instance, points {\tt z1}, {\tt z2}, {\tt z3},
+and~{\tt z6} in Figure~\ref{fig12} were initialized via the following equations:
+\begin{eqnarray*}
+ &&\hbox{\verb|z1=-z2=(.2in,0);|} \\
+ &&\hbox{\verb|x3=-x6=.3in;|} \\
+ &&\hbox{\verb|x3+y3=x6+y6=1.1in;|}
+\end{eqnarray*}
+Exactly the same points could be obtained by setting their values directly:
+$$ \begin{verbatim}
+z1=(.2in,0); z2=(-.2in,0);
+z3=(.3in,.6in); z6=(-.3in,1.2in);
+\end{verbatim}
+$$
+
+After reading the equations, the MetaPost interpreter knows the values of
+{\tt z1}, {\tt z2},
+{\tt z3}, and~{\tt z6}. The next step in the construction of Figure~\ref{fig12}
+is to define points {\tt z4} and {\tt z5} equally spaced along the line from
+{\tt z3} to {\tt z6}. Since this operation comes up often, MetaPost has a special
+syntax for it. This mediation construction\index{mediation}
+$$ \hbox{\verb|z4=1/3[z3,z6]|} $$
+means that {\tt z4} is $1\over3$ of the way from $z3$ to $z6$; i.e.,
+$$ {\tt z4}={\tt z3}+{1\over3}({\tt z6}-{\tt z3}). $$
+Similarly
+$$ \hbox{\verb|z5=2/3[z3,z6]|} $$
+makes {\tt z5} $2\over3$ of the way from $z3$ to $z6$.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(13);
+z1=-z2=(.2in,0);
+x3=-x6=.3in;
+x3+y3=x6+y6=1.1in;
+z4=1/3[z3,z6];
+z5=2/3[z3,z6];
+z20=whatever[z1,z3]=whatever[z2,z4];
+z30=whatever[z1,z4]=whatever[z2,z5];
+z40=whatever[z1,z5]=whatever[z2,z6];
+draw z1--z20--z2--z30--z1--z40--z2;
+pickup pencircle scaled 1pt;
+draw z1--z2;
+draw z3--z6;
+endfig;
+\end{verbatim}
+\quad \mathcenter{\epsfbox{manfig.13}}
+$$
+\caption[MetaPost code and figure using linear equations]
+ {MetaPost commands and the resulting figure. Point labels have been
+ added to the figure for clarity.}
+\label{fig12}
+\end{figure}
+
+Mediation can also be used to say that some point is at an unknown position along
+the line between two known points. For instance, we could a introduce new
+variable {\tt aa} and write something like
+$$ \hbox{\verb|z20=aa[z1,z3];|} $$
+This says that {\tt z20} is some unknown fraction {\tt aa} of the way along the
+line between {\tt z1} and {\tt z3}. Another such equation involving a different
+line is sufficient to fix the value of {\tt z20}. To say that {\tt z20} is at
+the intersection of the {\tt z1}-{\tt z3} line and the {\tt z2}-{\tt z4} line,
+introduce another variable {\tt ab} and set
+$$ \hbox{\verb|z20=ab[z2,z4];|} $$
+This allows MetaPost to solve for {\tt x20}, {\tt y20}, {\tt aa}, and {\tt ab}.
+
+It is a little painful to keep
+thinking up new names like {\tt aa} and {\tt ab}. This can be avoided by using
+a special feature called {\tt whatever}\index{whatever?\texttt{whatever}}\label{Dwhatev}.
+This macro generates a new anonymous
+variable each time it appears. Thus the statement
+$$ \hbox{\verb|z20=whatever[z1,z3]=whatever[z2,z4]|} $$
+sets {\tt z20} as before, except it uses {\tt whatever} to generate two
+{\em different\/} anonymous variables instead of {\tt aa} and {\tt ab}.
+This is how Figure~\ref{fig12} sets {\tt z20}, {\tt z30}, and
+{\tt z40}.
+
+\subsection{Dealing with Unknowns}
+
+A system of equations such as those used in Figure~\ref{fig12} can be given in
+any order as long as all the equations are linear and all the variables can
+be determined before they are needed. This means that the equations
+\begin{eqnarray*}
+ && \hbox{\verb|z1=-z2=(.2in,0);|}\\
+ && \hbox{\verb|x3=-x6=.3in;|}\\
+ && \hbox{\verb|x3+y3=x6+y6=1.1in;|}\\
+ && \hbox{\verb|z4=1/3[z3,z6];|}\\
+ && \hbox{\verb|z5=2/3[z3,z6];|}
+\end{eqnarray*}
+suffice to determine {\tt z1} through {\tt z6}, no matter what order the equations
+are given in. On the other hand
+$$ \hbox{\verb|z20=whatever[z1,z3]|} $$
+is legal only when a known value has previously been specified for the difference
+${\tt z3}-{\tt z1}$, because the equation is equivalent
+to\index{mediation}
+$$ \hbox{\verb|z20 = z1 + whatever*(z3-z1)|} $$
+and the linearity requirement disallows multiplying unknown components of
+${\tt z3}-{\tt z1}$ by the anonymous unknown result of {\tt whatever}. The general
+rule is that you cannot multiply two unknown quantities or divide by an unknown
+quantity, nor can an unknown quantity be used in a {\tt draw} statement.
+Since only linear equations are allowed, the MetaPost interpreter can easily solve
+the equations and keep track of what values are known.
+
+The most natural way to ensure that MetaPost can handle an expression like
+$$ \hbox{\verb|whatever[z1,z3]|} $$
+is to ensure that {\tt z1} and {\tt z3} are both known. However this is not
+actually required since MetaPost may be able to deduce a known value for
+${\tt z3}-{\tt z1}$ before either of {\tt z1} and {\tt z3} are known.
+For instance, MetaPost will accept the equations
+$$ \hbox{\verb|z3=z1+(.1in,.6in); z20=whatever[z1,z3];|} $$
+but it will not be able to determine any of the components of {\tt z1}, {\tt z3},
+or {\tt z20}.
+
+These equations do give partial information about {\tt z1}, {\tt z3},
+and {\tt z20}. A good way to see this is to give another equation such as
+$$ \hbox{\verb|x20-x1=(y20-y1)/6;|} $$
+This produces the error message
+``{\tt ! Redundant equation}\index{Redundant equation?\texttt{Redundant equation}}.''
+MetaPost assumes that you are trying to tell it something new, so it will usually
+warn you when you give a redundant equation. If the new equation had been
+$$ \hbox{\verb|(x20-x1)-(y20-y1)/6=1in;|} $$
+the error message would have been\index{Inconsistent equation?\texttt{Inconsistent equation}}
+$$ \hbox{\verb|! Inconsistent equation (off by 71.99979).|} $$
+This error message illustrates
+roundoff\index{roundoff error} error in MetaPost's linear equation solving
+mechanism. Roundoff error
+is normally not a serious problem. but it is likely to cause trouble if you are
+trying to do something like find the intersection of two lines that are almost
+parallel.
+
+
+\section{Expressions}
+\label{exprs}
+
+It is now time for a more systematic view of the MetaPost language. We have seen
+that there are numeric quantities and coordinate pairs, and that these can be
+combined to specify paths for {\tt draw} statements.
+We have also seen how variables can be used in linear equations, but we have not
+discussed all the operations and data types that can be used in equations.
+
+It is possible to experiment with expressions involving any of the data types
+mentioned below by using the statement\index{show?\texttt{show}}\label{Dshow}
+$$ {\tt show}\, \descr{expression} $$
+to ask MetaPost to print a symbolic representation of the value of each expression.
+For known numeric values, each is printed on a new line preceded by ``{\tt >>} ''.
+Other types of results are printed similarly, except that complicated values are
+sometimes not printed on standard output. This produces a reference to the
+transcript file\index{files!transcript} that looks like this:
+$$ \hbox{\tt >> picture (see the transcript file)} $$
+If you want to the full results of {\tt show} statements to be printed on your
+terminal, assign a positive value to the
+internal\index{internal variables} variable\index{variables!internal}
+{\tt tracingonline}\index{tracingonline?\texttt{tracingonline}}\label{Dtonline}.
+
+\subsection{Data Types}
+
+MetaPost actually has nine basic data types\index{types}: numeric,
+pair, path, transform,
+color, string, boolean, picture, and pen. Let us consider these one at a time
+beginning with the numeric type.
+
+Numeric\index{numeric type} quantities in MetaPost are represented in fixed
+point arithmetic\index{arithmetic} as
+integer multiples of $1\over65536$. They must normally have absolute values
+less than 4096 but intermediate results can be eight times larger.
+This should not be a problem for distances or coordinate values since 4096
+PostScript points is more than 1.4~meters. If you need to work with numbers
+of magnitude 4096 or more, setting the internal variable
+{\tt warningcheck}\index{warningcheck}\label{Dwarncheck} to zero
+suppresses the warning messages about large numeric quantities.
+
+The pair\index{pair type} type is represented as a pair of numeric quantities.
+We have seen that pairs
+are used to give coordinates in {\tt draw} statements. Pairs can be added,
+subtracted, used in mediation expressions, or multiplied or divided by numerics.
+
+Paths\index{path type} have already been discussed in the context of {\tt draw}
+statements, but
+that discussion did not mention that paths are first-class objects that can be
+stored and manipulated. A path represents a straight or curved line that is
+defined parametrically.
+
+Another data type represents an arbitrary affine
+transformation\index{transform type}. A {\em transform\/} can be any combination
+of rotating, scaling, slanting,
+and shifting. If ${\tt p}=(p_x,p_y)$ is a pair and {\tt T} is a
+transform,\index{transformed?\texttt{transformed}}
+$$ \hbox{\tt p transformed T} $$
+is a pair of the form
+$$ (t_x+t_{xx}p_x+t_{xy}p_y, t_y+t_{yx}p_x+t_{yy}p_y), $$
+where the six numeric quantities $(t_x,t_y,t_{xx},t_{xy},t_{yx},t_{yy})$
+determine {\tt T}. Transforms can also be applied to paths, pictures, pens,
+and transforms.
+
+The color\index{color type} type is a lot like the pair type, except that it
+has three components
+instead of two. Like pairs, colors can be added, subtracted, used in mediation
+expressions, or multiplied or divided by numerics. Colors can be specified
+in terms of the predefined constants {\tt black}\index{black?\texttt{black}}\label{Dblack},
+{\tt white}\index{white?\texttt{white}}\label{Dwhite}, {\tt red}\index{red?\texttt{red}}\label{Dred},
+{\tt green}\index{green?\texttt{green}}\label{Dgreen},
+{\tt blue}\index{blue?\texttt{blue}}\label{Dblue}, or the red, green,
+and blue components can be given explicitly. Black is {\tt (0,0,0)} and white
+is {\tt (1,1,1)}. A level of gray such as {\tt (.4,.4,.4)} can be specified
+as {\tt 0.4white}. There is no restriction against colors ``blacker
+than black'' or ``whiter than white'' except all components are snapped
+back to the $[0,1]$ range when a color is given in a PostScript\index{PostScript}
+output file. MetaPost solves linear equations involving colors the same way it
+does for pairs.
+
+A string\index{string type} represents a sequence of characters.
+String constants\index{string constants} are given
+in double quotes \hbox{\verb|"like this"|}. String constants cannot contain
+double quotes or newlines, but there is a way to construct a string containing
+any sequence of eight-bit characters.
+
+The boolean\index{boolean type} type has the constants
+{\tt true}\index{true?\texttt{true}}\label{Dtrue} and
+{\tt false}\index{false}\label{Dfalse} and the
+operators {\tt and}\index{and?\texttt{and}}\label{Dand}, {\tt or}\index{or?\texttt{or}}\label{Dor},
+{\tt not}\index{not?\texttt{not}}\label{Dnot}. The relations \verb|=| and
+\verb|<>|\index{<>?\texttt{<>}}\label{Dcmpar}
+test objects of any type for equality and inequality\index{inequality}.
+Comparison\index{comparison} relations \verb|<|\index{<?\texttt{<}},
+\verb|<=|\index{<=?\texttt{<=}}, \verb|>|\index{>?\texttt{>}}, and \verb|>=|\index{>=?\texttt{>=}}
+are defined lexicographically for
+strings and in the obvious way for numerics. Ordering relations are also
+defined for booleans, pairs, colors, and transforms, but the comparison rules
+are not worth discussing here.
+
+The picture\index{picture type} data type is just what the name implies.
+Anything that can be drawn in MetaPost can be stored in a picture variable.
+In fact, the {\tt draw}\index{draw?\texttt{draw}}
+statement actually stores its results in a special picture variable called
+{\tt currentpicture}\index{currentpicture?\texttt{currentpicture}}. Pictures can be added to other
+pictures and operated on by transforms.
+
+Finally, there is a data type called a pen\index{pen type}. The main function
+of pens in
+MetaPost is to determine line thickness, but they can also be used to achieve
+calligraphic effects. The statement\index{pickup?\texttt{pickup}}\label{Dpickup}
+$$ {\tt pickup\ }\descr{pen expression} $$
+causes the given pen to be used in subsequent {\tt draw} statements.
+Normally, the pen expression is of the form
+$$ {\tt pencircle\ scaled\ }\descr{numeric primary}. $$
+This defines a circular pen that produces lines of constant thickness.
+If calligraphic effects are desired, the pen expression can be adjusted to give
+an elliptical pen or a polygonal pen.
+
+\subsection{Operators}
+
+There are many different ways to make expressions of the nine basic types, but
+most of the operations fit into a fairly simple syntax with four levels of
+precedence as shown in Figure~\ref{syexpr}. There are
+primaries\index{primary?\tdescr{primary}}, secondaries\index{secondary?\tdescr{secondary}},
+tertiaries\index{tertiary?\tdescr{tertiary}}, and expressions\index{expression?\tdescr{expression}}
+of each of the basic types, so the syntax rules could
+be specialized to deal with items such as \tdescr{numeric primary},
+\tdescr{boolean tertiary}, etc. This allows the result type for an operation
+to depend on the choice of operator and the types of its operands. For example,
+the {\tt <} relation is a \tdescr{tertiary binary} that can be applied
+to a \tdescr{numeric expression} and a \tdescr{numeric tertiary} to give a
+\tdescr{boolean expression}. The same operator can accept other operand types
+such as \tdescr{string expression} and \tdescr{string tertiary}, but an error
+message results if the operand types do not match.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{primary} \rightarrow \descr{variable}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \descr{nullary op}$\\
+$\tt \qquad \;|\; \descr{of operator} \descr{expression}
+ of \descr{primary}$\\
+$\tt \qquad \;|\; \descr{unary op} \descr{primary}$\\
+$\tt \descr{secondary} \rightarrow \descr{primary}$\\
+$\tt \qquad \;|\; \descr{secondary} \descr{primary binop} \descr{primary}$\\
+$\tt \descr{tertiary} \rightarrow \descr{secondary}$\\
+$\tt \qquad \;|\; \descr{tertiary} \descr{secondary binop}
+ \descr{secondary}$\\
+$\tt \descr{expression} \rightarrow \descr{tertiary}$\\
+$\tt \qquad \;|\; \descr{expression} \descr{tertiary binop}
+ \descr{tertiary}$
+\end{ctabbing}
+\caption{The overall syntax rules for expressions}
+\index{unary op?\tdescr{unary op}} \index{nullary op?\tdescr{nullary op}}
+\index{primary binop?\tdescr{primary binop}} \index{secondary binop?\tdescr{secondary binop}}
+\index{tertiary binop?\tdescr{tertiary binop}}
+\label{syexpr}
+\end{figure}
+
+The multiplication and division operators {\tt *}\label{Dmldiv}
+and~{\tt /} are examples of what
+Figure~\ref{syexpr} calls a \tdescr{primary binop}. Each can accept two numeric
+operands or one numeric operand and one operand of type pair or color.
+The exponentiation operator \verb|**|\index{**?\texttt{**}}\index{exponentiation}\label{Dpow}
+is a \tdescr{primary binop} that requires two numeric operands.
+Placing this at the
+same level of precedence as multiplication
+and division has the unfortunate consequence that \verb|3*a**2| means $(3a)^2$,
+not $3(a^2)$\index{parsing irregularities}. Since unary negation\label{Dneg}
+applies at the primary level, it also turns
+out that \verb|-a**2| means $(-a)^2$. Fortunately, subtraction has lower
+precedence so that \verb|a-b**2| does mean $a-(b^2)$ instead of $(a-b)^2$.
+
+Another \tdescr{primary binop} is the
+{\tt dotprod}\index{dotprod?\texttt{dotprod}}\label{Ddprod} operator that computes the
+vector dot product of two pairs. For example, {\tt z1 dotprod z2} is equivalent
+to {\tt x1*y1 + x2*y2}.
+
+The additive operators {\tt +} and {\tt -}\label{Dadd} are
+\tdescr{secondary binops} that
+operate on numerics, pairs, or colors and produce results of the same type.
+Other operators that fall in this category are ``Pythagorean addition''
+\verb|++|\index{++?\texttt{++}}\label{Dpyadd} and
+``Pythagorean subtraction'' \verb|+-+|\index{+-+?\texttt{+-+}}\label{Dpysub}:
+\verb|a++b| means $\sqrt{a^2+b^2}$ and \verb|a+-+b| means $\sqrt{a^2-b^2}$.
+There are too many other operators to list here, but some of the most important
+are the boolean operators {\tt and}\index{and?\texttt{and}} and {\tt or}\index{or?\texttt{or}}.
+The {\tt and} operator is a
+\tdescr{primary binop} and the {\tt or} operator is a \tdescr{secondary binop}.
+
+The basic operations on strings are concatenation\index{concatenation} and
+substring construction.
+The \tdescr{tertiary binop} \verb|&|\index{&?\texttt{\&}}\label{Damp}
+implements concatenation; e.g.,
+$$ \hbox{\verb|"abc" & "de"|} $$
+produces the string \verb|"abcde"|.
+For substring construction, the
+\tdescr{of operator} {\tt substring}\index{substring of?\texttt{substring of}}\label{Dsubstr}
+is used like this:
+$$ {\tt substring}\, \descr{pair expression} \,{\tt of}\, \descr{string primary} $$
+The \tdescr{pair expression} determines what part of the string to select. For
+this purpose, the string is indexed\index{indexing} so that integer positions
+fall {\em between\/} characters. Pretend the string is written on a piece of
+graph paper
+so that the first character occupies $x$~coordinates between zero and one and the
+next character covers the range $1\le x\le2$, etc. Thus the string \verb|"abcde"|
+should be thought of like this
+$$ \epsfbox{manfig.14} $$
+and {\tt substring (2,4) of "abcde"} is {\tt "cd"}. This takes a little getting
+used to but it tends to avoid annoying ``off by one'' errors.
+
+Some operators take no arguments at all. An example of what Figure~\ref{syexpr}
+calls a \tdescr{nullary op} is
+{\tt nullpicture}\index{nullpicture?\texttt{nullpicture}}\label{Dnlpic} which
+returns a completely blank picture.
+
+The basic syntax in Figure~\ref{syexpr} only covers aspects of the expression
+syntax that are relatively type-independent. For instance, the complicated path
+syntax given in Figure~\ref{sypath} gives alternative rules for constructing a
+\tdescr{path expression}. An additional rule\index{path knot?\tdescr{path knot}}
+$$ \descr{path knot} \rightarrow \descr{pair tertiary} \;|\; \descr{path tertiary}
+$$
+explains the meaning of \tdescr{path knot} in Figure~\ref{sypath}. This means
+that the path expression
+$$ \hbox{\verb|z1+(1,1){right}..z2|} $$
+does not need parentheses around {\tt z1+(1,1)}.
+
+\subsection{Fractions, Mediation, and Unary Operators}
+
+Mediation\index{mediation} expressions do not appear in the basic expression
+syntax of Figure~\ref{syexpr}. Mediation expressions are parsed at the
+\tdescr{primary} level, so the general rule for constructing them is
+$$ \descr{primary} \rightarrow
+ \descr{numeric atom} \hbox{\tt [} \descr{expression}
+ \hbox{\tt ,} \descr{expression} \hbox{\tt ]}
+$$
+where each \tdescr{expression} can be of type numeric, pair, or color.
+The \tdescr{numeric atom}\index{numeric atom?\tdescr{numeric atom}} in a mediation
+expression is an extra simple type of \tdescr{numeric primary} as
+shown in Figure~\ref{synprim}. The meaning of all this is that the initial
+parameter in a mediation expression needs to be parenthesized when it is not
+just a variable, a positive number, or a positive fraction.
+For example,\index{parsing irregularities}
+$$ \hbox{\tt -1[a,b]} \quad {\rm and}\quad \hbox{\tt (-1)[a,b]} $$
+are very different: the former is $-b$ since it is equivalent to
+{\tt -(1[a,b])}; the latter is $a-(b-a)$ or $2a-b$.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{numeric primary} \rightarrow \descr{numeric atom}$\\
+$\tt \qquad \;|\; \descr{numeric atom}\hbox{\tt [}
+ \descr{numeric expression}\hbox{\tt ,}\descr{numeric expression}\hbox{\tt ]}$\\
+$\tt \qquad \;|\; \descr{of operator} \descr{expression} of \descr{primary}$\\
+$\tt \qquad \;|\; \descr{unary op} \descr{primary}$\\
+$\tt \descr{numeric atom} \rightarrow \descr{numeric variable}$\\
+$\tt \qquad \;|\; \descr{number or fraction}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{numeric expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \descr{numeric nullary op}$\\
+$\tt \descr{number or fraction} \rightarrow \descr{number}
+ \hbox{\tt /}\descr{number}$\\
+$\tt \qquad \;|\; \descr{number not followed by
+ `$\hbox{\tt /}\descr{number}$'}$\\
+\end{ctabbing}
+\caption{Syntax rules for numeric primaries}
+\label{synprim}
+\end{figure}
+
+A noteworthy feature of the syntax rules in Figure~\ref{synprim} is that the
+{\tt /}\index{fractions} operator binds most tightly when its operands are
+numbers. Thus {\tt 2/3} is a
+\tdescr{numeric atom}\index{numeric atom?\tdescr{numeric atom}}\index{parsing irregularities}
+while {\tt (1+1)/3} is only a \tdescr{numeric secondary}. Applying a
+\tdescr{primary binop} such as {\tt sqrt}\index{sqrt?\texttt{sqrt}}\label{Dsqrt}
+makes the difference clear:
+$$ \hbox{\tt sqrt 2/3} $$
+means $\sqrt{2\over3}$ while
+$$ \hbox{\tt sqrt(1+1)/3} $$
+means $\sqrt 2/3$.
+Operators such as {\tt sqrt} can be written in standard functional notation,
+but it is often unnecessary to parenthesize the argument. This applies to any
+function that is parsed as a \tdescr{primary binop}. For instance
+{\tt abs(x)}\index{abs?\texttt{abs}}\label{Dabs} and {\tt abs x} both compute the
+absolute value of {\tt x}. The same holds for the
+{\tt round}\index{round?\texttt{round}}\label{Dround},
+{\tt floor}\index{floor?\texttt{floor}}\label{Dfloor},
+{\tt ceiling}\index{ceiling?\texttt{ceiling}}\label{Dceil},
+{\tt sind}\index{sind?\texttt{sind}}\label{Dsind},
+and {\tt cosd}\index{cosd?\texttt{cosd}}\label{Dcosd}
+functions. The last two of these compute trigonometric functions of angles in
+degrees.
+
+Not all unary operators take numeric arguments and return numeric results.
+For instance, the {\tt abs}\index{abs?\texttt{abs}} operator can be applied to a pair
+to compute the Euclidean length of a vector. Applying the
+{\tt unitvector}\index{unitvector?\texttt{unitvector}}\label{Duvec} operator to a pair produces
+the same pair rescaled so that its Euclidean length is~1.
+The {\tt decimal}\index{decimal?\texttt{decimal}}\label{Ddecop}
+operator takes a number and returns the string representation.
+The {\tt angle}\index{angle?\texttt{angle}}\label{Dangle}
+operator takes a pair and computes the two-argument arctangent; i.e., {\tt angle}
+is the inverse of the {\tt dir} operator that was discussed in
+Section~\ref{tenscurl}. There is also an operator
+{\tt cycle}\index{cycle?\texttt{cycle}}\label{Dcycop}
+that takes a \tdescr{path primary} and returns a boolean result indicating whether
+the path is a closed curve.
+
+There is a whole class of other operators that classify expressions and return
+boolean results. A type name such as {\tt pair}\index{pair?\texttt{pair}} can operate on
+any type of \tdescr{primary} and return a boolean result indicating whether the
+argument is a {\tt pair}\label{Dpairop}. Similarly, each of the following can
+be used as a unary operator:
+{\tt numeric}\index{numeric?\texttt{numeric}}\label{Dnumop},
+{\tt boolean}\index{boolean?\texttt{boolean}}\label{Dboolop},
+{\tt color}\index{color?\texttt{color}}\label{Dcolrop},
+{\tt string}\index{string?\texttt{string}}\label{Dstrgop},
+{\tt transform}\index{transform?\texttt{transform}}\label{Dtrnfop},
+{\tt path}\index{path?\texttt{path}}\label{Dpathop},
+{\tt pen}\index{pen?\texttt{pen}}\label{Dpenop},
+and {\tt picture}\index{picture?\texttt{picture}}\label{Dpictop}.
+Besides just testing the type of a \tdescr{primary}, you can use the
+{\tt known}\index{known?\texttt{known}}\label{Dknown} and
+{\tt unknown}\index{unknown?\texttt{unknown}}\label{Dunknwn} operators to
+test if it has a completely known value.
+
+Even a number can behave like an operator in some contexts.
+This refers to the trick that allows {\tt 3x}\index{multiplication, implicit} and
+{\tt 3cm} as alternatives to {\tt 3*x} and {\tt 3*cm}. The rule is that a
+\tdescr{number or fraction} that is not followed by {\tt +}, {\tt -}, or another
+\tdescr{number or fraction} can serve as a \tdescr{primary binop}.
+Thus {\tt 2/3x}\index{parsing irregularities}
+is two thirds of {\tt x} but {\tt (2)/3x} is $2\over3x$ and {\tt 3 3} is illegal.
+
+There are also operators for extracting numeric subfields from pairs, colors,
+and even transforms. If {\tt p} is a \tdescr{pair primary},
+{\tt xpart p}\index{xpart?\texttt{xpart}}\label{Dxprt} and
+{\tt ypart p}\index{ypart}\label{Dyprt} extract its
+components so that
+$$ \hbox{\tt (xpart p, ypart p)} $$
+is equivalent to~{\tt p} even if {\tt p} is an unknown pair that is being used
+in a linear equation. Similarly, a color {\tt c} is equivalent
+to\index{redpart?\texttt{redpart}}\index{greenpart?\texttt{greenpart}}\index{bluepart?\texttt{bluepart}}\label{Drgbprt}
+$$ \hbox{\tt (redpart c, greenpart c, bluepart c)} $$
+The part specifiers for transforms will be discussed later.
+
+
+\section{Variables}
+\label{vars}
+
+MetaPost allows compound variable names such as {x.a}, {\tt x2r}, {\tt y2r},
+and {\tt z2r}, where {\tt z2r} means {\tt (x2r,y2r)} and {\tt z.a} means
+{\tt (x.a,y.a)}. In fact there is a broad class of suffixes such that
+{\tt z}\tdescr{suffix}\index{suffix?\tdescr{suffix}} means
+$$ (x\descr{suffix},\, y\descr{suffix}). $$
+Since a \tdescr{suffix} is composed of tokens, it is best to begin with a few
+comments about tokens.
+
+\subsection{Tokens}
+
+A MetaPost input file is treated as a sequence of numbers, string constants, and
+symbolic tokens\index{tokens}\index{tokens!symbolic}. A number consists of a
+sequence of digits possibly containing
+a decimal point. Technically, the minus sign in front of a negative number is
+a separate token. Since MetaPost uses fixed point arithmetic\index{arithmetic},
+it does not understand exponential notation such as {\tt 6.02E23}. MetaPost
+would interpret this as the number 6.02, followed by the symbolic token {\tt E},
+followed by the number~23.
+
+Anything between a pair of double quotes {\tt "} is a
+string constant\index{string constants}. It is
+illegal for a string constant to start on one line and end on a later line.
+Nor can a string constant contain double quotes {\tt "} or anything other than
+printable ASCII characters.
+
+Everything in a line of input other than numbers and string constants is broken
+into symbolic tokens\index{tokens!symbolic}. A symbolic token is a sequence of
+one or more similar characters, where characters are ``similar'' if they occur
+on the same row of Table~\ref{classes}.
+
+\begin{table}
+$$\begin{tabular}{c}
+\verb|ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz|\\
+{\tt :<=>|}\\
+\verb|#&@$|\\
+\verb|/*\|\\
+{\tt +-}\\
+{\tt !?}\\
+{\tt '`}\\
+\verb|^~|\\
+\verb|{}|\\
+{\tt [}\\
+{\tt ]}\\
+\end{tabular}
+$$
+\caption{Character classes for tokenization}
+\label{classes}
+\end{table}
+
+Thus \verb|A_alpha| and {\tt +-+} are symbolic tokens but {\tt !=} is interpreted
+as two tokens and {\tt x34} is a symbolic token followed by a number. Since the
+brackets {\tt [} and {\tt ]} are listed on lines by themselves, the only symbolic
+tokens involving them are {\tt [}, {\tt [[}, {\tt [[[}, etc.\ and
+{\tt ]}, {\tt ]]}, etc.
+
+Some characters are not listed in Table~\ref{classes} because they need special
+treatment. The four characters {\tt ,;()} are ``loners'': each comma, semicolon,
+or parenthesis is a separate token even when they occur consecutively. Thus
+{\tt (())} is four tokens, not one or two. The percent sign is very special
+because it introduces comments\index{comments}. The percent sign and everything
+after it up to the end of the line are ignored.
+
+Another special character is the period. Two or more periods
+together form a symbolic token, but a single period is ignored, and a period
+preceded or followed by digits is part of a number Thus {\tt ..}
+and {\tt ...} are symbolic tokens while {\tt a.b} is just two tokens {\tt a}
+and {\tt b}. It conventional to use periods to separate tokens in this fashion
+when naming a variable that is more than one token long.
+
+\subsection{Variable Declarations}
+\label{vardecl}
+
+A variable name is a symbolic token or a sequence of symbolic tokens.
+Most symbolic
+tokens are legitimate variable names, but anything with a predefined meaning like
+{\tt draw}, {\tt +}, or {\tt ..} is disallowed; i.e., variable names cannot be
+macros or MetaPost primitives. This minor restriction allows an amazingly broad
+class of variable names: {\tt alpha}, \verb|==>|, \verb|@&#$&|, and \verb|~~| are
+all legitimate variable names. Such symbolic tokens without special meanings
+are called {\em tags}\index{tags}.
+
+A variable name can be a sequence of tags like {\tt f.bot} or {\tt f.top}.
+The idea is to provide some of the functionality of Pascal records or C structures.
+It is also possible to simulate arrays by using variable names that contain
+numbers as well as symbolic tokens. For example, the variable name {\tt x2r}
+consists of the tag {\tt x}, the number 2, and the tag~{\tt r}. There can also
+be variables named {\tt x3r} and even {\tt x3.14r}. These variables can be
+treated as an array\index{arrays} via constructions like {\tt x[i]r},
+where {\tt i} has an appropriate numeric value. The overall syntax for
+variable names is shown in Figure~\ref{syvar}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{variable} \rightarrow \descr{tag}\descr{suffix}$\\
+$\tt \descr{suffix} \rightarrow \descr{empty} \;|\;
+ \descr{suffix}\descr{subscript} \;|\; \descr{suffix}\descr{tag}$\\
+$\tt \descr{subscript} \rightarrow \descr{number} \;|\;
+ \hbox{\tt [}\descr{numeric expression}\hbox{\tt ]}$
+\end{ctabbing}
+\caption{The syntax for variable names.}
+\index{suffix?\tdescr{suffix}}\index{subscript?\tdescr{subscript}}
+\label{syvar}
+\end{figure}
+
+Variables like {\tt x2} and {\tt y2} take on numeric values by default, so we
+can use the fact that {\tt z}\tdescr{suffix} is an abbreviation for\index{z convention?{\tt z} convention}\label{Dzconv}
+$$ (x\descr{suffix},\, y\descr{suffix}) $$
+to generate pair-valued variables when needed. It turns out that the
+{\tt beginfig}\index{beginfig?\texttt{beginfig}} macro wipes out pre-existing values variables
+that begin with the tags {\tt x} or {\tt y} so that
+{\tt beginfig} \ldots\ {\tt endfig}
+blocks do not interfere with each other when this naming scheme is used.
+In other words, variables that start with {\tt x}, {\tt y}, {\tt z} are
+local\index{variables!local}\index{locality}
+to the figure they are used in. General mechanisms for making variables local
+will be discussed in Section~\ref{grsec}.
+
+Type declarations\index{declarations}\index{type declarations}
+make it possible to use almost any naming scheme while still
+wiping out any previous value that might cause interference. For example, the
+declaration
+$$ \hbox{\tt pair pp, a.b;} $$
+makes {\tt pp} and {\tt a.b} unknown pairs. Such a declaration is not strictly
+local since {\tt pp} and {\tt a.b} are not automatically restored to their
+previous values at the end of the current figure. Of course, they are restored
+to unknown pairs if the declaration is repeated.
+
+Declarations work the same way for any of
+the other eight types: numeric, path, transform, color, string, boolean, picture,
+and pen. The only restriction is that you cannot give explicit numeric subscripts
+in a variable declaration. Do not give the illegal declaration
+$$ \hbox{\tt numeric q1, q2, q3;} $$
+use the generic subscript\index{subscript!generic} symbol {\tt []}\index{[]?\texttt{[]}}
+instead, to declare the whole array:
+$$ \hbox{\tt numeric q[];} $$
+You can also declare ``multidimensional'' arrays\index{arrays!multidimensional}.
+After the declaration
+$$ \hbox{\tt path p[]q[], pq[][];} $$
+{\tt p2q3} and {\tt pq1.4 5} are both paths.
+
+Internal\index{internal variables}\index{variables!internal}
+variables like {\tt tracingonline} cannot be declared in
+the normal fashion. All the internal variables discussed in this manual are
+predefined and do not have to be declared at all, but there is a way to declare
+that a variable should behave like a newly-created internal variable.
+The declaration is {\tt newinternal}\index{newinternal?\texttt{newinternal}}\label{Dnewint}
+followed by a list of symbolic tokens. For example,
+$$ \hbox{\tt newinternal a, b, c;} $$
+causes {\tt a}, {\tt b}, and {\tt c} to behave like internal variables. Such
+variables always have known numeric values, and these values can only be changed
+by using the assignment\index{assignment} operator {\tt:=}\index{:=?\texttt{:=}}.
+Internal variables are initially zero
+except that the Plain\index{Plain macros} macro package gives some of them nonzero
+initial values. (The Plain macros are normally preloaded automatically as
+explained in Section~\ref{intro}.)
+
+
+\section{Integrating Text and Graphics}
+\label{text}
+
+MetaPost has a number of features for including labels and other
+text\index{text and graphics}
+in the figures it generates. The simplest way to do this is to use the
+{\tt label}\index{label?\texttt{label}}\label{Dlabel} statement\index{label suffix?\tdescr{label suffix}}
+$$ {\tt label}\descr{label suffix} \hbox{\tt (}
+ \descr{string or picture expression} \hbox{\tt,}\, \descr{pair expression}
+ \hbox{\tt );}
+$$
+The \tdescr{string or picture expression} gives the label and the
+\tdescr{pair expression} says where to put it. The \tdescr{label suffix} can be
+\tdescr{empty} in which case the label is just centered on the given coordinates.
+If you are labeling some feature of a diagram you probably want to offset the
+label slightly to avoid overlapping. This is illustrated in Figure~\ref{fig16}
+where the {\tt "a"} label is placed above the midpoint of the line it refers to
+and the {\tt "b"} label is to the left of the midpoint of its line. This is
+achieved by using {\tt label.top}\index{top?\texttt{top}} for the {\tt "a"} label and
+{\tt label.lft}\index{lft?\texttt{lft}}
+for the {\tt "b"} label as shown in the figure. The \tdescr{label suffix}
+specifies the position of the label relative to the specified coordinates.
+The complete set of possibilities is\index{rt?\texttt{rt}}\index{bot?\texttt{bot}}%
+\index{ulft?\texttt{ulft}}\index{urt?\texttt{urt}}\index{llft?\texttt{llft}}\index{lrt?\texttt{lrt}}
+$$ \tt \descr{label suffix} \rightarrow
+ \descr{empty} \;|\; lft \;|\; rt \;|\; top \;|\; bot \;|\;
+ ulft \;|\;urt \;|\; llft \;|\; lrt
+$$
+where {\tt lft} and {\tt rt} mean left and right and {\tt llft}, {\tt ulft}, etc.\
+mean lower left, upper left, etc. The actual amount by which the label is offset
+in whatever direction is determined by the
+internal variable\index{internal variables}\index{variables!internal}
+{\tt labeloffset}\index{labeloffset?\texttt{labeloffset}}\label{Dlaboff}.
+
+\begin{figure}[htp]
+$$
+\begin{verbatim}
+beginfig(17);
+a=.7in; b=.5in;
+z0=(0,0);
+z1=-z3=(a,0);
+z2=-z4=(0,b);
+draw z1..z2..z3..z4..cycle;
+draw z1--z0--z2;
+label.top("a", .5[z0,z1]);
+label.lft("b", .5[z0,z2]);
+dotlabel.bot("(0,0)", z0);
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\epsfbox{manfig.17}}
+$$
+\caption{MetaPost code and the resulting output}
+\label{fig16}
+\end{figure}
+
+Figure~\ref{fig16} also illustrates the
+{\tt dotlabel}\index{dotlabel?\texttt{dotlabel}}\label{Ddotlab}
+statement. This is exactly
+like the {\tt label} statement except that it adds a dot at the indicated
+coordinates. For example
+$$ \hbox{\tt dotlabel.bot("(0,0)", z0)} $$
+places a dot at {\tt z0} and then puts the label ``(0,0)'' just below the dot.
+Another alternative is the macro
+{\tt thelabel}\index{thelabel?\texttt{thelabel}}\label{Dthelab}. This has
+the same syntax as the {\tt label} and {\tt dotlabel} statements except that it
+returns the label as a \tdescr{picture primary} instead of actually drawing it.
+Thus
+$$ \hbox{\tt label.bot("(0,0)", z0)} $$
+is equivalent to
+$$ \hbox{\tt draw thelabel.bot("(0,0)", z0)} $$
+
+For simple applications of labeled figures, you can normally get by with just
+{\tt label} and {\tt dotlabel}. In fact, you may be able to use a short form of
+the {\tt dotlabel} statement that saves a lot of typing
+when you have many points {\tt z0}, {\tt z1}, {\tt z.a}, {\tt z.b}, etc.\
+and you want to use the {\tt z} suffixes as labels.
+The statement\index{dotlabels?\texttt{dotlabels}}\label{Ddotlbs}
+$$ \hbox{\tt dotlabels.rt(0, 1, a);} $$
+is equivalent to
+$$ \hbox{\tt dotlabel.rt("0",z0); dotlabel.rt("1",z1); dotlabel.rt("a",z.a);} $$
+Thus the argument to {\tt dotlabels} is a list of suffixes for which {\tt z}
+variables are known, and the \tdescr{label suffix} given with {\tt dotlabels}
+is used to position all the labels.
+
+There is also a {\tt labels}\index{labels?\texttt{labels}}\label{Dlabels} statement that is
+analogous to
+{\tt dotlabels} but its use is discouraged because it presents compatibility
+problems with \MF\index{metafont?\MF}. Some versions of the preloaded
+Plain\index{Plain macros} macro package define {\tt labels} to be synonymous
+with {\tt dotlabels}.
+
+For labeling statements such as {\tt label} and {\tt dotlabel} that use a
+string expression for the label text,
+the string gets typeset in a default font as determined by
+the string variable {\tt defaultfont}\index{defaultfont?\texttt{defaultfont}}\label{Ddffont}.
+The initial value of {\tt defaultfont}
+is likely to be {\tt "cmr10"}, but it can be changed to a different font name
+by giving an assignment such as
+$$ \hbox{\tt defaultfont:="Times-Roman"} $$
+There is also a numeric quantity called
+{\tt defaultscale}\index{defaultscale?\texttt{defaultscale}}\label{Ddfscale}
+that determines the type size.
+When {\tt default\-scale} is 1, you get the ``normal size'' which is
+usually 10 point, but this can also be changed. For instance
+$$ \hbox{\tt defaultscale := 1.2} $$
+makes labels come out twenty percent larger. If you do not know the normal size
+and you want to be sure the text comes out at some specific size, say 12 points,
+you can use the {\tt fontsize}\index{fontsize?\texttt{fontsize}}\label{Dfntsiz}
+operator to determine the normal size: e.g.,
+$$ \hbox{\tt defaultscale := 12pt/fontsize defaultfont;} $$
+
+When you change {\tt defaultfont}, the new font name should be something that
+\TeX\ would understand since MetaPost gets height and width information by reading
+the {\tt tfm}\index{tfm file?{\tt tfm} file}\index{files!tfm?{\tt tfm}} file.
+(This is explained in {\it The \TeX book\/}.~\cite{kn:a})
+It should be possible to use built-in PostScript fonts, but the names for them
+are system-dependent. Some systems may use {\tt rptmr} or {\tt ps-times-roman}
+instead of {\tt Times-Roman}.
+A \TeX\index{TeX?\TeX} font such as {\tt cmr10} is a little dangerous because it does
+not have a space character or certain ASCII symbols. In addition, MetaPost does
+not use the ligatures\index{ligatures} and kerning\index{kerning} information
+that comes with a \TeX\ font.
+
+
+\subsection{Typesetting Your Labels}
+
+\TeX\index{TeX?\TeX} may be used to format complex labels.
+If you say\index{btex?\texttt{btex}}\index{etex?\texttt{etex}}
+$$ {\tt btex}\, \descr{typesetting commands}\, {\tt etex} $$
+in a MetaPost input file, the \tdescr{typesetting commands} get processed by
+\TeX\ and translated into a picture expression
+(actually a \tdescr{picture primary}) that can be used in a {\tt label}
+or {\tt dotlabel} statement. Any spaces after {\tt btex} or before {\tt etex}
+are ignored. For instance, the statement
+$$ \hbox{\verb|label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u)|} $$
+in Figure~\ref{fig17} places the label $\sqrt x$ at the lower right of the
+point {\tt (3,sqrt 3)*u}.
+
+\begin{figure}[htp]
+$$
+\begin{verbatim}
+beginfig(18);
+numeric u;
+u = 1cm;
+draw (0,2u)--(0,0)--(4u,0);
+pickup pencircle scaled 1pt;
+draw (0,0){up}
+ for i=1 upto 8: ..(i/2,sqrt(i/2))*u endfor;
+label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u);
+label.bot(btex $x$ etex, (2u,0));
+label.lft(btex $y$ etex, (0,u));
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\epsfbox{manfig.18}}
+$$
+\caption{MetaPost code and the resulting output}
+\label{fig17}
+\end{figure}
+
+Figure~\ref{fig18} illustrates some of the more complicated things that can
+be done with labels. Since the result of {\tt btex} \ldots {\tt etex} is
+a picture, it can be operated on like a picture. In particular, it is possible
+to apply transformations to pictures. We have not discussed the syntax for
+this yet, but a \tdescr{picture secondary}
+can be\index{rotated text}\index{rotated?\texttt{rotated}}
+$$ \descr{picture secondary}\, {\tt rotated}\, \descr{numeric primary} $$
+This is used in Figure~\ref{fig18} to rotate the label ``$y$ axis'' so that
+it runs vertically.
+
+\begin{figure}[htp]
+$$
+\begin{verbatim}
+beginfig(19);
+numeric ux, uy;
+120ux=1.2in; 4uy=2.4in;
+draw (0,4uy)--(0,0)--(120ux,0);
+pickup pencircle scaled 1pt;
+draw (0,uy){right}
+ for ix=1 upto 8:
+ ..(15ix*ux, uy*2/(1+cosd 15ix))
+ endfor;
+label.bot(btex $x$ axis etex, (60ux,0));
+label.lft(btex $y$ axis etex rotated 90,
+ (0,2uy));
+label.lft(
+ btex $\displaystyle y={2\over1+\cos x}$ etex,
+ (120ux, 4uy));
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\epsfbox{manfig.19}}
+$$
+\caption{MetaPost code and the resulting output}
+\label{fig18}
+\end{figure}
+
+Another complication in Figure~\ref{fig18} is the use of the displayed equation
+$$y={2\over 1+\cos x}$$
+as a label. It would be more natural to code this as
+$$ \hbox{\verb|$$y={2\over 1+\cos x}$$|} $$
+but this would not work because
+\TeX\ typesets the labels in ``horizontal mode.''
+
+Here is how \TeX\ material gets translated into a form MetaPost understands:
+The MetaPost processor skips over
+{\tt btex}\index{btex?\texttt{btex}} \ldots\ {\tt etex}\index{etex?\texttt{etex}} blocks
+and depends on a preprocessor to translate them into low level MetaPost
+commands. If the main file is {\tt fig.mp}, the translated \TeX\
+material is placed in a file named {\tt fig.mpx}\index{files!mpx?{\tt mpx}}.
+This is normally
+done silently without any user intervention but it could fail if one of
+the {\tt btex} $\ldots$ {\tt etex} blocks contains an erroneous
+\TeX\index{TeX?\TeX!errors} command. Then the erroneous \TeX\ input
+is saved in the file {\tt mpxerr.tex}\index{mpxerr.tex?\texttt{mpxerr.tex}} and the error
+messages appear in {\tt mpxerr.log}\index{mpxerr.log?\texttt{mpxerr.log}}.
+
+\TeX\ macro definitions or any other auxiliary
+\TeX\ commands can be enclosed in a
+{\tt verbatimtex}\index{verbatimtex?\texttt{verbatimtex}} \ldots\ {\tt etex}\index{etex?\texttt{etex}} block.
+The difference between
+{\tt btex} and {\tt verbatimtex} is that the former generates a picture
+expression while the latter only adds material for \TeX\ to process.
+For instance, if you want \TeX\ to typeset labels using macros defined in
+{\tt mymac.tex}, your MetaPost input file would look something like this:
+\begin{eqnarray*}
+&& \verb|verbatimtex \input mymac etex|\\
+&& \verb|beginfig(1);|\\
+&& \qquad \vdots\\
+&& \verb|label(btex|\, \descr{\TeX\ material using \hbox{\tt mymac.tex}}\,
+ \verb|etex, | \descr{some coordinates} \hbox{\tt );}\\
+&& \qquad \vdots
+\end{eqnarray*}
+
+On Unix\footnote{Unix is a registered trademark of Unix Systems
+Laboratories.}\index{Unix\reg}
+systems, an environment variable can be used to specify that
+{\tt btex} $\ldots$ {\tt etex} and {\tt verbatimtex} $\ldots$ {\tt etex}
+blocks are in troff\index{troff} instead of \TeX. When using this option,
+it is a good idea to start your MetaPost input file with the assignment
+{\tt prologues:=1}\index{prologues?\texttt{prologues}}\label{Dprologs}. Giving this
+internal variable\index{internal variables}\index{variables!internal}
+a positive value causes causes output to be formatted as
+``structured PostScript''\index{PostScript!structured} generated on the
+assumption that text comes from built-in PostScript fonts. This makes MetaPost
+output much more portable, but it has an important drawback: It generally
+does not work when you use \TeX\ fonts, since programs that translate \TeX\
+output into PostScript\index{PostScript} need to make special provisions for
+\TeX\index{TeX?\TeX!fonts} fonts in
+included figures and the standard PostScript structuring rules do not allow
+for this. The details on how to include PostScript figures in a paper done
+in \TeX\ or troff are system-dependent. They can generally be found in
+manual pages and other on-line documentation. A file called {\tt dvips.tex}
+is distributed electronically along with the dvips\index{dvips} \TeX\ output
+processor.
+
+
+\subsection{The {\tt infont} operator}
+\label{Sinfont}
+
+Regardless of whether you use \TeX\ or troff, all the real work of adding
+text to pictures is done by a MetaPost primitive operator called
+{\tt infont}\index{infont?\texttt{infont}}. It is a
+\tdescr{primary binop}\index{primary binop?\tdescr{primary binop}} that takes a
+\tdescr{string secondary} as its
+left argument and a \tdescr{string primary} as its right argument. The left
+argument is text, and the right argument is a font name.
+The result of the operation is a \tdescr{picture secondary} that can then be
+transformed in various ways. One possibility is enlargement by a given factor
+via the syntax\index{scaled?\texttt{scaled}}
+$$ \descr{picture secondary}\, \hbox{\tt scaled}\, \descr{numeric primary} $$
+Thus {\tt label("text",z0)} is equivalent to
+$$ \hbox{\tt label("text" infont defaultfont scaled defaultscale, z0)} $$
+
+If it is not convenient to use a string constant for the left argument of
+{\tt infont}, you can use\index{char?\texttt{char}}\label{Dchar}
+$$ {\tt char}\, \descr{numeric primary} $$
+to select a character based on its numeric position in the font.
+Thus
+$$ \hbox{\tt char(n+64) infont "Times-Roman"} $$
+is a picture containing character {\tt n+64} of the Times-Roman font.
+
+\subsection{Measuring Text}
+\label{meas}
+
+MetaPost makes readily available the physical dimensions\index{size}
+of pictures generated by the {\tt infont} operator. There are
+unary operators {\tt llcorner}\index{llcorner?\texttt{llcorner}}\label{Dcornop},
+{\tt lrcorner}\index{lrcorner?\texttt{lrcorner}}, {\tt urcorner}\index{urcorner?\texttt{urcorner}},
+{\tt ulcorner}\index{ulcorner?\texttt{ulcorner}}, and {\tt center}\index{center}\label{Dcenter}
+that take a \tdescr{picture primary} and return the corners of its ``bounding
+box'' as illustrated in Figure~\ref{bbox}. The {\tt center} operator also
+accepts \tdescr{path primary} and \tdescr{pen primary} operands.
+In MetaPost Version 0.30 and higher, {\tt llcorner}, {\tt lrcorner}, etc.
+accept all three argument types as well.
+
+The argument type restrictions on the corner operators are not very important
+because their main purpose is to allow {\tt label} and {\tt dotlabel} statements
+to center their text properly.
+The predefined macro\index{bbox?\texttt{bbox}}\label{Dbbox}
+$$ {\tt bbox}\, \descr{picture primary} $$
+finds a rectangular path that represents the bounding box of a given picture.
+If {\tt p} is a picture, {\tt bbox p} equivalent to
+$$ \hbox{\tt (llcorner p--lrcorner p--urcorner p--ulcorner p--cycle)} $$
+except that it allows for a small amount of extra space around {\tt p} as specified
+by the internal variable\index{internal variables}\index{variables!internal}
+{\tt bboxmargin}\index{bboxmargin?\texttt{bboxmargin}}\label{Dbbmargin}.
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.20} $$
+\caption{A bounding box and its corner points.}
+\label{bbox}
+\end{figure}
+
+Note that MetaPost computes the bounding box of a {\tt btex}\index{btex?\texttt{btex}}
+\ldots\ {\tt etex}\index{etex?\texttt{etex}} picture just the way \TeX\index{TeX?\TeX} does.
+This is quite natural, but it has certain implications in view of the fact that
+\TeX\ has features like {\tt\string\strut}\index{strut?{\tt\string\strut}} and
+{\tt\string\rlap}\index{rlap?{\tt\string\rlap}} that allow \TeX\ users to lie about the
+dimensions of a box.
+
+When \TeX\ commands that lie about the dimensions of a box are translated in to
+low-level MetaPost code, a {\tt setbounds}\index{setbounds?\texttt{setbounds}}\label{Dsetbnd}
+statement does the lying:\index{picture variable?\tdescr{picture variable}}
+$$ {\tt setbounds}\, \descr{picture variable}\, {\tt to}\, \descr{path expression}
+$$
+makes the \tdescr{picture variable} behave as if its bounding box were the same
+as the given path. To get the true bounding box of such a picture, assign a
+positive value to the
+internal variable\index{internal variables}\index{variables!internal}
+{\tt truecorners}\index{truecorners?\texttt{truecorners}}\label{Dtruecorn}:\footnote{The
+{\tt setbounds} and
+{\tt truecorners} features are only found in MetaPost version 0.30 and higher.}
+i.e.,
+$$ \hbox{\verb|show urcorner btex $\bullet$\rlap{ A} etex|} $$
+produces ``\verb|>> (4.9813,6.8078)|'' while
+$$ \hbox{\verb|truecorners:=1; show urcorner btex $\bullet$\rlap{ A} etex|} $$
+produces ``\verb|>> (15.7742,6.8078)|.''
+
+
+\section{Advanced Graphics}
+\label{adv.gr}
+
+All the examples in the previous sections have been simple line drawings with
+labels added. This section describes shading and tools for generating
+not-so-simple line drawings.
+Shading is done with the {\tt fill}\index{fill?\texttt{fill}}\label{Dfill} statement.
+In its simplest
+form, the {\tt fill} statement requires a \tdescr{path expression} that gives
+the boundary of the region to be filled. In the syntax
+$$ {\tt fill}\, \descr{path expression} $$
+the argument should be a cyclic path, i.e., a path that describes a closed curve
+via the {\tt ..cycle} or {\tt --cycle} notation. For example, the {\tt fill}
+statement in Figure~\ref{fig20} builds a closed path by extending the roughly
+semicircular path~{\tt p}.
+This path has a counter-clockwise orientation, but that does not matter because
+the {\tt fill} statement uses PostScript's\index{PostScript} non-zero
+winding\index{winding number} number rule~\cite{ad:red}.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(21);
+path p;
+p = (-1cm,0)..(0,-1cm)..(1cm,0);
+fill p{up}..(0,0){-1,-2}..{up}cycle;
+draw p..(0,1cm)..cycle;
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\epsfbox{manfig.21}}
+$$
+\caption{MetaPost code and the corresponding output.}
+\label{fig20}
+\end{figure}
+
+The general {\tt fill} statement\index{withcolor?\texttt{withcolor}}
+$$ {\tt fill}\, \descr{path expression}\,
+ {\tt withcolor}\, \descr{color expression}
+$$
+specifies a shade of gray or (if you have a color printer) some
+rainbow color.
+
+Figure~\ref{fig21} illustrates several applications of the fill command to fill
+areas with shades of gray. The paths involved are intersecting circles {\tt a}
+and {\tt b} and a path {\tt ab} that bounds the region inside both circles.
+Circles {\tt a} and {\tt b} are derived from a predefined path
+{\tt fullcircle}\index{fullcircle?\texttt{fullcircle}}\label{Dfcirc}
+that approximates a circle of unit diameter centered on the origin. There is
+also a predefined path {\tt halfcircle}\index{halfcircle?\texttt{halfcircle}}\label{Dhcirc}
+that is the part
+of {\tt fullcircle} above the $x$ axis. Path~{\tt ab} is the initialized
+using a predefined macro {\tt buildcycle} that will be discussed shortly.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(22);
+path a, b, aa, ab;
+a = fullcircle scaled 2cm;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+ab = buildcycle(aa, b);
+picture pa, pb;
+pa = thelabel(btex $A$ etex, (0,-.5cm));
+pb = thelabel(btex $B$ etex, (0,1.5cm));
+fill a withcolor .7white;
+fill b withcolor .7white;
+fill ab withcolor .4white;
+unfill bbox pa;
+draw pa;
+unfill bbox pb;
+draw pb;
+label.lft(btex $U$ etex, (-1cm,.5cm));
+draw bbox currentpicture;
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\epsfbox{manfig.22}}
+$$
+\caption{MetaPost code and the corresponding output.}
+\index{fullcircle?\texttt{fullcircle}}\index{halfcircle?\texttt{halfcircle}}\index{buildcycle?\texttt{buildcycle}}
+\label{fig21}
+\end{figure}
+
+Filling circle {\tt a} with the light gray color {\tt .7white} and then doing the
+same with circle {\tt b} doubly fills the region where the disks overlap. The
+rule is that each {\tt fill} statement assigns the given color to all points in
+the region covered, wiping out whatever was there previously including lines and
+text as well as filled regions. Thus it is important to give {\tt fill} commands
+in the right order.
+In the above example, the overlap region gets the same color twice,
+leaving it light gray after the first two {\tt fill} statements. The third fill
+statement assigns the darker color {\tt .4white} to the overlap region.
+
+At this point the circles and the overlap region have their final colors but
+there are no cutouts for the labels. The cutouts are achieved by the
+{\tt unfill}\index{unfill?\texttt{unfill}}\label{Dunfill}
+statements that effectively erase\index{erasing}
+the regions bounded by {\tt bbox pa}\index{bbox?\texttt{bbox}} and
+{\tt bbox pb}. More precisely, {\tt unfill} is shorthand for filling
+{\tt withcolor background}, where {\tt background} is normally equal to {\tt white}
+as is appropriate for printing on white paper. If necessary, you can assign a new
+color value to {\tt background}\index{background?\texttt{background}}\label{Dbground}.
+
+The labels need to be stored in pictures {\tt pa} and {\tt pb} to allow
+for measuring their bounding box before actually drawing them. The macro
+{\tt thelabel}\index{thelabel?\texttt{thelabel}} creates such
+pictures and shifts them into position so that they are ready to draw. Using the
+resulting pictures in {\tt draw} statements of the form\index{draw?\texttt{draw}}
+$$ {\tt draw}\, \descr{picture expression} $$
+adds them to {\tt currentpicture}\index{currentpicture?\texttt{currentpicture}}
+so that they overwrite a portion of what has
+already been drawn. In Figure~\ref{fig21} just the white rectangles produced by
+{\tt unfill} get overwritten.
+
+\subsection{Building Cycles}
+\label{buildcy}
+
+The {\tt buildcycle}\index{buildcycle?\texttt{buildcycle}} command constructs paths for use with
+the {\tt fill} or {\tt unfill} macros. When given two or more paths such as
+{\tt aa} and {\tt b},
+the {\tt buildcycle} macro tries to piece them together so as to form a cyclic
+path. In this case path {\tt aa} is a semicircle that starts just to the right
+of the intersection with path {\tt b}, then passes through {\tt b} and ends just
+outside the circle on the left as shown in Figure~\ref{fig22}a.
+
+Figure~\ref{fig22}b shows how {\tt buildcycle} forms a closed
+cycle from pieces of paths {\tt aa} and {\tt b}.
+The {\tt buildcycle} macro detects the two intersections\index{intersections}
+labeled 1 and 2 in
+Figure~\ref{fig22}b. Then it constructs the cyclic path shown in bold in the
+figure by going forward along path {\tt aa} from intersection~1 to
+intersection~2 and then forward around the counter-clockwise path {\tt b} back to
+intersection~1. It turns out that {\tt buildcycle(a,b)} would have produced the
+same result, but the reasoning behind this is a little confusing.
+
+
+\begin{figure}[htp]
+$$ {\epsfbox{manfig.123} \atop (a)}
+ \qquad {\epsfbox{manfig.223} \atop (b)}
+$$
+\caption[A demonstration of cycle building]
+ {(a)~The semicircular path~{\tt aa}
+ with a dashed line marking path {\tt b}; (b)~paths~{\tt aa} and {\tt b}
+ with the portions selected by {\tt buildcycle} shown by heavy lines.}
+\label{fig22}
+\end{figure}
+
+It is a easier to use the {\tt buildcycle} macro in situations like
+Figure~\ref{fig23} where there are more than two path arguments and each pair
+of consecutive paths has a unique intersection. For instance, the line~{\tt q0.5}
+and the curve~{\tt p2} intersect only at point~$P$; and the curve {\tt p2} and the
+line~{\tt q1.5} intersect only at point~$Q$. In fact, each of the points $P$,
+$Q$, $R$, $S$ is a unique intersection, and the result of\index{buildcycle?\texttt{buildcycle}}
+$$ \hbox{\tt buildcycle(q0.5, p2, q1.5, p4)} $$
+takes {\tt q0.5} from $S$ to~$P$, then {\tt p2} from $P$ to~$Q$, then {\tt q1.5}
+from $Q$ to~$R$, and finally {\tt p4} from $R$ back to~$S$. An examination of the
+MetaPost code for Figure~\ref{fig23} reveals that you have to go backwards along
+{\tt p2} in order to get from $P$ to~$Q$. This works perfectly well as long as
+the intersection\index{intersection} points are uniquely defined but it can cause
+unexpected results when pairs of paths intersect more than once.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(24);
+h=2in; w=2.7in;
+path p[], q[], pp;
+for i=2 upto 4: ii:=i**2;
+ p[i] = (w/ii,h){1,-ii}...(w/i,h/i)...(w,h/ii){ii,-1};
+endfor
+q0.5 = (0,0)--(w,0.5h);
+q1.5 = (0,0)--(w/1.5,h);
+pp = buildcycle(q0.5, p2, q1.5, p4);
+fill pp withcolor .7white;
+z0=center pp;
+picture lab; lab=thelabel(btex $f>0$ etex, z0);
+unfill bbox lab; draw lab;
+draw q0.5; draw p2; draw q1.5; draw p4;
+dotlabel.top(btex $P$ etex, p2 intersectionpoint q0.5);
+dotlabel.rt(btex $Q$ etex, p2 intersectionpoint q1.5);
+dotlabel.lft(btex $R$ etex, p4 intersectionpoint q1.5);
+dotlabel.bot(btex $S$ etex, p4 intersectionpoint q0.5);
+endfig;
+\end{verbatim}
+\atop \mathcenter{\epsfbox{manfig.24}}
+$$
+\caption{MetaPost code and the corresponding output.}
+\label{fig23}
+\end{figure}
+
+The general rule for the {\tt buildcycle} macro is that
+$$ \hbox{\tt buildcycle(}p_1\hbox{\tt,}\, p_2\hbox{\tt,}\,
+ p_3\hbox{\tt,}\, \ldots \hbox{\tt,} p_k \hbox{\tt )}
+$$
+chooses the intersection between each $p_i$ and $p_{i+1}$ to be as late as possible
+on $p_i$ and as early as possible on $p_{i+1}$. There is no
+simple rule for resolving conflicts between these two goals, so you should avoid
+cases where one intersection point occurs later on $p_i$ and another
+intersection\index{intersection} point occurs earlier on $p_{i+1}$.
+
+The preference for intersections as late as possible
+on $p_i$ and as early as possible on $p_{i+1}$ leads to ambiguity resolution in
+favor of forward-going subpaths. For cyclic paths such as path~{\tt b} in
+Figure~\ref{fig22} ``early'' and ``late'' are relative to a start/finish point
+which is where you get back to when you say ``{\tt ..cycle}''.
+For the path~{\tt b}, this turns out to be the rightmost point on the circle.
+
+A more direct way to deal with path intersections is via the
+\tdescr{secondary binop}\index{secondary binop?\tdescr{secondary binop}}
+{\tt intersection\-point}\index{intersectionpoint?\texttt{intersectionpoint}}\label{Disecpt}
+that finds the points $P$, $Q$, $R$, and~$S$ in Figure~\ref{fig23}.
+This macro finds a point where two given
+paths intersect. If there is more than one intersection point, it just chooses
+one; if there is no intersection, the macro generates an error message.
+
+\subsection{Dealing with Paths Parametrically}
+
+The {\tt intersectionpoint}\index{intersectionpoint?\texttt{intersectionpoint}} macro is based on a
+primitive operation called
+{\tt intersectiontimes}\index{intersectiontimes?\texttt{intersectiontimes}}\label{Disectt}.
+This \tdescr{secondary binop} is one of several
+operations that deal with paths parametrically. It locates an intersection
+between two paths by giving the ``time'' parameter on each path. This refers to
+the parameterization scheme from Section~\ref{curves} that described paths as
+piecewise cubic curves $\bigl(X(t),Y(t)\bigr)$ where $t$ ranges from zero to the
+number of curve segments. In other words, when a path is specified as passing
+through a sequence of points, where $t=0$ at the first point,
+then $t=1$ at the next, and $t=2$ at the next, etc. The result of
+$$ \hbox{\tt a intersectiontimes b} $$
+is $(-1,-1)$ if there is no intersection; otherwise you get
+a pair $(t_a,t_b)$, where $t_a$ is a time on path {\tt a} when it intersects
+path~{\tt b}, and $t_b$ is the corresponding time on path~{\tt b}.
+
+For example, suppose path~{\tt a} is denoted by the thin line in Figure~\ref{fig24}
+and path~{\tt b} is denoted by the thicker line. If the labels indicate time
+values on the paths, the pair of time values computed by
+$$ \hbox{\tt a intersectiontimes b} $$
+must be one of
+$$ (0.25,1.77),\ (0.75,1.40), {\rm or}\ (2.58,0.24), $$
+depending on which of the three intersection points is chosen by the MetaPost
+interpreter. The exact rules for choosing among multiple intersection points
+are a little complicated, but it turns out that you get the time values
+$(0.25,1.77)$ in this example. Smaller time values are preferred over larger
+ones so that $(t_a,t_b)$ is preferred to $(t'_a,t'_b)$ whenever $t'_a<t_a$ and
+$t_b<t'_b$. When no single alternative minimizes both the $t_a$ and $t_b$
+components the $t_a$ component tends to get priority, but the rules get more
+complicated when there are no integers between $t_a$
+and $t'_a$\index{intersection}.
+(For more details, see {\it The \MF book}.\cite[Chapter 14]{kn:c})
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.25} $$
+\caption{Two intersecting paths with time values marked on each path.}
+\label{fig24}
+\end{figure}
+
+The {\tt intersectiontimes} operator is more flexible than {\tt intersectionpoint}
+because there are a number of things that can be done with time values on a path.
+One of the most important is just to ask ``where is path {\tt p} at
+time {\tt t}?'' The construction\index{point of?\texttt{point of}}\label{Dpntof}
+$$ {\tt point}\, \descr{numeric expression}\, {\tt of}\, \descr{path primary} $$
+answers this question. If the \tdescr{numeric expression} is less than zero or
+greater than the time value assigned to the last point on the path, the
+{\tt point of} construction normally yields an endpoint of the path. Hence, it
+is common to use the predefined constant
+{\tt infinity}\index{infinity?\texttt{infinity}}\label{Dinf}
+(equal to 4095.99998) as the
+\tdescr{numeric expression} in a {\tt point of} construction when dealing with
+the end of a path.
+
+Such ``infinite'' time values do not work for a cyclic path, since
+time values outside of the normal range can be handled by modular arithmetic in
+that case; i.e., a cyclic path~{\tt p} through points $z_0$, $z_1$, $z_2$,
+\ldots, $z_{n-1}$ has the normal parameter range $0\le t<n$, but
+$$ \hbox{\tt point t of p} $$
+can be computed for any~$t$ by first reducing $t$ modulo~$n$. If the modulus~$n$
+is not readily available,\index{length?\texttt{length}}\label{Dlength}
+$$ {\tt length}\, \descr{path primary} $$
+gives the integer value of the upper limit of the normal time parameter range
+for the specified path.
+
+MetaPost uses the same correspondence between time values and points on a path to
+evaluate the {\tt subpath}\index{subpath?\texttt{subpath}}\label{Dsubpth} operator.
+The syntax for this operator is
+$$ {\tt subpath}\, \descr{pair expression}\, {\tt of}\, \descr{path primary} $$
+If the value of the \tdescr{pair expression} is $(t_1,t_2)$ and the
+\tdescr{path primary} is $p$, the result is a path that follows $p$ from
+{\tt point $t_1$ of $p$} to {\tt point $t_2$ of $p$}. If $t_2<t_1$, the subpath
+runs backwards along~$p$.
+
+An important operation based on the {\tt subpath} operator is the
+\tdescr{tertiary binop}\index{tertiary binop?\tdescr{tertiary binop}}
+{\tt cutbefore}\index{cutbefore?\texttt{cutbefore}}\label{Dcutb}. For intersecting
+paths $p_1$ and $p_2$,
+$$ p_1\ {\tt cutbefore}\ p_2 $$
+is equivalent to
+$$ \hbox{\tt subpath (xpart($p_1$ intersectiontimes $p_2$), length $p_1$) of $p_1$}
+$$
+except that it also sets the path variable
+{\tt cuttings}\index{cuttings?\texttt{cuttings}}\label{Dcuttings} to
+the portion of $p_1$ that gets cut off. In other words, {\tt cutbefore} returns
+its first argument with the part before the intersection cut off. With multiple
+intersections, it tries to cut off as little as possible. If the paths do not
+intersect, {\tt cutbefore} returns its first argument.
+
+There is also an analogous \tdescr{tertiary binop}\index{tertiary binop?\tdescr{tertiary binop}}
+called {\tt cutafter}\index{cutafter?\texttt{cutafter}}\label{Dcuta} that works by applying
+{\tt cutbefore} with
+time reversed along its first argument. Thus
+$$ p_1\ {\tt cutafter}\ p_2 $$
+tries to cut off the part of $p_1$ after its last intersection with $p_2$.
+
+Another operator\index{direction of?\texttt{direction of}}\label{Ddirof}
+$$ {\tt direction}\, \descr{numeric expression}\, {\tt of}\, \descr{path primary}
+$$
+finds a vector in the direction of the \tdescr{path primary}. This is defined
+for any time value analogously to the {\tt point of} construction. The resulting
+direction vector has the correct orientation and a somewhat arbitrary magnitude.
+Combining {\tt point of} and {\tt direction of} constructions yields the equation
+for a tangent line as illustrated in Figure~\ref{fig25}.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(26);
+numeric scf, #, t[];
+3.2scf = 2.4in;
+path fun;
+# = .1; % Keep the function single-valued
+fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#))
+ yscaled(1/#) scaled scf;
+x1 = 2.5scf;
+for i=1 upto 2:
+ (t[i],whatever) =
+ fun intersectiontimes ((x[i],-infinity)--(x[i],infinity));
+ z[i] = point t[i] of fun;
+ z[i]-(x[i+1],0) = whatever*direction t[i] of fun;
+ draw (x[i],0)--z[i]--(x[i+1],0);
+ fill fullcircle scaled 3bp shifted z[i];
+endfor
+label.bot(btex $x_1$ etex, (x1,0));
+label.bot(btex $x_2$ etex, (x2,0));
+label.bot(btex $x_3$ etex, (x3,0));
+draw (0,0)--(3.2scf,0);
+pickup pencircle scaled 1pt;
+draw fun;
+endfig;
+\end{verbatim}
+\atop \epsfbox{manfig.26}
+$$
+\caption{MetaPost code and the resulting figure}
+\label{fig25}
+\end{figure}
+
+If you know a slope and you want to find a point on a curve where the tangent
+line has that slope,
+the {\tt directiontime}\index{directiontime of?\texttt{directiontime of}}\label{Ddtimof}
+operator inverts the {\tt direction
+of} operation. Given a direction vector and a path,
+$$ {\tt directiontime}\, \descr{pair expression}\, {\tt of}\,
+ \descr{path primary}
+$$
+returns a numeric value that gives the first time~$t$ when the path has the
+indicated direction. (If there is no such time, the result is $-1$).
+For example, if {\tt a} is the path drawn as a thin curve in Figure~\ref{fig24},
+{\tt directiontime (1,1) of a} returns 0.2084.
+
+There is also an predefined macro \index{directionpoint of?\texttt{directionpoint of}}\label{Ddpntof}
+$$ {\tt directionpoint}\, \descr{pair expression}\, {\tt of}\,
+ \descr{path primary}
+$$
+that finds the first point on a path where a given direction is achieved. The
+{\tt directionpoint} macro produces an error message if the direction does not
+occur on the path.
+
+Operators {\tt arclength}\index{arclength?\texttt{arclength}}\label{Darclng} and
+{\tt arctime of}\index{arctime of?\texttt{arctime of}}\label{Darctim} relate the ``time''
+on a path is related to the more familiar concept of
+arc length.\index{arc length}\footnote{The
+{\tt arclength} and {\tt arctime} operators are only found in MetaPost
+version 0.50 and higher.}
+The expression
+$$ \hbox{{\tt arclength} \tdescr{path primary}} $$
+gives the arc length of a path. If {\tt p} is a path and {\tt a} is a number
+between 0 and {\tt arclength p},
+$$ \hbox{\tt arctime a of p} $$
+gives the time~{\tt t} such that
+$$ \hbox{\tt arclength subpath (0,t) of p} = {\tt a}. $$
+
+\subsection{Affine Transformations}
+\label{transsec}
+\index{transform type}
+
+Note how path {\tt fun} in Figure~\ref{fig25} is first constructed as
+$$ \hbox{\verb|(0,-.1)..(1,.05){right}..(1.9,.02){right}..{curl .1}(3.2,.2)|} $$
+and then the {\tt yscaled}\index{yscaled?\texttt{yscaled}} and {\tt scaled}\index{scaled?\texttt{scaled}}
+operators are used to adjust the
+shape and size of the path. As the name suggests, an expression involving
+``{\tt yscaled 10}'' multiplies $y$ coordinates by ten so that every point $(x,y)$
+on the original path corresponds to a point $(x,10y)$ on the transformed path.
+
+Including {\tt scaled} and {\tt yscaled}, there are seven transformation
+operators that take a numeric or pair argument:\index{shifted?\texttt{shifted}}%
+\index{rotated?\texttt{rotated}}\index{slanted?\texttt{slanted}}\index{scaled?\texttt{scaled}}\index{xscaled?\texttt{xscaled}}%
+\index{yscaled?\texttt{yscaled}}\index{zscaled?\texttt{zscaled}}\label{Dtranop}
+\begin{eqnarray*}
+ (x,y){\tt\ shifted\ }(a,b) &=& (x+a,\, y+b); \\
+ (x,y){\tt\ rotated\ }\theta &=& (x\cos\theta-y\sin\theta,\,
+ x\sin\theta+y\cos\theta); \\
+ (x,y){\tt\ slanted\ }a &=& (x+ay,\, y); \\
+ (x,y){\tt\ scaled\ }a &=& (ax,\, ay); \\
+ (x,y){\tt\ xscaled\ }a &=& (ax,\, y); \\
+ (x,y){\tt\ yscaled\ }a &=& (x,\, ay); \\
+ (x,y){\tt\ zscaled\ }(a,b) &=& (ax-by,\, bx+ay).
+\end{eqnarray*}
+Most of these operations are self-explanatory except for {\tt zscaled} which can
+be thought of as multiplication of complex numbers. The effect of {\tt zscaled}
+$(a,b)$ is to rotate and scale so as to map $(1,0)$ into $(a,b)$. The effect of
+{\tt rotated}~$\theta$ is rotate $\theta$ degrees counter-clockwise.
+
+Any combination of shifting, rotating, slanting, etc.\ is an affine transformation,
+the net effect of which is to transform any pair $(x,y)$ into
+$$ (t_x+t_{xx}x+t_{xy}y,\, t_y+t_{yx}x+t_{yy}y), $$
+for some sextuple $(t_x,t_y,t_{xx},t_{xy},t_{yx},t_{yy})$. This information can
+be stored in a variable of type transform so that
+{\tt transformed T}\index{transformed?\texttt{transformed}}\label{Dtrfrmd} might be equivalent to
+$$ \hbox{\tt xscaled -1 rotated 90 shifted (1,1)} $$
+if {\tt T} is an appropriate transform variable. The
+transform~{\tt T} could then be initialized with an
+expression of type transform as follows:
+$$ \begin{verbatim}
+transform T;
+T = identity xscaled -1 rotated 90 shifted (1,1);
+\end{verbatim}
+$$
+As this example indicates, transform expressions can be built up by applying
+transformation operators to other transforms. The predefined transformation
+{\tt identity}\index{identity?\texttt{identity}}\label{Dident} is a useful starting point
+for this process.
+This can be illustrated by paraphrasing the above equation for {\tt T} into
+English: ``{\tt T} should be the transform obtained by doing whatever
+{\tt identity} does, then scaling $x$~coordinates by $-1$, rotating $45^\circ$,
+and shifting by $(1,1)$.'' This works because {\tt identity} is the identity
+transformation which does nothing; i.e., {\tt transformed identity} is a no-op.
+
+The syntax for transform expressions and transformation operators is given in
+Figure~\ref{sytrans}. It includes two more options for
+\tdescr{transformer}:\index{reflectedabout?\texttt{reflectedabout}}
+$$ \hbox{\tt reflectededabout(}p, q\hbox{\tt )} $$
+reflects about the line defined by points $p$ and $q$; and\index{rotatedaround?\texttt{rotatedaround}}
+$$ \hbox{\tt rotatedaround(}p,\theta\hbox{\tt )} $$
+rotates $\theta$ degrees counter-clockwise around point $p$. For example,
+the equation for initializing transform~{\tt T} could have been
+$$ \hbox{\tt T = identity reflectedabout((2,0), (0,2))}. $$
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{pair secondary} \rightarrow
+ \descr{pair secondary} \descr{transformer}$\\
+$\tt \descr{path secondary} \rightarrow
+ \descr{path secondary} \descr{transformer}$\\
+$\tt \descr{picture secondary} \rightarrow
+ \descr{picture secondary} \descr{transformer}$\\
+$\tt \descr{pen secondary} \rightarrow
+ \descr{pen secondary} \descr{transformer}$\\
+$\tt \descr{transform secondary} \rightarrow
+ \descr{transform secondary} \descr{transformer}$\\[6pt]
+$\tt \descr{transformer} \rightarrow rotated \descr{numeric primary}$\\
+$\tt \qquad \;|\; scaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; shifted \descr{pair primary}$\\
+$\tt \qquad \;|\; slanted \descr{numeric primary}$\\
+$\tt \qquad \;|\; transformed \descr{transform primary}$\\
+$\tt \qquad \;|\; xscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; yscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; zscaled \descr{pair primary}$\\
+$\tt \qquad \;|\; reflectedabout\hbox{\tt (}\descr{pair expression}
+ \hbox{\tt ,}\descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; rotatedaround\hbox{\tt (}\descr{pair expression}
+ \hbox{\tt ,}\descr{numeric expression}\hbox{\tt )}$\\
+\end{ctabbing}
+\caption{The syntax for transforms and related operators}
+\label{sytrans}
+\end{figure}
+
+There is also a unary operator {\tt inverse}\index{inverse?\texttt{inverse}}\label{Dinv}
+that takes a
+transform and finds another transform that undoes the effect of the first
+transform. Thus if
+$$ p = q{\tt\ transformed\ }T $$
+then
+$$ q = p{\tt\ transformed\ inverse\ }T. $$
+
+It is not legal to take the {\tt inverse} of an
+unknown transform\index{transformation!unknown} but we
+have already seen that you can say
+$$ \hbox{\tt T = } \descr{transform expression} $$
+when {\tt T} has not been given a value yet. It is also possible to apply
+an unknown transform to a known pair or transform and use the result in a linear
+equation. Three such equations are sufficient to determine a transform. Thus
+the equations
+$$ \begin{verbatim}
+(0,1) transformed T' = (3,4);
+(1,1) transformed T' = (7,1);
+(1,0) transformed T' = (4,-3);
+\end{verbatim}
+$$
+allow MetaPost to determine that the transform {\tt T'} is a combination of
+rotation and scaling with
+$$\openup\jot
+ \tabskip=0pt plus 1fil
+ \halign to\displaywidth{\tabskip=0pt
+ \hfil$\displaystyle{#}$& $\displaystyle{{}#}$\hfil \qquad&
+ \hfil$\displaystyle{#}$& $\displaystyle{{}#}$\hfil
+ \tabskip=0pt plus 1fil\cr
+\noalign{\vskip-\jot}
+ t_{xx}&=4,& t_{yx}&=-3,\cr
+ t_{yx}&=3,& t_{yy}&=4,\cr
+ t_x&=0,& t_y&=0.\cr}
+$$
+
+Equations involving an unknown transform are treated as linear equations in the
+six parameters that define the transform. These six parameters can also be
+referred to directly as\index{xpart?\texttt{xpart}}\index{ypart?\texttt{ypart}}\index{xxpart?\texttt{xxpart}}%
+\index{xypart?\texttt{xypart}}\index{yxpart?\texttt{yxpart}}\index{yypart?\texttt{yypart}}\label{Dtrprt}
+$$ {\tt xpart\ T},\ {\tt ypart\ T},\ {\tt xxpart\ T},\ {\tt xypart\ T},\
+ {\tt yxpart\ T},\ {\tt yypart\ T},
+$$
+where {\tt T} is a transform. For instance, Figure~\ref{fig27} uses the
+equations
+$$ \hbox{\tt xxpart T=yypart T; yxpart T=-xypart T} $$
+to specify that {\tt T} is shape preserving; i.e., it is a combination of
+rotating, shifting, and uniform scaling.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(28);
+path p[];
+p1 = fullcircle scaled .6in;
+z1=(.75in,0)=-z3;
+z2=directionpoint left of p1=-z4;
+p2 = z1..z2..{curl1}z3..z4..{curl 1}cycle;
+fill p2 withcolor .4[white,black];
+unfill p1;
+draw p1;
+transform T;
+z1 transformed T = z2;
+z3 transformed T = z4;
+xxpart T=yypart T; yxpart T=-xypart T;
+picture pic;
+pic = currentpicture;
+for i=1 upto 2:
+ pic:=pic transformed T;
+ draw pic;
+endfor
+dotlabels.top(1,2,3); dotlabels.bot(4);
+endfig;
+\end{verbatim}
+\quad \mathcenter{\epsfbox{manfig.28}}
+$$
+\caption{MetaPost code and the resulting ``fractal'' figure}
+\label{fig27}
+\end{figure}
+
+
+\subsection{Dashed Lines}
+
+The MetaPost language provides many ways of changing the appearance of a line
+besides just changing its width. One way is to use dashed lines as was done in
+Figures \ref{fig4} and~\ref{fig22}. The syntax for this is\index{dashed?\texttt{dashed}}
+$$ {\tt draw}\, \descr{path expression}\, {\tt dashed}\, \descr{dash pattern} $$
+where a \tdescr{dash pattern}\index{dash pattern?\tdescr{dash pattern}} is really a special
+type of \tdescr{picture expression}. There is a predefined \tdescr{dash pattern}
+called {\tt evenly}\index{evenly?\texttt{evenly}}\label{Devenly} that makes dashes 3 PostScript
+points long separated by gaps of the same size.
+Another predefined dash pattern {\tt withdots}\index{withdots?\texttt{withdots}}\label{Dwdots}
+produces dotted lines with dots 5 PostScript points apart.\footnote{{\tt withdots}
+is only found in MetaPost version 0.50 and higher.}
+For dots further apart or longer dashes further apart, the
+\tdescr{dash pattern} can be
+scaled\index{scaled?\texttt{scaled}} as shown in Figure~\ref{fig28}
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.29} $$
+\caption[Dashed lines and the corresponding dash patters]
+ {Dashed lines each labeled with the \tdescr{dash pattern} used to create
+ it.}
+\label{fig28}
+\end{figure}
+
+Another way to change a dash pattern is to alter its phase by shifting it
+horizontally. Shifting to the right makes the dashes move forward along the
+path and shifting to the left moves them backward. Figure~\ref{fig29} illustrates
+this effect. The dash pattern can be thought of as an infinitely repeating pattern
+strung out along a horizontal line where the portion of the line to the right of
+the $y$~axis is laid out along the path to be dashed\index{dash pattern?\tdescr{dash pattern}}.
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.30} $$
+\caption[Dashed lines and the corresponding dash patters]
+ {Dashed lines and the MetaPost statements for drawing them where {\tt e4}
+ refers to the dash pattern {\tt evenly scaled 4}.}
+\label{fig29}
+\end{figure}
+
+When you shift a dash pattern so that the $y$~axis crosses the middle of a dash,
+the first dash gets truncated. Thus the line with dash pattern {\tt e4} starts
+with a dash of length 12bp followed by a 12bp gap and another 12bp dash, etc.,
+while {\tt e4 shifted (-6bp,0)} produces a 6bp dash, a 12 bp gap, then a
+12bp dash, etc. This dash pattern could be specified more directly via the
+{\tt dashpattern}\index{dash pattern?\texttt{dash pattern}}\label{Ddshpat} function:
+$$ \hbox{\tt dashpattern(on 6bp off 12bp on 6bp)} $$
+This means ``draw the first 6bp of the line, then skip the next 12bp, then draw
+another 6bp and repeat.'' If the line to be dashed is more than 30bp long, the
+last 6bp of the first copy of the dash pattern will merge with the first 6bp of
+the next copy to form a dash 12bp long. The general syntax for the
+{\tt dashpattern} function is shown in Figure~\ref{sydash}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{dash pattern} \rightarrow dashpattern
+ \hbox{\tt (}\descr{on/off list}\hbox{\tt )}$\\
+$\tt \descr{on/off list} \rightarrow
+ \descr{on/off list}\descr{on/off clause} \;|\; \descr{on/off clause}$\\
+$\tt \descr{on/off clause} \rightarrow on \descr{numeric tertiary}
+ \;|\; off \descr{numeric tertiary}$
+\end{ctabbing}
+\caption{The syntax for the {\tt dashpattern} function}
+\label{sydash}
+\end{figure}
+
+Since a dash pattern is really just a special kind of picture, the
+{\tt dashpattern} function returns a picture. It is not really necessary to know
+the structure of such a picture, so the casual reader will probably want to skip
+on to Section~\ref{oopt}. For those who want to know, a little experimentation
+shows that if {\tt d} is
+$$ \hbox{\tt dashpattern(on 6bp off 12bp on 6bp)}, $$
+then {\tt llcorner d} is $(0,24)$ and {\tt urcorner d} is $(24,24)$. Drawing
+{\tt d} directly without using it as a dash pattern produces two thin horizontal
+line segments like this:
+$$ \epsfbox{manfig.31} $$
+The lines in this example are specified as having width zero, but this does not
+matter because the line width is ignored when a picture is used as a dash pattern.
+
+The general rule for interpreting a picture {\tt d} as a dash pattern is that
+the line segments in {\tt d} are projected onto the $x$-axis and the resulting
+pattern is replicated to infinity in both directions by placing copies of the
+pattern end-to-end. The actual dash lengths are obtained by starting at $x=0$
+and scanning in the positive $x$ direction.
+
+To make the idea of ``replicating to infinity'' more precise, let $P({\tt d})$
+be the projection of {\tt d} onto the $x$~axis, and let
+${\rm shift}(P({\tt d}),x)$ be the result of shifting {\tt d} by~$x$.
+The pattern resulting from infinite replication is
+$$ \bigcup_{{\rm integers}\ n} {\rm shift}(P(d),\, n\cdot\ell(d)), $$
+where $\ell(d)$ measures the length of $P(d)$. The most restrictive possible
+definition of this length is $d_{\rm max}-d_{\rm min}$,
+where $[d_{\rm min},d_{\rm max}]$
+is the range of $x$~coordinates in $P(d)$. In fact, MetaPost uses
+$$ \max(\left|y_0({\tt d})\right|,\, d_{\rm max}-d_{\rm min}), $$
+where $y_0({\tt d})$ is the $y$ coordinate of the contents of {\tt d}.
+The contents of {\tt d} should lie on a horizontal line, but if they do not,
+the MetaPost interpreter just picks
+a $y$~coordinate that occurs in {\tt d}\index{dash pattern?\tdescr{dash pattern}}.
+
+A picture used as a dashed pattern must contain no text or filled regions,
+but it can contain lines that are themselves dashed. This can give small dashes
+inside of larger dashes as shown in
+Figure~\ref{fig32}\index{dash pattern?\tdescr{dash pattern}!recursive}
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(32);
+draw dashpattern(on 15bp off 15bp) dashed evenly;
+picture p;
+p=currentpicture;
+currentpicture:=nullpicture;
+draw fullcircle scaled 1cm xscaled 3 dashed p;
+endfig;
+\end{verbatim}
+\quad \mathcenter{\epsfbox{manfig.32}}
+$$
+\caption{MetaPost code and the corresponding output}
+\label{fig32}
+\end{figure}
+
+
+\subsection{Other Options}
+\label{oopt}
+
+You might have noticed that the dashed lines produced by
+{\tt dashed evenly}\index{evenly?\texttt{evenly}} appear
+to have more black than white. This is an effect of the
+{\tt linecap}\index{linecap?\texttt{linecap}}\label{Dlinecap} parameter
+that controls the appearance of the ends of lines as well as the ends of dashes.
+There are also a number of other ways to affect the appearance of things drawn
+with MetaPost.
+
+The {\tt linecap} parameter has three different settings just as in PostScript.
+Plain MetaPost gives this
+internal variable\index{internal variables}\index{variables!internal} the
+default value {\tt rounded}\index{rounded?\texttt{rounded}}
+which causes line segments to be drawn with rounded ends like the segment from
+{\tt z0} to {\tt z3} in Figure~\ref{fig33}. Setting
+${\tt linecap}\mathrel{\hbox{\tt:=}}{\tt butt}$\index{butt?\texttt{butt}}\label{Dbutt}
+cuts the ends off
+flush so that dashes produced by {\tt dashed evenly}\index{evenly?\texttt{evenly}} have
+length 3bp, not 3bp plus the line width. You can also get squared-off ends
+that extend past the specified endpoints by setting
+${\tt linecap}\mathrel{\hbox{\tt:=}}{\tt squared}$\index{squared?\texttt{squared}}\label{Dsqred}
+as was done in the line from {\tt z2} to {\tt z5} in Figure~\ref{fig33}.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(33);
+for i=0 upto 2:
+ z[i]=(0,40i); z[i+3]-z[i]=(100,30);
+endfor
+pickup pencircle scaled 18;
+draw z0..z3 withcolor .8white;
+linecap:=butt;
+draw z1..z4 withcolor .8white;
+linecap:=squared;
+draw z2..z5 withcolor .8white;
+dotlabels.top(0,1,2,3,4,5);
+endfig; linecap:=rounded;
+\end{verbatim}
+\qquad
+\mathcenter{\epsfbox{manfig.33}}
+$$
+\caption{MetaPost code and the corresponding output}
+\label{fig33}
+\end{figure}
+
+Another parameter borrowed from PostScript affects the way a {\tt draw} statement
+treats sharp corners\index{corners} in the path to be drawn.
+The {\tt linejoin}\index{linejoin?\texttt{linejoin}}\label{Dlinejoin} parameter can
+be {\tt rounded}\index{rounded?\texttt{rounded}}\label{Drnded},
+{\tt beveled}\index{beveled?\texttt{beveled}}\label{Dbvled},
+or {\tt mitered}\index{mitered?\texttt{mitered}}\label{Dmitred} as shown in Figure~\ref{fig34}.
+The default value for plain MetaPost is {\tt rounded} which gives the effect of
+drawing with a circular brush.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(34);
+for i=0 upto 2:
+ z[i]=(0,50i); z[i+3]-z[i]=(60,40);
+ z[i+6]-z[i]=(120,0);
+endfor
+pickup pencircle scaled 24;
+draw z0--z3--z6 withcolor .8white;
+linejoin:=mitered;
+draw z1..z4--z7 withcolor .8white;
+linejoin:=beveled;
+draw z2..z5--z8 withcolor .8white;
+dotlabels.bot(0,1,2,3,4,5,6,7,8);
+endfig; linejoin:=rounded;
+\end{verbatim}
+\qquad
+\mathcenter{\epsfbox{manfig.34}}
+$$
+\caption{MetaPost code and the corresponding output}
+\label{fig34}
+\end{figure}
+
+When {\tt linejoin} is {\tt mitered}, sharp corners generate long pointed features
+as shown in Figure~\ref{fig35}. Since this might be undesirable, there is an
+internal variable\index{internal variables}\index{variables!internal}
+called {\tt miterlimit}\index{miterlimit?\texttt{miterlimit}}\label{Dmiterlim} that controls how
+extreme the situation can get before the mitered join is replaced by a beveled
+join. For Plain MetaPost, {\tt miterlimit} has a default value of 10.0 and line
+joins revert to beveled when the ratio of miter length to line width
+reaches this value.
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.35} $$
+\caption{The miter length and line width whose ratio is limited by
+ {\tt miterlimit}.}
+\label{fig35}
+\end{figure}
+
+The {\tt linecap}, {\tt linejoin}, and {\tt miterlimit} parameters are especially
+important because they also affect things that get drawn behind the scenes.
+For instance, Plain MetaPost has statements for drawing
+arrows\index{arrows}, and the arrowheads are slightly rounded when {\tt linejoin}
+is {\tt rounded}. The effect depends on the line width and is quite subtle at the
+default line width of 0.5bp as shown in Figure~\ref{fig36}.
+
+\begin{figure}[htp]
+$$\epsfbox{manfig.36}$$
+\caption{Three ways of drawing arrows.}
+\label{fig36}
+\end{figure}
+
+Drawing arrows like the ones in Figure~\ref{fig36} is simply a matter of
+saying\index{drawarrow?\texttt{drawarrow}}\label{Ddrwarr}
+$$ {\tt drawarrow}\, \descr{path expression} $$
+instead of {\tt draw} \tdescr{path expression}. This draws the given path with
+an arrowhead at the last point on the path. If you want the arrowhead at the
+beginning of the path, just use the unary operator
+{\tt reverse}\index{reverse?\texttt{reverse}}\label{Drevrse} to take the
+original path and make a new one with its time sense reversed; i.e., for a
+path~{\tt p} with {\tt length p}${}=n$,
+$$ {\tt point\ } t {\tt\ of\ reverse\ p}
+ \quad {\rm and} \quad
+ {\tt point\ } n-t {\tt\ of\ p}
+$$ are synonymous.
+
+As shown in Figure~\ref{fig36}, a statement beginning\index{drawdblarrow?\texttt{drawdblarrow}}%
+\index{arrows!double-headed}\label{Ddrwdar}
+$$ {\tt drawdblarrow}\, \descr{path expression} $$
+draws a double-headed arrow. The size of the arrowhead is guaranteed to be
+larger than the line width, but it might need adjusting if the line width is
+very great. This is done by assigning a new value to the
+internal variable\index{internal variables}\index{variables!internal}
+{\tt ahlength}\index{ahlength?\texttt{ahlength}}\label{Dahlength}
+that determines arrowhead length as shown in Figure~\ref{fig37}.
+Increasing {\tt ahlength} from the default value of 4 PostScript points to
+1.5 centimeters produces the large arrowhead in Figure~\ref{fig37}. There
+is also an {\tt ahangle}\index{ahangle?\texttt{ahangle}}\label{Dahangle}
+parameter that controls the angle
+at the tip of the arrowhead. The default value of this angle is 45 degrees
+as shown in the figure.
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.37} $$
+\caption[A large arrowhead with key parameters labeled.]
+ {A large arrowhead with key parameters labeled and paths used to
+ draw it marked with white lines.}
+\label{fig37}
+\end{figure}
+
+The arrowhead is created by filling the triangular region that is outlined
+in white in Figure~\ref{fig37} and then drawing around it with the currently
+picked up pen. This combination of filling and drawing can be combined into
+a single {\tt filldraw} statement\index{filldraw?\texttt{filldraw}}\label{Dfildrw}:
+$$ {\tt filldraw}\, \descr{path expression}\,
+ \descr{optional {\tt dashed} and {\tt withcolor} and {\tt withpen} clauses};
+$$
+The \tdescr{path expression} should be a closed cycle like the triangular path
+in Figure~\ref{fig37}. This path should not be confused with the path argument
+to {\tt drawarrow} which is indicated by a white line in the figure.
+
+White lines like the ones in the figure can be created by an
+{\tt undraw}\index{undraw?\texttt{undraw}}\label{Dundraw} statement.
+This is an erasing\index{erasing}
+version of {\tt draw} that draws {\tt withcolor background}\index{background?\texttt{background}}
+just as the {\tt unfill} statement does. There is also an
+{\tt unfilldraw}\index{unfilldraw?\texttt{unfilldraw}}\label{Dunfdrw}
+statement just in case someone finds a
+use for it.
+
+The {\tt filldraw}, {\tt undraw} and {\tt unfilldraw} statements and all the
+arrow drawing statements are like the {\tt fill} and {\tt draw} statements in that
+they take {\tt dashed}\index{dashed?\texttt{dashed}}, {\tt withpen}\index{withpen?\texttt{withpen}},
+and {\tt withcolor}\index{withcolor?\texttt{withcolor}} options.
+When you have a lot of drawing statements it is
+nice to be able to apply an option such as {\tt withcolor 0.8white} to all of
+them without having to type this repeatedly as was done in Figures \ref{fig33}
+and~\ref{fig34}. The statement for this purpose is\index{drawoptions?\texttt{drawoptions}}\label{Ddropts}
+$$ \hbox{\tt drawoptions(} \descr{text} \hbox{\tt )} $$
+where the \tdescr{text} argument gives a sequence of {\tt dashed}, {\tt withcolor},
+and {\tt withpen} options to be applied automatically to all drawing statements.
+If you specify
+$$ \hbox{\tt drawoptions(withcolor .5[black,white])} $$
+and then want to draw a black line, you can override the {\tt drawoptions}
+by specifying
+$$ {\tt draw}\, \descr{path expression}\, {\tt withcolor\ black} $$
+To turn off {\tt drawoptions} all together, just give an empty list:
+$$ \hbox{\tt drawoptions()} $$
+(This is done automatically by the {\tt beginfig}\index{beginfig?\texttt{beginfig}} macro).
+
+Since irrelevant options are ignored, there is no harm in giving a statement
+like
+$$ \hbox{\tt drawoptions(dashed evenly)} $$
+followed by a sequence of {\tt draw} and {\tt fill} commands. It does not make
+sense to use a dash pattern when filling so the {\tt dashed evenly} gets ignored
+for {\tt fill} statements. It turns out that
+$$ \hbox{\tt drawoptions(withpen } \descr{pen expression} \hbox{\tt )} $$
+does affect {\tt fill} statements as well as {\tt draw} statements.
+In fact there is a special pen variable called
+{\tt currentpen}\index{currentpen?\texttt{currentpen}} such that
+{\tt fill} \ldots\ {\tt withpen currentpen} is equivalent to a {\tt filldraw}
+statement.
+
+Precisely what does it mean to say that drawing options affect those statements
+where they make sense? The {\tt dashed} \tdescr{dash pattern} option only affects
+$$ {\tt draw}\, \descr{path expression} $$
+statements, and text appearing in the \tdescr{picture expression} argument to
+$$ {\tt draw}\, \descr{picture expression} $$
+statement is only affected by the {\tt withcolor} \tdescr{color expression} option.
+For all other combinations of drawing statements and options, there is some effect.
+An option applied to a {\tt draw} \tdescr{picture expression} statement will in
+general affect some parts of the picture but not others. For instance,
+a {\tt dashed} or {\tt withpen} option will affect all the lines in the picture
+but none of the labels.
+
+
+\subsection{Pens}
+
+Previous sections have given numerous examples of {\tt pickup}
+\tdescr{pen expression} and {\tt withpen} \tdescr{pen expression}, but there have
+not been any examples of pen expressions other than
+$$ {\tt pencircle\ scaled}\, \descr{numeric primary} $$
+which produces lines of a specified width. For calligraphic effects such in
+Figure~\ref{fig38}, you can apply any of the transformation operators discussed
+in Section~\ref{transsec}. The starting point for such transformations is
+{\tt pencircle}\index{pencircle?\texttt{pencircle}}\label{Dpncirc},
+a circle one PostScript point in diameter. Thus affine
+transformations produce a circular or elliptical\index{pens!elliptical} pen shape.
+The width of lines drawn with the pen depends on how nearly perpendicular the line
+is to the long axis of the ellipse.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(38);
+pickup pencircle scaled .2in yscaled .08 rotated 30;
+x0=x3=x4;
+z1-z0 = .45in*dir 30;
+z2-z3 = whatever*(z1-z0);
+z6-z5 = whatever*(z1-z0);
+z1-z6 = 1.2*(z3-z0);
+rt x3 = lft x2;
+x5 = .55[x4,x6];
+y4 = y6;
+lft x3 = bot y5 = 0;
+top y2 = .9in;
+draw z0--z1--z2--z3--z4--z5--z6 withcolor .7white;
+dotlabels.top(0,1,2,3,4,5,6);
+endfig;
+\end{verbatim}
+\quad \mathcenter{\epsfbox{manfig.38}}
+$$
+\caption{MetaPost code and the resulting ``calligraphic'' figure.}
+\label{fig38}\index{lft?\texttt{lft}}\index{bot?\texttt{bot}}\index{top?\texttt{top}}
+\end{figure}
+
+Figure~\ref{fig38} demonstrates operators {\tt lft}\index{lft?\texttt{lft}}\label{Dlft},
+{\tt rt}\index{rt?\texttt{rt}}\label{Drt}, {\tt top}\index{top?\texttt{top}}\label{Dtop},
+and {\tt bot}\index{bot?\texttt{bot}}\label{Dbot}
+that answer the question, ``If the current pen is placed at the position
+given by the argument, where will its left, right, top, or bottom edge be?''
+In this case the current pen is the ellipse given in the {\tt pickup} statement
+and its bounding box is 0.1734 inches wide and 0.1010 inches high, so
+{\tt rt x3} is ${\tt x3}+{\tt 0.0867in}$ and {\tt bot y5} is
+${\tt y5}-{\tt 0.0505in}$.
+The {\tt lft}, {\tt rt}, {\tt top}, and {\tt bot} operators also accept arguments
+of type pair in which case they compute the $x$ and~$y$ coordinates of the
+leftmost, rightmost, topmost, or bottommost point on the pen shape. For example,
+$$ {\tt rt}(x,y) = (x,y)+({\tt 0.0867in}, {\tt 0.0496in}) $$
+for the pen in Figure~\ref{fig38}. Note that {\tt beginfig}\index{beginfig?\texttt{beginfig}}
+resets the current pen to a default value of
+$$ \hbox{\tt pencircle scaled 0.5bp} $$
+at the beginning of each figure. This value can be reselected at any time
+by giving the command
+{\tt pickup defaultpen}\index{defaultpen?\texttt{defaultpen}}\label{Ddefaultpen}.
+
+This would be the end of the story on pens, except that
+for compatibility with \MF\index{metafont?\MF}, MetaPost also allows pen shapes to be
+polygonal\index{pens!polygonal}.
+There is a predefined pen called
+{\tt pensquare}\index{pensquare?\texttt{pensquare}}\label{Dpnsqr} that
+can be transformed to yield pens shaped like parallelograms. In fact, there is
+even an operator called {\tt makepen}\index{makepen?\texttt{makepen}}\label{Dmkpen} that takes
+a convex-polygon-shaped path and makes a pen that shape and size. If the path is
+not exactly convex or polygonal, the {\tt makepen} operator will straighten the
+edges and/or drop some of the vertices.
+In particular, {\tt pensquare} is equivalent to
+$$ \hbox{\tt makepen((-.5,-.5)--(.5,-.5)--(.5,.5)--(-.5,.5)--cycle)} $$
+
+The inverse of {\tt makepen} is the
+{\tt makepath}\index{makepath?\texttt{makepath}}\label{Dmkpath} operator
+that takes a \tdescr{pen primary} and returns the corresponding path. Thus
+{\tt makepath pencircle} produces a circular path identical to
+{\tt fullcircle}\index{fullcircle?\texttt{fullcircle}}. This also works for a polygonal pen
+so that
+$$ {\tt makepath\ makepen}\, \descr{path expression} $$
+will take any cyclic path and turn it into a convex polygon\index{convex polygons}.
+
+
+\subsection{Clipping and Low-Level Drawing Commands}
+
+Drawing statements such as {\tt draw}, {\tt fill}, {\tt filldraw}, and {\tt unfill}
+are part of the Plain macro\index{Plain macros} package and are defined in terms
+of more primitive statements. The main difference between the drawing
+statements discussed in previous sections and the more primitive versions is that
+the primitive drawing statements all require you to specify a picture variable to
+hold the results. For {\tt fill}, {\tt draw}, and related statements, the results
+always go to a picture variable called
+{\tt currentpicture}\index{currentpicture?\texttt{currentpicture}}\label{Dcurpic}.
+The syntax for the primitive
+drawing statements that allow you to specify a picture variable is shown in
+Figure~\ref{sydraw}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{addto command} \rightarrow$\\
+$\tt \qquad addto \descr{picture variable} also
+ \descr{picture expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{picture variable}
+ contour \descr{path expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{picture variable}
+ doublepath \descr{path expression} \descr{option list}$\\
+$\tt \descr{option list} \rightarrow \descr{empty} \;|\;
+ \descr{drawing option} \descr{option list}$\\
+$\tt \descr{drawing option} \rightarrow withcolor \descr{color expression}$\\
+$\tt \qquad \;|\; withpen \descr{pen expression} \;|\;
+ dashed \descr{picture expression}$
+\end{ctabbing}
+\caption{The syntax for primitive drawing statements}
+\label{sydraw}
+\index{option list?\tdescr{option list}}\index{addto also?\texttt{addto also}}\index{addto contour?\texttt{addto contour}}%
+\index{addto doublepath?\texttt{addto doublepath}}\index{withcolor?\texttt{withcolor}}\index{withpen?\texttt{withpen}}%
+\index{dashed?\texttt{dashed}}\index{drawing option?\tdescr{drawing option}}
+\end{figure}
+
+The syntax for primitive drawing commands is compatible with
+\MF\index{metafont?\MF}. Table~\ref{draweqv} shows how the primitive drawing statements
+relate to the familiar {\tt draw} and {\tt fill} statements. Each of the
+statements in the first column of the table could be ended with an
+\tdescr{option list} of its own, which is equivalent to appending the
+\tdescr{option list} to the corresponding entry in the second column of the table.
+For example,
+$$ {\tt draw}\ p\ {\tt withpen\ pencircle} $$
+is equivalent to
+$$ {\tt addto\ currentpicture\ doublepath}\ p\
+ {\tt withpen\ currentpen\ withpen\ pencircle}
+$$
+where {\tt currentpen}\index{currentpen?\texttt{currentpen}}\label{Dcurpen} is a special
+pen variable that always holds the last pen picked up.
+The second {\tt withpen} option silently overrides the {\tt withpen currentpen}
+from the expansion of {\tt draw}.
+
+\begin{table}[htp]
+$$\begin{tabular}{|l|l|} \hline
+\multicolumn1{|c|}{statement}& \multicolumn1{c|}{equivalent primitives}\\ \hline
+{\tt draw} {\it pic}& {\tt addto currentpicture also} {\it pic}\\
+{\tt draw} $p$& {\tt addto currentpicture doublepath} $p$
+ {\tt withpen} $q$\\
+{\tt fill} $c$& {\tt addto currentpicture contour} $c$\\
+{\tt filldraw} $c$& {\tt addto currentpicture contour} $c$ {\tt withpen} $q$\\
+{\tt undraw} {\it pic}& {\tt addto currentpicture also} {\it pic}
+ {\tt withcolor} $b$\\
+{\tt undraw} $p$& {\tt addto currentpicture doublepath} $p$
+ {\tt withpen} $q$
+ {\tt withcolor} $b$\\
+{\tt unfill} $c$& {\tt addto currentpicture contour} $c$
+ {\tt withcolor} $b$\\
+{\tt unfilldraw} $c$& {\tt addto currentpicture contour} $c$ {\tt withpen} $q$
+ {\tt withcolor} $b$\\ \hline
+\end{tabular}
+$$
+\caption[Drawing statements and equivalent primitive commands]
+ {Common drawing statements and equivalent primitive versions, where
+ $q$ stands for {\tt currentpen}, $b$ stands for {\tt background},
+ $p$ stands for any path, $c$ stands for a cyclic path, and {\it pic} stands
+ for a \tdescr{picture expression}. Note that nonempty {\tt drawoptions}
+ would complicate the entries in the second column.}
+\label{draweqv}
+\index{drawoptions?\texttt{drawoptions}}
+\end{table}
+
+There are two more primitive drawing commands that do not accept any drawing
+options. One is the {\tt setbounds} command that was discussed in
+Section~\ref{meas}; the other is the
+{\tt clip} command\index{clip?\texttt{clip}}\label{Dclip}:
+$$ {\tt clip}\, \descr{picture variable}\, {\tt to}\, \descr{path expression} $$
+Given a cyclic path, this statement trims the contents of the
+\tdescr{picture variable} to eliminate everything outside of the cyclic path.
+There is no ``high level'' version of this statement, so you have to use
+$$ {\tt clip\ currentpicture\ to}\, \descr{path expression} $$
+if you want to clip {\tt currentpicture}\index{currentpicture?\texttt{currentpicture}}.
+Figure~\ref{fig40} illustrates clipping.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(40);
+path p[];
+p1 = (0,0){curl 0}..(5pt,-3pt)..{curl 0}(10pt,0);
+p2 = p1..(p1 yscaled-1 shifted(10pt,0));
+p0 = p2;
+for i=1 upto 3: p0:=p0.. p2 shifted (i*20pt,0);
+ endfor
+for j=0 upto 8: draw p0 shifted (0,j*10pt);
+ endfor
+p3 = fullcircle shifted (.5,.5) scaled 72pt;
+clip currentpicture to p3;
+draw p3;
+endfig;
+\end{verbatim}
+\qquad
+\mathcenter{\epsfbox{manfig.40}}
+$$
+\caption{MetaPost code and the resulting ``clipped'' figure.}
+\label{fig40}
+\end{figure}
+
+All the primitive drawing operations would be useless without one last operation
+called {\tt shipout}. The statement\index{shipout?\texttt{shipout}}\label{Dship}
+$$ {\tt shipout}\, \descr{picture expression} $$
+This writes out a picture as a PostScript\index{PostScript} file whose name ends
+{\tt.}{\it nnn}, where {\tt nnn} is the decimal representation of the value of
+the internal variable\index{internal variables}\index{variables!internal}
+{\tt charcode}\index{charcode?\texttt{charcode}}\label{Dcharcode}.
+(The name ``{\tt charcode}'' is for compatibility with \MF\index{metafont?\MF}.)
+Normally, {\tt beginfig}\index{beginfig?\texttt{beginfig}} sets {\tt charcode}, and
+{\tt endfig}\index{endfig?\texttt{endfig}} invokes {\tt shipout}.
+
+\section{Macros}
+\label{macros}
+
+As alluded to earlier, MetaPost has a set of automatically included macros called
+the Plain macro package\index{Plain macros}, and some of the commands discussed in
+previous sections are defined as macros instead of being built into MetaPost.
+The purpose of this section is to explain how to write such macros.
+
+Macros with no arguments are very simple.
+A macro definition\index{replacement text?\tdescr{replacement text}}%
+\index{def?\texttt{def}}\index{enddef?\texttt{enddef}}
+$$ {\tt def}\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{replacement text}\, {\tt enddef}
+$$
+makes the \tdescr{symbolic token} an abbreviation for the \tdescr{replacement text},
+where the \tdescr{replacement text} can be virtually any sequence of tokens. For
+example, the Plain macro package could almost define the {\tt fill} statement like
+this\index{fill?\texttt{fill}}:
+$$ \hbox{\tt def fill = addto currentpicture contour enddef} $$
+
+Macros with arguments are similar, except they have formal parameters that tell
+how to use the arguments in the \tdescr{replacement text}. For example, the
+{\tt rotatedaround}\index{rotatedaround?\texttt{rotatedaround}} macro is defined like this:
+$$\begin{verbatim}
+def rotatedaround(expr z, d) =
+ shifted -z rotated d shifted z enddef;
+\end{verbatim}
+$$
+The {\tt expr}\index{expr?\texttt{expr}} in this definition means that formal parameters
+{\tt z} and {\tt d} can be arbitrary expressions. (They should be pair expressions
+but the MetaPost interpreter does not immediately check for that.)
+
+Since MetaPost is an interpreted language, macros with arguments are a lot like
+subroutines\index{subroutines}. MetaPost macros are often used like subroutines,
+so the language includes programming concepts to support this.
+These concepts include local variables, loops, and conditional statements.
+
+\subsection{Grouping}
+\label{grsec}
+
+Grouping in MetaPost is essential for functions\index{functions} and
+local\index{variables!local}\index{locality} variables.
+The basic idea is that a group is
+a sequence of statements possibly followed by an expression with the provision
+that certain symbolic tokens\index{tokens!symbolic} can have their old meanings
+restored at the end of the group. If the group ends with an expression, the
+group behaves like a function call that returns that expression. Otherwise,
+the group is just a compound statement\index{compound statement}.
+The syntax for a group is\index{begingroup?\texttt{begingroup}}\index{endgroup?\texttt{endgroup}}
+$$ {\tt begingroup}\, \descr{statement list}\, {\tt endgroup} $$
+or
+$$ {\tt begingroup}\, \descr{statement list}\, \descr{expression}\, {\tt endgroup}
+$$
+where a \tdescr{statement list} is a sequence of statements each followed by a
+semicolon. A group with an \tdescr{expression} after the \tdescr{statement list}
+behaves like a \tdescr{primary} in Figure~\ref{syexpr} or like a
+\tdescr{numeric atom} in Figure~\ref{synprim}.
+
+Since the \tdescr{replacement text} for the {\tt beginfig}\index{beginfig?\texttt{beginfig}}
+macro starts with {\tt begingroup} and the \tdescr{replacement text} for
+{\tt endfig}\index{endfig?\texttt{endfig}} ends with {\tt endgroup},
+each figure in a MetaPost input file behaves like a
+group. This is what allows figures can have local variables.
+We have already seen in Section~\ref{vardecl} that
+variable names beginning with {\tt x} or {\tt y} are local in the sense that they
+have unknown values at the beginning of each figure and these values are forgotten
+at the end of each figure. The following example illustrates how locality works:
+\begin{eqnarray*}
+&& \hbox{\tt x23 = 3.1;}\\
+&& \hbox{\tt beginfig(17);}\\
+&& \qquad \vdots\\
+&& \hbox{\tt y3a=1; x23=2;}\\
+&& \qquad \vdots\\
+&& \hbox{\tt endfig;}\\
+&& \hbox{\tt show x23, y3a;}
+\end{eqnarray*}
+The result of the {\tt show}\index{show} command is
+$$\begin{verbatim}
+>> 3.1
+>> y3a
+\end{verbatim}
+$$
+indicating that {\tt x23} has returned to its former value of {\tt 3.1} and
+{\tt y3a} is completely unknown as it was at {\tt beginfig(17)}.
+
+The locality of {\tt x} and {\tt y} variables is achieved by the
+statement\index{save?\texttt{save}}\label{Dsave}
+$$ \hbox{\tt save x,y} $$
+in the \tdescr{replacement text} for {\tt beginfig}\index{beginfig?\texttt{beginfig}}.
+In general, variables are made local by the statement
+$$ {\tt save}\, \descr{symbolic token list} $$
+where \tdescr{symbolic token list} is a comma-separated list of
+tokens:\index{tokens!symbolic}
+\begin{ctabbing}
+$\tt \descr{symbolic token list} \rightarrow \descr{symbolic token}$\\
+ $\tt \qquad \;|\; \descr{symbolic token}\hbox{\tt ,}
+ \descr{symbolic token list}$
+\end{ctabbing}
+All variables whose names begin with one of the specified symbolic tokens become
+unknown numerics and their present values are saved for restoration at the end
+of the current group. If the {\tt save} statement is used outside of a group, the
+original values are simply discarded.
+
+The main purpose of the {\tt save} statement is to allow macros to use variables
+without interfering with existing variables or variables in other calls to the
+same macro. For example, the predefined macro {\tt whatever}\index{whatever}
+has the \tdescr{replacement text}
+$$ \hbox{\tt begingroup save ?; ? endgroup} $$
+This returns an unknown numeric quantity, but it is no longer called question
+mark since that name was local to the group. Asking the name via
+{\tt show\index{show?\texttt{show}} whatever} yields\index{CAPSULE?\texttt{CAPSULE}}
+$$ \hbox{\tt >> \%CAPSULE}{\it nnnn} $$
+where {\it nnnn} is an identification number that is chosen when {\tt save}
+makes the name question mark disappear.
+
+In spite of the versatility of {\tt save}, it cannot be used to make local changes
+to any of MetaPost's
+internal variables\index{internal variables}\index{variables!internal}.
+A statement such as\index{linecap?\texttt{linecap}}
+$$ \hbox{\tt save linecap} $$
+would cause MetaPost to temporarily forget the special meaning of this variable
+and just make it an unknown numeric. If you want to draw one dashed line with
+{\tt linecap:=butt} and then go back to the previous value, you can use the
+{\tt interim}\index{interim?\texttt{interim}}\label{Dinterm} statement as follows:
+\begin{eqnarray*}
+&& \hbox{\tt begingroup interim linecap:=butt;}\\
+&& {\tt draw}\, \descr{path expression}\, \hbox{\tt dashed evenly; endgroup}
+\end{eqnarray*}
+This saves the value of the
+internal variable\index{internal variables}\index{variables!internal}
+{\tt linecap} and temporarily
+gives it a new value without forgetting that {\tt linecap} is an internal
+variable. The general syntax is
+$$ {\tt interim}\, \descr{internal variable} \mathrel{\hbox{\tt:=}}
+ \descr{numeric expression}
+$$
+
+
+\subsection{Parameterized Macros}
+
+The basic idea behind parameterized macros is to achieve greater flexibility by
+allowing auxiliary information to be passed to a macro. We have already seen
+that macro definitions can have formal parameters that represent expressions
+to be given when the macro is called. For instance a definition such as
+$$ \hbox{\tt def rotatedaround(expr z, d) = } \descr{replacement text}\,
+ {\tt enddef}
+$$
+allows the MetaPost interpreter to understand macro calls of the form
+$$\tt rotatedaround\hbox{\tt (}
+ \descr{expression}\hbox{\tt ,} \descr{expression}\hbox{\tt )}
+$$
+
+The keyword {\tt expr}\index{expr?\texttt{expr}}\index{parameter!expr} in the macro
+definition means that the
+parameters can be expressions of any type. When the definition specifies
+{\tt (expr z, d)}, the formal parameters {\tt z} and {\tt d} behave like
+variables of the appropriate
+types. Within the \tdescr{replacement text}, they can be used in expressions
+just like variables, but they cannot be redeclared or assigned to. There is no
+restriction against unknown or partially known arguments. Thus the
+definition\index{midpoint?\texttt{midpoint}}
+$$ \hbox{\tt def midpoint(expr a, b) = (.5[a,b]) enddef} $$
+works perfectly well when {\tt a} and {\tt b} are unknown. An
+equation such as
+$$ \hbox{\tt midpoint(z1,z2) = (1,1)} $$
+could be used to help determine {\tt z1} and {\tt z2}.
+
+Notice that the above definition for {\tt midpoint} works for numerics, pairs,
+or colors as long as both parameters have the same type. If for some reason we
+want a {\tt middlepoint}\index{middlepoint?\texttt{middlepoint}} macro that works for
+a single path or picture, it would be
+necessary to do an {\tt if}\index{if?\texttt{if}} test on the argument type. This uses
+the fact there is a unary operator\index{path?\texttt{path}}
+$$ {\tt path}\, \descr{primary} $$
+that returns a boolean result indicating whether its argument is a path. Since
+the basic {\tt if} test has the syntax\index{else?\texttt{else}}\index{fi?\texttt{fi}}
+$$ {\tt if}\, \descr{boolean expression}\hbox{\tt:}\, \descr{balanced tokens}\,
+ \hbox{\tt else:}\, \descr{balanced tokens}\, {\tt fi}
+$$
+where the \tdescr{balanced tokens}\index{balanced tokens?\tdescr{balanced tokens}} can be anything
+that is balanced with respect to {\tt if} and {\tt fi}, the complete
+{\tt middlepoint}\index{midpoint?\texttt{midpoint}} macro with type test looks like this:
+$$\begin{verbatim}
+def middlepoint(expr a) = if path a: (point .5*length a of a)
+ else: .5(llcorner a + urcorner a) fi enddef;
+\end{verbatim}
+$$
+The complete syntax for {\tt if} tests is shown in Figure~\ref{syif}.
+It allows multiple {\tt if} tests like
+$$ \hbox{\tt if $e_1$: \ldots\ else: if $e_2$: \ldots\ else: \ldots\ fi fi} $$
+to be shortened to\index{elseif?\texttt{elseif}}
+$$ \hbox{\tt if $e_1$: \ldots\ elseif $e_2$: \ldots\ else: \ldots\ fi} $$
+where $e_1$ and $e_2$ represent boolean expressions.
+
+Note that {\tt if} tests are not statements and the \tdescr{balanced tokens} in
+the syntax rules can be any sequence of balanced tokens even if they do not form
+a complete expression or statement. Thus we could have saved two tokens at the
+expense of clarity by defining {\tt midpoint} like this:
+$$\begin{verbatim}
+def midpoint(expr a) = if path a: (point .5*length a of
+ else: .5(llcorner a + urcorner fi a) enddef;
+\end{verbatim}
+$$
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{if test} \rightarrow if \descr{boolean expression} \hbox{\tt :}
+ \descr{balanced tokens} \descr{alternatives} fi$\\
+$\tt \descr{alternatives} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; else\hbox{\tt :} \descr{balanced tokens}$\\
+$\tt \qquad \;|\; elseif \descr{boolean expression} \hbox{\tt :}
+ \descr{balanced tokens} \descr{alternatives}$
+\end{ctabbing}
+\caption{The syntax for {\tt if} tests.}
+\label{syif}
+\end{figure}
+
+The real purpose of macros and {\tt if} tests is to automate repetitive tasks and
+allow important subtasks to be solved separately. For example, Figure~\ref{fig42}
+uses macros \verb|draw_marked|, \verb|mark_angle|, and \verb|mark_rt_angle| to
+mark lines and angles that appear in the figure.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(42);
+pair a,b,c,d;
+b=(0,0); c=(1.5in,0); a=(0,.6in);
+d-c = (a-b) rotated 25;
+dotlabel.lft("a",a);
+dotlabel.lft("b",b);
+dotlabel.bot("c",c);
+dotlabel.llft("d",d);
+z0=.5[a,d];
+z1=.5[b,c];
+(z.p-z0) dotprod (d-a) = 0;
+(z.p-z1) dotprod (c-b) = 0;
+draw a--d;
+draw b--c;
+draw z0--z.p--z1;
+draw_marked(a--b, 1);
+draw_marked(c--d, 1);
+draw_marked(a--z.p, 2);
+draw_marked(d--z.p, 2);
+draw_marked(b--z.p, 3);
+draw_marked(c--z.p, 3);
+mark_angle(z.p, b, a, 1);
+mark_angle(z.p, c, d, 1);
+mark_angle(z.p, c, b, 2);
+mark_angle(c, b, z.p, 2);
+mark_rt_angle(z.p, z0, a);
+mark_rt_angle(z.p, z1, b);
+endfig;
+\end{verbatim}
+\quad \mathcenter{\epsfbox{manfig.42}}
+$$
+\caption{MetaPost code and the corresponding figure}
+\label{fig42}
+\end{figure}
+
+The task of the \verb|draw_marked|\index{draw_marked?\texttt{draw\_marked}} macro is to draw a path
+with a given number of cross marks near its midpoint. A convenient starting place
+is the subproblem of drawing a single cross mark perpendicular to a path {\tt p}
+at some time {\tt t}. The \verb|draw_mark|\index{draw_mark?\texttt{draw\_mark}} macro in
+Figure~\ref{drawmarked} does this by first finding a vector {\tt dm} perpendicular
+to~{\tt p} at~{\tt t}. To simplify positioning the cross mark,
+the \verb|draw_marked| macro is defined to take an arc length\index{arc length}
+{\tt a} along {\tt p} and use the {\tt arctime}\index{arctime} operator to
+compute~{\tt t}
+
+With the subproblem of drawing a single mark out of the way, the \verb|draw_marked|
+macro only needs to draw the path and call \verb|draw_mark| with the appropriate
+arc length values. The \verb|draw_marked| macro in Figure~\ref{drawmarked}
+uses {\tt n} equally-spaced {\tt a} values centered on
+{\tt .5*arclength~p}\index{arclength?\texttt{arclength}}.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+marksize=4pt;
+
+def draw_mark(expr p, a) =
+ begingroup
+ save t, dm; pair dm;
+ t = arctime a of p;
+ dm = marksize*unitvector direction t of p
+ rotated 90;
+ draw (-.5dm.. .5dm) shifted point t of p;
+ endgroup
+enddef;
+
+def draw_marked(expr p, n) =
+ begingroup
+ save amid;
+ amid = .5*arclength p;
+ for i=-(n-1)/2 upto (n-1)/2:
+ draw_mark(p, amid+.6marksize*i);
+ endfor
+ draw p;
+ endgroup
+enddef;
+\end{verbatim}
+$$
+\caption{Macros for drawing a path {\tt p} with {\tt n} cross marks.}
+\label{drawmarked}
+\end{figure}
+
+Since \verb|draw_marked| works for curved lines, it can be used to draw the arcs
+that the \verb|mark_angle|\index{mark_angle?\texttt{mark\_angle}} macro generates. Given points
+{\tt a}, {\tt b}, and {\tt c} that define a counter-clockwise angle at {\tt b},
+the \verb|mark_angle| needs to generate a small arc from segment {\tt ba} to
+segment {\tt bc}. The macro definition in Figure~\ref{markangle} does this by
+creating an arc {\tt p} of radius one and then computing a scale factor {\tt s}
+that makes it big enough to see clearly.
+
+The \verb|mark_rt_angle|\index{mark_rt_angle?\texttt{mark\_rt\_angle}} macro is much simpler.
+It takes a generic right-angle corner and uses the {\tt zscaled}\index{zscaled?\texttt{zscaled}}
+operator to rotate it and scale it as necessary.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+angle_radius=8pt;
+
+def mark_angle(expr a, b, c, n) =
+ begingroup
+ save s, p; path p;
+ p = unitvector(a-b){(a-b)rotated 90}..unitvector(c-b);
+ s = .9marksize/length(point 1 of p - point 0 of p);
+ if s<angle_radius: s:=angle_radius; fi
+ draw_marked(p scaled s shifted b, n);
+ endgroup
+enddef;
+
+def mark_rt_angle(expr a, b, c) =
+ draw ((1,0)--(1,1)--(0,1))
+ zscaled (angle_radius*unitvector(a-b)) shifted b
+enddef;
+\end{verbatim}
+$$
+\caption{Macros for marking angles.}
+\label{markangle}
+\end{figure}
+
+
+\subsection{Suffix and Text Parameters}
+
+Macro parameters need not always be expressions as in the previous examples.
+Replacing the keyword {\tt expr} with {\tt suffix}\index{suffix?\texttt{suffix}} or
+{\tt text}\index{text?\texttt{text}} in a macro definition declares the parameters to be
+variable names or arbitrary sequences of tokens. For example, there is a
+predefined macro called {\tt hide}\index{hide?\texttt{hide}} that takes a
+text parameter\index{parameter!text} and
+interprets it as a sequence of statements while ultimately producing an empty
+\tdescr{replacement text}. In other words, {\tt hide} executes its argument and
+then gets the next token as if nothing happened. Thus
+$$ \hbox{\tt show hide(numeric a,b; a+b=3; a-b=1) a;} $$
+prints ``\verb|>> 2|.''
+
+If the {\tt hide} macro were not predefined, it could be defined like this:
+$$\begin{verbatim}
+def ignore(expr a) = enddef;
+def hide(text t) = ignore(begingroup t; 0 endgroup) enddef;
+\end{verbatim}
+$$
+The statements represented by the text parameter {\tt t} would be evaluated as part
+of the group that forms the argument to {\tt ignore}. Since {\tt ignore} has an
+empty \tdescr{replacement text}, expansion of the {\tt hide} macro ultimately
+produces nothing.
+
+Another example of a predefined macro with a text parameter is
+{\tt dashpattern}\index{dashpattern?\texttt{dashpattern}}. The definition of {\tt dashpattern}
+starts
+$$\begin{verbatim}
+def dashpattern(text t) =
+ begingroup save on, off;
+\end{verbatim}
+$$
+then it defines {\tt on} and {\tt off} to be macros that create the desired
+picture when the text parameter~{\tt t} appears in the replacement text.
+
+Text parameters are very general, but their generality sometimes gets in the way.
+If you just want to pass a variable name to a macro, it is better to declare it
+as a suffix parameter\index{parameter!suffix}. For example,\index{incr?\texttt{incr}}
+$$ \hbox{\verb|def incr(suffix $) = begingroup $:=$+1; $ endgroup enddef;|} $$
+defines a macro that will take any numeric variable, add one to it, and return
+the new value. Since variable names can be more than one token long,
+$$ \hbox{\tt incr(a3b)} $$
+is perfectly acceptable if {\tt a3b} is a numeric variable.
+Suffix parameters are slightly more general than variable names because the
+definition in Figure~\ref{syvar} allows a \tdescr{suffix}\index{suffix?\tdescr{suffix}}
+to start with a \tdescr{subscript}\index{subscript?\tdescr{subscript}}.
+
+Figure~\ref{fig45} shows how suffix and expr parameters can be used together.
+The {\tt getmid}\index{getmid?\texttt{getmid}} macro takes a path variable and creates arrays
+of points and directions whose names are obtained by appending {\tt mid},
+{\tt off}, and {\tt dir} to the path variable. The {\tt joinup}\index{joinup?\texttt{joinup}}
+macro takes arrays of points and directions and creates a path of length {\tt n}
+that passes through each {\tt pt[i]} with direction {\tt d[i]} or
+$-\hbox{\tt d[i]}$.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+def getmid(suffix p) =
+ pair p.mid[], p.off[], p.dir[];
+ for i=0 upto 36:
+ p.dir[i] = dir(5*i);
+ p.mid[i]+p.off[i] = directionpoint p.dir[i] of p;
+ p.mid[i]-p.off[i] = directionpoint -p.dir[i] of p;
+ endfor
+enddef;
+
+def joinup(suffix pt, d)(expr n) =
+ begingroup
+ save res, g; path res;
+ res = pt[0]{d[0]};
+ for i=1 upto n:
+ g:= if (pt[i]-pt[i-1]) dotprod d[i] <0: - fi 1;
+ res := res{g*d[i-1]}...{g*d[i]}pt[i];
+ endfor
+ res
+ endgroup
+enddef;
+
+beginfig(45)
+path p, q;
+p = ((5,2)...(3,4)...(1,3)...(-2,-3)...(0,-5)...(3,-4)
+ ...(5,-3)...cycle) scaled .3cm shifted (0,5cm);
+getmid(p);
+draw p;
+draw joinup(p.mid, p.dir, 36)..cycle;
+q = joinup(p.off, p.dir, 36);
+draw q..(q rotated 180)..cycle;
+drawoptions(dashed evenly);
+for i=0 upto 3:
+ draw p.mid[9i]-p.off[9i]..p.mid[9i]+p.off[9i];
+ draw -p.off[9i]..p.off[9i];
+endfor
+endfig;
+\end{verbatim}
+\quad \mathcenter{\epsfbox{manfig.45}}
+$$
+\caption{MetaPost code and the corresponding figure}
+\label{fig45}
+\end{figure}
+
+A definition that starts
+$$ \hbox{\tt def joinup(suffix pt, d)(expr n) =} $$
+might suggest that calls to the {\tt joinup} macro should have two sets of
+parentheses as in
+$$ \hbox{\tt joinup(p.mid, p.dir)(36)} $$
+instead of
+$$ \hbox{\tt joinup(p.mid, p.dir, 36)} $$
+In fact, both forms are acceptable. Parameters in a macro call can be separated
+by commas or by {\tt )(} pairs. The only restriction is that a
+text parameter\index{parameter!text}
+must be followed by a right parenthesis. For instance, a macro {\tt foo} with one
+text parameter and one expr parameter can be called
+$$ \hbox{\tt foo(a,b)(c)} $$
+in which case the text parameter is ``{\tt a,b}'' and the expr parameter is
+{\tt c}, but
+$$ \hbox{\tt foo(a,b,c)} $$
+sets the text parameter to ``{\tt a,b,c}'' and leaves the MetaPost interpreter
+still looking for the expr parameter.
+
+
+\subsection{Vardef Macros}
+
+A macro definition can begin with {\tt vardef}\index{vardef?\texttt{vardef}} instead of
+{\tt def}. Macros defined in this way are called vardef macros. They are
+particularly well-suited to applications where macros are being used like functions
+or subroutines. The main idea is that a vardef macro is like a variable of type
+``macro.''
+
+Instead of {\tt def} \tdescr{symbolic token}, a vardef macro begins
+$$ {\tt vardef}\, \descr{generic variable} $$
+where a \tdescr{generic variable}\index{generic variable?\tdescr{generic variable}} is a variable
+name with numeric subscripts replaced by the
+generic subscript\index{subscript!generic} symbol {\tt []}\index{[]?\texttt{[]}}.
+In other words, the name following {\tt vardef} obeys exactly the same syntax as
+the name given in a variable declaration. It is a sequence of tags and generic
+subscript symbols starting with a tag, where a tag\index{tags} is a symbolic token
+that is not a macro or a primitive operator as explained in Section~\ref{vardecl}.
+
+The simplest case is when the name of a vardef macro consists of a single tag.
+Under such circumstances, {\tt def} and {\tt vardef} provide roughly the same
+functionality. The most obvious difference is that
+{\tt begingroup}\index{begingroup?\texttt{begingroup}} and {\tt endgroup}\index{endgroup?\texttt{endgroup}}
+are automatically inserted at the beginning and end of the
+\tdescr{replacement text} of every vardef macro. This makes the
+\tdescr{replacement text} a group so that a vardef
+macro behaves like a subroutine or a function call.
+
+Another property of vardef macros is that they allow multi-token macro
+names and macro names involving generic subscripts.
+When a vardef macro name has generic subscripts, numeric values have to be given
+when the macro is called. After a macro definition
+$$ \hbox{\tt vardef a[]b(expr p) =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+{\tt a2b((1,2))} and {\tt a3b((1,2)..(3,4))} are macro calls. But how can the
+\tdescr{replacement text} tell the difference between {\tt a2b} and {\tt a3b}?
+Two implicit suffix parameters\index{parameter!suffix} are automatically
+provided for this purpose.
+Every vardef macro has suffix parameters \verb|#@|\index{#@?\texttt{\#@}}
+and \verb|@|\index{@?\texttt{@}}, where \verb|@| is the last token in the name from the
+macro call and \verb|#@| is everything preceding the last token. Thus \verb|#@|
+is {\tt a2} when the name is given as {\tt a2b} and {\tt a3} when the name is
+given as {\tt a3b}.
+
+Suppose, for example, that the {\tt a[]b} macro is to take its argument and
+shift it by an amount that depends on the macro name. The macro could be defined
+like this:
+$$ \hbox{\verb|vardef a[]b(expr p) = p shifted (#@,b) enddef;|} $$
+Then {\tt a2b((1,2))} means {\tt (1,2) shifted (a2,b)}
+and {\tt a3b((1,2)..(3,4))} means
+$$ \hbox{\tt ((1,2)..(3,4)) shifted (a3,b)}. $$
+
+If the macro had been {\tt a.b[]}, \verb|#@| would always be {\tt a.b} and the
+\verb|@| parameter would give the numeric subscript. Then {\tt a@} would refer to
+an element of the array {\tt a[]}. Note that \verb|@| is a suffix parameter, not
+an expr parameter, so an expression like {\tt @+1} would be illegal. The only way
+to get at the numeric values of subscripts in a
+suffix parameter\index{parameter!suffix} is by extracting
+them from the string returned by the {\tt str}\index{str?\texttt{str}}\label{Dstr}
+operator. This operator takes a suffix and returns a string
+representation of a suffix. Thus {\tt str @} would be \verb|"3"| in {\tt a.b3}
+and \verb|"3.14"| in {\tt a.b3.14} or {\tt a.b[3.14]}. Since the syntax for a
+\tdescr{suffix}\index{suffix?\tdescr{suffix}} in Figure~\ref{syvar} requires negative
+subscripts to be in brackets, {\tt str @} returns {\tt "[-3]"} in {\tt a.b[-3]}.
+
+The {\tt str} operator is generally for emergency use only. It is better to
+use suffix parameters only as variable names or suffixes. The best example of a
+vardef macro involving suffixes is the {\tt z} macro that defines the
+{\tt z} convention\index{z convention?{\tt z} convention}. The definition involves a special
+token \verb|@#|\index{@#?\texttt{@\#}} that refers to the suffix following the macro name:
+$$ \hbox{\verb|vardef z@#=(x@#,y@#) enddef;|} $$
+This means that any variable name whose first token is {\tt z} is equivalent to
+a pair of variables whose names are obtained by replacing {\tt z} with {\tt x}
+and~{\tt y}. For instance, {\tt z.a1} calls the {\tt z} macro with the suffix
+parameter \verb|@#| set to {\tt a1}.
+
+In general,
+$$ {\tt vardef}\, \descr{generic variable} \hbox{\verb|@#|} $$
+is an alternative to {\tt vardef} \tdescr{generic variable} that causes the
+MetaPost interpreter
+to look for a suffix following the name given in the macro call and makes this
+available as the \verb|@#| suffix parameter.
+
+To summarize the special features of vardef macros, they allow a broad class of
+macro names as well as macro names followed by a special suffix parameter.
+Furthermore, {\tt begingroup} and {\tt endgroup} are automatically added to the
+\tdescr{replacement text} of a vardef macro. Thus using {\tt vardef}
+instead of {\tt def} to define the {\tt joinup}\index{joinup?\texttt{joinup}} macro in
+Figure~\ref{fig45} would have avoided the need to include {\tt begingroup} and
+{\tt endgroup} explicitly in the macro definition.
+
+In fact, most of the macro definitions given in previous examples could equally
+well use {\tt vardef} instead of {\tt def}. It usually does not matter very much
+which you use, but a good general rule is to use {\tt vardef} if you intend the
+macro to be used like a function or a subroutine. The following comparison
+should help in deciding when to use {\tt vardef}.
+
+\begin{itemize}
+\item Vardef macros are automatically surrounded by {\tt begingroup}
+and {\tt endgroup}.
+\item The name of a vardef macro can be more than one token long and it can
+contain subscripts.
+\item A vardef macro can have access to the suffix that follows the macro name
+when the macro is called.
+\item When a symbolic token is used in the name of a vardef macro it remains
+a tag\index{tags} and can still be used in other variable names. Thus {\tt p5dir}
+is a legal variable name even though {\tt dir} is a vardef macro, but an ordinary
+macro such as {\tt ...}\index{...?\texttt{...}} cannot be used in a variable name.
+(This is fortunate since {\tt z5...z6} is supposed to be a path expression, not
+an elaborate variable name).
+\end{itemize}
+
+
+\subsection{Defining Unary and Binary Macros}
+
+It has been mentioned several times that some of the operators and commands
+discussed so far are actually predefined macros. These include unary operators
+such as {\tt round}\index{round?\texttt{round}} and {\tt unitvector}\index{unitvector?\texttt{unitvector}},
+statements such as {\tt fill}\index{fill?\texttt{fill}} and {\tt draw}\index{draw?\texttt{draw}},
+and binary operators such as {\tt dotprod}\index{dotprod?\texttt{dotprod}} and
+{\tt intersectionpoint}\index{intersectionpoint?\texttt{intersectionpoint}}. The main difference
+between these macros and the ones we already know how to define is their argument
+syntax.
+
+The {\tt round} and {\tt unitvector} macros are examples of what
+Figure~\ref{syexpr} calls \tdescr{unary op}. That is, they are followed by a
+primary expression. To specify a macro argument of this type, the macro definition
+should look like this:
+$$ \hbox{\tt vardef round primary u =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+The {\tt u} parameter is an expr parameter\index{parameter!expr} and it can be
+used exactly like the expr parameter defined using the ordinary
+$$ \hbox{\tt (expr u)} $$
+syntax.
+
+As the {\tt round} example suggests, a macro can be defined to take a
+\tdescr{secondary}\index{secondary?\tdescr{secondary}},
+\tdescr{tertiary}\index{tertiary?\tdescr{tertiary}}, or an
+\tdescr{expression}\index{expression?\tdescr{expression}} parameter. For example, the
+predefined definition of the {\tt fill} macro is roughly\index{fill?\texttt{fill}}
+$$ \hbox{\tt def fill expr c = addto currentpicture contour c enddef;} $$
+
+It is even possible to define a macro to play the role of
+\tdescr{of operator}\index{of operator?\tdescr{of operator}} in Figure~\ref{syexpr}.
+For example, the {\tt direction of}\index{direction of?\texttt{direction of}} macro has a definition
+of this form:
+$$ \hbox{\tt vardef direction expr t of p =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+
+Macros can also be defined to behave like binary operators. For instance, the
+definition of the {\tt dotprod} macro has the
+form\index{dotprod?\texttt{dotprod}}\index{primarydef?\texttt{primarydef}}
+$$ \hbox{\tt primarydef w dotprod z =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+This makes {\tt dotprod} a \tdescr{primary binop}\index{primary binop?\tdescr{primary binop}}.
+Similarly, {\tt secondarydef}\index{secondarydef?\texttt{secondarydef}} and
+{\tt tertiarydef}\index{tertiarydef?\texttt{tertiarydef}} introduce
+\tdescr{secondary binop}\index{secondary binop?\tdescr{secondary binop}} and
+\tdescr{tertiary binop}\index{tertiary binop?\tdescr{tertiary binop}} definitions. These all
+define ordinary macros, not vardef macros; e.g., there is
+no ``{\tt primaryvardef}.''
+
+Thus macro definitions can be introduced by {\tt def}, {\tt vardef},
+{\tt primarydef}, {\tt secondarydef}, or {\tt tertiarydef}.
+A \tdescr{replacement text}\index{replacement text?\tdescr{replacement text}} is any list of tokens
+that is balanced with respect to {\tt def}-{\tt enddef} pairs where all five macro
+definition tokens are treated like {\tt def} for the purpose of
+{\tt def}-{\tt enddef} matching.
+
+The rest of the syntax for macro definitions is summarized in Figure~\ref{symacro}.
+The syntax contains a few surprises. The macro parameters can have a
+\tdescr{delimited part} and an \tdescr{undelimited part}. Normally, one of
+these is \tdescr{empty}, but it is possible to have both parts nonempty:
+$$ \hbox{\tt def foo(text a) expr b =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+This defines a macro {\tt foo} to take a text parameter in parentheses followed
+by an expression.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{macro definition} \rightarrow
+ \descr{macro heading} \hbox{\tt =} \descr{replacement text}\, enddef$\\
+$\tt \descr{macro heading} \rightarrow def\, \descr{symbolic token}
+ \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef\, \descr{generic variable} \descr{delimited part}
+ \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef\, \descr{generic variable} \hbox{\tt @\#}
+ \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; \descr{binary def} \descr{parameter}
+ \descr{symbolic token} \descr{parameter}$\\
+$\tt \descr{delimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{delimited part}
+ \hbox{\tt (}\descr{parameter type} \descr{parameter tokens}\hbox{\tt )}$\\
+$\tt \descr{parameter type} \rightarrow expr \;|\; suffix \;|\; text$\\
+$\tt \descr{parameter tokens} \rightarrow \descr{parameter} \;|\;
+ \descr{parameter tokens}\hbox{\tt ,} \descr{parameter}$\\
+$\tt \descr{parameter} \rightarrow \descr{symbolic token}$\\
+$\tt \descr{undelimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{parameter type} \descr{parameter}$\\
+$\tt \qquad \;|\; \descr{precedence level} \descr{parameter}$\\
+$\tt \qquad \;|\; expr\, \descr{parameter}\, of\, \descr{parameter}$\\
+$\tt \descr{precedence level} \rightarrow primary \;|\; secondary \;|\;
+ tertiary$\\
+$\tt \descr{binary def} \rightarrow primarydef \;|\; secondarydef \;|\;
+ tertiatydef$
+\end{ctabbing}
+\caption{The syntax for macro definitions}
+\label{symacro}
+\end{figure}
+
+The syntax also allows the \tdescr{undelimited part} to specify an argument type
+of {\tt suffix}\index{suffix?\texttt{suffix}} or {\tt text}\index{text?\texttt{text}}. An example of
+a macro with an undelimited suffix parameter\index{parameter!suffix}
+is the predefined macro {\tt incr}\index{incr?\texttt{incr}}\label{Dincr} that is actually
+defined like this:
+$$ \hbox{\verb|vardef incr suffix $ = $:=$+1; $ enddef;|} $$
+This makes {\tt incr} a function that takes a variable, increments it, and
+returns the new value. Undelimited suffix parameters may be parenthesized,
+so {\tt incr a} and {\tt incr(a)} are both legal if {\tt a} is a numeric
+variable. There is also a similar predefined macro {\tt decr}\index{decr?\texttt{decr}}
+that subtracts~1.
+
+Undelimited text parameters\index{parameter!text} run to the end of a statement.
+More precisely, an undelimited text parameter is the list of tokens following the
+macro call up to the first ``{\tt ;}\index{semicolon}'' or
+``{\tt endgroup}\index{endgroup?\texttt{endgroup}}'' or ``{\tt end}\index{end?\texttt{end}}''
+except that an argument containing ``{\tt begingroup}'' will always
+include the matching ``{\tt endgroup}.''
+An example of an undelimited text parameter comes from the predefined macro
+{\tt cutdraw}\index{cutdraw?\texttt{cutdraw}}\label{Dctdraw} whose definition is
+roughly\index{linecap?\texttt{linecap}}\index{butt?\texttt{butt}}\index{interim?\texttt{interim}}
+$$\begin{verbatim}
+def cutdraw text t =
+ begingroup interim linecap:=butt; draw t; endgroup enddef;
+\end{verbatim}
+$$
+This makes {\tt cutdraw} synonymous with {\tt draw} except for the {\tt linecap}
+value. (This macro is provided mainly for compatibility with \MF\index{metafont?\MF}.)
+
+
+\section{Loops}
+
+Numerous examples in previous sections have used simple {\tt for} loops of the
+form\index{loops}\index{for?\texttt{for}}\index{endfor?\texttt{endfor}}
+$$ {\tt for}\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{expression}\, {\tt upto}\, \descr{expression}:\
+ \descr{loop text}\, {\tt endfor}
+$$
+It is equally simple to construct a loop that counts downward: just replace
+{\tt upto} by {\tt downto}\index{downto?\texttt{downto}}\label{Ddwnto}
+make the second \tdescr{expression} smaller than the first.
+This section covers more complicated types of progressions, loops where the loop
+counter behaves like a suffix parameter, and ways of exiting from a loop.
+
+The first generalization is suggested by the fact that {\tt upto}\index{upto?\texttt{upto}}
+is a predefined macro for\index{step?\texttt{step}}\index{until?\texttt{until}}
+$$ \hbox{\tt step 1 until} $$
+and {\tt downto}\index{downto?\texttt{downto}} is a macro for {\tt step -1 until}.
+A loop begining
+$$ \hbox{\tt for i=a step b until c} $$
+scans a sequence of {\tt i} values {\tt a}, ${\tt a}+{\tt b}$, ${\tt a}+2{\tt b}$,
+\ldots, stopping before {\tt i} passes {\tt c}; i.e., the loop scans {\tt i} values
+where ${\tt i}\le {\tt c}$ if ${\tt b}>0$ and ${\tt i}\ge {\tt c}$ if ${\tt i}<0$.
+
+It is best to use this feature only when the step size is an integer or some
+number that can be represented exactly in fixed point arithmetic\index{arithmetic}
+as a multiple of $1\over65536$. Otherwise, error will accumulate and the loop
+index might not reach the expected termination value. For instance,
+$$ \hbox{\tt for i=0 step .1 until 1: show i; endfor} $$
+shows ten {\tt i} values the last of which is 0.90005.
+
+The standard way of avoid the problems associated with non-integer step sizes is
+to iterate over integer values and then multiply by a scale factor when using
+the loop index as was done in Figures \ref{fig1} and~\ref{fig40}.
+
+Alternatively, the values to iterate over can be given explicitly. Any sequence
+of zero or more expressions separated by commas can be used in place of
+{\tt a step b upto c}. In fact, the expressions need not all be the same type
+and they need not have known values. Thus
+$$ \hbox{\tt for t=3.14, 2.78, (a,2a), "hello": show a; endfor} $$
+shows the four values listed.
+
+Note that the loop body in the above example is a statement followed by a
+semicolon. It is common for the body of a loop to be one or more statements,
+but this need not be the case. A loop is like a macro definition followed by
+calls to the macro. The loop body can be virtually any sequence of tokens as
+long as they make sense together. Thus, the (ridiculous) statement
+$$ \hbox{\tt draw for p=(3,1),(6,2),(7,5),(4,6),(1,3): p-- endfor cycle;} $$
+is equivalent to
+$$ \hbox{\tt draw (3,1)--(6,2)--(7,5)--(4,6)--(1,3)--cycle;} $$
+(See Figure~\ref{fig17} for a more realistic example of this.)
+
+If a loop is like a macro definition, the loop index is like an
+expr parameter\index{parameter!expr}. It can represent any value, but it is
+not a variable and it cannot be changed by an assignment
+statement\index{assignment}. In order to do that, you need a
+{\tt forsuffixes}\index{forsuffixes?\texttt{forsuffixes}} loop. A {\tt forsuffixes} loop is
+a lot like a {\tt for} loop, except the loop index behaves like a
+suffix parameter\index{parameter!suffix}. The syntax is
+$$ {\tt forsuffixes}\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{suffix list}:\ \descr{loop text}\, {\tt endfor}
+$$
+where a \tdescr{suffix list} is a comma-separated list of suffixes.
+If some of the suffixes are \tdescr{empty}, the \tdescr{loop text} gets executed
+with the loop index parameter set to the empty suffix.
+
+A good example of a {\tt forsuffixes} loop is the definition of the
+{\tt dotlabels}\index{dotlabels?\texttt{dotlabels}} macro\index{str?\texttt{str}}:
+$$\begin{verbatim}
+vardef dotlabels@#(text t) =
+ forsuffixes $=t: dotlabel@#(str$,z$); endfor enddef;
+\end{verbatim}
+$$
+This should make it clear why the parameter to {\tt dotlabels} has to be a
+comma-separated list of suffixes. Most macros that accept variable-length
+comma-separated lists
+use them in {\tt for} or {\tt forsuffixes} loops in this fashion as values to
+iterate over.
+
+When there are no values to iterate over, you can use a
+{\tt forever}\index{forever?\texttt{forever}} loop:
+$$ {\tt forever}\hbox{\tt :}\, \descr{loop text}\, {\tt endfor} $$
+To terminate such a loop when a boolean condition becomes true, use an exit
+clause\index{exitif?\texttt{exitif}}:
+$$ {\tt exitif}\, \descr{boolean expression} \hbox{\tt ;} $$
+When the MetaPost interpreter encounters an exit clause, it evaluates the
+\tdescr{boolean expression} and exits the current loop if the expression is
+true. If it is more convenient to exit the loop when an expression becomes false,
+use the predefined macro {\tt exitunless}\index{exitunless?\texttt{exitunless}}.
+
+Thus MetaPost's version of a {\bf while} loop is
+$$ \hbox{\tt forever: exitunless}\, \descr{boolean expression} \hbox{\tt ;}\,
+ \descr{loop text}\, {\tt endfor}
+$$
+The exit clause could equally well come just before {\tt endfor} or anywhere
+in the \tdescr{loop text}. In fact any {\tt for}, {\tt forever}, or
+{\tt forsuffixes} loop can contain any number of exit clauses.
+
+The summary of loop syntax shown in Figure~\ref{syloop} does not mention
+exit clauses explicitly because a \tdescr{loop text} can be virtually any
+sequence of tokens. The only restriction is that a \tdescr{loop text} must
+be balanced with respect to {\tt for} and {\tt endfor}. Of course this balancing
+process treats {\tt forsuffixes} and {\tt forever} just like {\tt for}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{loop} \rightarrow \descr{loop header}\hbox{\tt :}\,
+ \descr{loop text} endfor$\\
+$\tt \descr{loop header} \rightarrow for\, \descr{symbolic token}\,
+ \hbox{\tt =}\, \descr{progression}$\\
+$\tt \qquad \;|\; for\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{for list}$\\
+$\tt \qquad \;|\; forsuffixes\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{suffix list}$\\
+$\tt \qquad \;|\; forever$\\
+$\tt \descr{progression} \rightarrow \descr{numeric expression}\, upto\,
+ \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{numeric expression}\, downto\,
+ \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{numeric expression}\, step\,
+ \descr{numeric expression}\, until\, \descr{numeric expression} $\\
+$\tt \descr{for list} \rightarrow \descr{expression}
+ \;|\; \descr{for list}\hbox{\tt ,}\, \descr{expression}$\\
+$\tt \descr{suffix list} \rightarrow \descr{suffix}
+ \;|\; \descr{suffix list}\hbox{\tt ,}\, \descr{suffix}$
+\end{ctabbing}
+\caption{The syntax for loops}
+\label{syloop}
+\end{figure}
+
+
+\section{Making Boxes}
+\label{boxessec}
+
+This section describes auxiliary macros not included in Plain MetaPost that
+make it convenient to do things that {\it pic} is good at \cite{ke:pic}. What
+follows is a description of how to use the macros contained in the
+file {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}}. This file is included in a special
+directory reserved for MetaPost macros and support software\footnote{The name
+of this directory is likely to be something like \verb|/usr/lib/mp/lib|, but
+this is system dependent.}
+and can be accessed by giving the MetaPost command {\tt input boxes} before any
+figures that use the box making macros.
+The syntax for the {\tt input} command is \index{input?\texttt{input}}
+$$ {\tt input}\, \descr{file name} $$
+where a final ``{\tt .mp}'' can be omitted from the file name. The {\tt input}
+command looks first in the current directory and then in the special macro
+directory. Users interested in writing macros may want to look at the
+{\tt boxes.mp} file in this directory.
+
+\subsection{Rectangular Boxes}
+
+The main idea of the box-making macros is that one should
+say\index{boxit?\texttt{boxit}}\label{Dboxit}
+$$ {\tt boxit.} \descr{suffix}
+ \hbox{\tt(} \descr{picture expression} \hbox{\tt)}
+$$
+where the \tdescr{suffix} does not start with a subscript.\footnote{Some early
+versions of the box making macros did not allow any subscripts in the
+{\tt boxit} suffix.}
+This creates pair variables \tdescr{suffix}{\tt.c},
+\tdescr{suffix}{\tt.n}, \tdescr{suffix}{\tt.e}, \ldots\ that can then be
+used for positioning the picture before drawing it with a separate command such
+as\index{drawboxed?\texttt{drawboxed}}\label{Ddrbxed}
+$$ \hbox{\tt drawboxed(} \descr{suffix list} \hbox{\tt )} $$
+The argument to {\tt drawboxed} should be a comma-separated list of box names,
+where a box name\index{box name} is a \tdescr{suffix} with which {\tt boxit}
+has been called.
+
+For the command {\tt boxit.bb(pic)}, the box name is {\tt bb} and the contents
+of the box is the picture {\tt pic}. In this case, {\tt bb.c} the position
+where the center of picture {\tt pic} is to be placed, and {\tt bb.sw},
+{\tt bb.se}, {\tt bb.ne}, and {\tt bb.nw} are the corners of a rectangular path
+that will surround the resulting picture. Variables {\tt bb.dx} and {\tt bb.dy}
+give the spacing between the shifted version of {\tt pic} and the surrounding
+rectangle, and {\tt bb.off} is the amount by which {\tt pic} has to be shifted
+to achieve all this.
+
+When the {\tt boxit} macro is called with box name~$b$, it gives linear equations
+that force $b${\tt.sw}, $b${\tt.se}, $b${\tt.ne}, and $b${\tt.nw} to be the
+corners of a rectangle
+aligned on the $x$ and $y$ axes with the box contents centered inside as
+indicated by the gray rectangle in Figure~\ref{fig48}. The values of $b${\tt.dx},
+$b${\tt.dy}, and $b${\tt.c} are left unspecified so that the user can give
+equations for positioning the boxes. If no such equations are given, macros
+such as {\tt drawboxed} can detect this and give default values.
+The default values for {\tt dx} and {\tt dy} variables are controlled by the
+internal variables\index{internal variables}\index{variables!internal}
+{\tt defaultdx}\index{defaultdx?\texttt{defaultdx}}\label{Ddefaultdx} and
+{\tt defaultdy}\index{defaultdy?\texttt{defaultdy}}\label{Ddefaultdy}.
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.48} $$
+\caption[How a {\tt boxit} picture relates to the associated variables]
+ {The relationship between the picture given to {\tt boxit} and the
+ associated variables. The picture is indicated by a gray rectangle.}
+\label{fig48}
+\end{figure}
+
+If $b$ represents a box name, {\tt drawboxed($b$)} draws the rectangular boundary
+of box~$b$ and then the contents of the box. This bounding rectangle can be
+accessed separately as {\tt bpath~b}, or in general\index{bpath?\texttt{bpath}}\label{Dbpath}
+$$ {\tt bpath}\, \descr{box name} $$
+It is useful in combination with operators like
+{\tt cutbefore}\index{cutbefore?\texttt{cutbefore}} and {\tt cutafter}\index{cutafter?\texttt{cutafter}}
+in order to control paths that enter the box.
+For example, if $a$ and $b$ are box names and $p$ is a path from $a${\tt.c}
+to $b${\tt.c},\index{drawarrow?\texttt{drawarrow}}
+$$ \hbox{\tt drawarrow $p$ cutbefore bpath $a$ cutafter bpath $b$} $$
+draws an arrow from the edge of box $a$ to the edge of box $b$.
+
+Figure~\ref{fig49} shows a practical example including some arrows drawn with
+{\tt cutafter bpath} \tdescr{box name}. It is
+instructive to compare Figure~\ref{fig49} to the similar figure in the pic
+manual \cite{ke:pic}. The figure uses a macro\index{boxjoin?\texttt{boxjoin}}\label{Dbxjoin}
+$$ \hbox{\tt boxjoin(} \descr{equation text} \hbox{\tt )} $$
+to control the relationship between consecutive boxes. Within the
+\tdescr{equation text}, {\tt a} and {\tt b} represent the box names given in
+consecutive calls to {\tt boxit} and the \tdescr{equation text} gives equations
+to control the relative sizes and positions of the boxes.
+
+\begin{figure}[htp]
+$$\hbox{$\begin{verbatim}
+input boxes
+beginfig(49);
+boxjoin(a.se=b.sw; a.ne=b.nw);
+boxit.a(btex\strut$\cdots$ etex); boxit.ni(btex\strut$n_i$ etex);
+boxit.di(btex\strut$d_i$ etex); boxit.ni1(btex\strut$n_{i+1}$ etex);
+boxit.di1(btex\strut$d_{i+1}$ etex); boxit.aa(btex\strut$\cdots$ etex);
+boxit.nk(btex\strut$n_k$ etex); boxit.dk(btex\strut$d_k$ etex);
+drawboxed(di,a,ni,ni1,di1,aa,nk,dk); label.lft("ndtable:", a.w);
+interim defaultdy:=7bp;
+boxjoin(a.sw=b.nw; a.se=b.ne);
+boxit.ba(); boxit.bb(); boxit.bc();
+boxit.bd(btex $\vdots$ etex); boxit.be(); boxit.bf();
+bd.dx=8bp; ba.ne=a.sw-(15bp,10bp);
+drawboxed(ba,bb,bc,bd,be,bf); label.lft("hashtab:",ba.w);
+vardef ndblock suffix $ =
+ boxjoin(a.sw=b.nw; a.se=b.ne);
+ forsuffixes $$=$1,$2,$3: boxit$$(); ($$dx,$$dy)=(5.5bp,4bp);
+ endfor; enddef;
+ndblock nda; ndblock ndb; ndblock ndc;
+nda1.c-bb.c = ndb1.c-nda3.c = (whatever,0);
+xpart ndb3.se = xpart ndc1.ne = xpart di.c;
+ndc1.c - be.c = (whatever,0);
+drawboxed(nda1,nda2,nda3, ndb1,ndb2,ndb3, ndc1,ndc2,ndc3);
+drawarrow bb.c -- nda1.w;
+drawarrow be.c -- ndc1.w;
+drawarrow nda3.c -- ndb1.w;
+drawarrow nda1.c{right}..{curl0}ni.c cutafter bpath ni;
+drawarrow nda2.c{right}..{curl0}di.c cutafter bpath di;
+drawarrow ndc1.c{right}..{curl0}ni1.c cutafter bpath ni1;
+drawarrow ndc2.c{right}..{curl0}di1.c cutafter bpath di1;
+drawarrow ndb1.c{right}..nk.c cutafter bpath nk;
+drawarrow ndb2.c{right}..dk.c cutafter bpath dk;
+x.ptr=xpart aa.c; y.ptr=ypart ndc1.ne;
+drawarrow subpath (0,.7) of (z.ptr..{left}ndc3.c) dashed evenly;
+label.rt(btex \strut ndblock etex, z.ptr); endfig;
+\end{verbatim}
+$}
+\atop \vcenter{\vskip8pt\hbox{\epsfbox{manfig.49}}}
+$$
+\caption{MetaPost code and the corresponding figure}
+\label{fig49}
+\end{figure}
+
+For example, the second line of input for the above figure contains
+$$ \hbox{\tt boxjoin(a.se=b.sw; a.ne=b.nw)} $$
+This causes boxes to line up horizontally by giving additional equations that
+are invoked each time some box {\tt a} is followed by some other box~{\tt b}.
+These equations are first invoked on the next line when box~{\tt a} is followed
+by box~{\tt ni}. This yields
+$$ \hbox{\tt a.se=ni.sw; a.ne=ni.nw} $$
+The next pair of boxes is box~{\tt ni} and box~{\tt di}. This time the
+implicitly generated equations are
+$$ \hbox{\tt ni.se=di.sw; ni.ne=di.nw} $$
+This process continues until a new {\tt boxjoin}\index{boxjoin?\texttt{boxjoin}} is given.
+In this case the new declaration is
+$$ \hbox{\tt boxjoin(a.sw=b.nw; a.se=b.ne)} $$
+which causes boxes to be stacked below each other.
+
+After calling {\tt boxit} for the first eight boxes {\tt a} through {\tt dk},
+the box heights are constrained to match but the widths are still unknown.
+Thus the {\tt drawboxed}\index{drawboxed?\texttt{drawboxed}} macro needs to assign default
+values to the \tdescr{box name}{\tt.dx} and \tdescr{box name}{\tt.dy}
+variables. First, {\tt di.dx} and {\tt di.dy} get default values so that all
+the boxes are forced to be large enough to contain the contents of box~{\tt di}.
+
+The macro that actually assigns default values to {\tt dx} and {\tt dy} variables
+is called {\tt fixsize}\index{fixsize?\texttt{fixsize}}\label{Dfixsiz}.
+It takes a list of box names and
+considers them one at a time, making sure that each box has a fixed size and
+shape. A macro called {\tt fixpos}\index{fixpos?\texttt{fixpos}}\label{Dfixpos} then takes
+this same list
+of box names and assigns default values to the \tdescr{box name}{\tt.off}
+variables as needed to fix the position of each box. By using {\tt fixsize}
+to fix the dimensions of each box before assigning default positions to any
+of them, the number of needing default positions can usually be cut to at most
+one.
+
+Since the bounding path for a box cannot be computed until the size, shape, and
+position of the box is determined, the {\tt bpath}\index{bpath?\texttt{bpath}} macro applies
+{\tt fixsize} and {\tt fixpos} to its argument. Other macros that do this
+include\index{pic?\texttt{pic}}\label{Dpic}
+$$ {\tt pic}\, \descr{box name} $$
+where the \tdescr{box name} is a suffix, possibly in parentheses. This returns
+the contents of the named box as a picture positioned so that
+$$ {\tt draw\ pic} \descr{box name} $$
+draws the box contents without the bounding rectangle. This operation can also
+be accomplished by the {\tt drawunboxed}\index{drawunboxed?\texttt{drawunboxed}}\label{Ddrunbx}
+macro that takes a comma-separated list of box names. There is also a
+{\tt drawboxes}\index{drawboxes?\texttt{drawboxes}}\label{Ddrbxes} macro that draws just the
+bounding rectangles.
+
+Another way to draw empty rectangles is by just saying\label{Deboxit}
+$$ {\tt boxit} \descr{box name} \hbox{\tt ()} $$
+with no picture argument as is done several times in Figure~\ref{fig49}.
+This is like calling {\tt boxit} with an empty picture.
+Alternatively the argument can be a string\label{Dsboxit} expression
+instead of a picture
+expression in which case the string is typeset in the default font.
+
+
+\subsection{Circular and Oval Boxes}
+
+Circular and oval boxes are a lot like rectangular boxes except for the shape
+of the bounding path. Such boxes are set up by the
+{\tt circleit}\index{circleit?\texttt{circleit}}\label{Dcircit} macro:
+$$ {\tt circleit} \descr{box name}
+ \hbox{\tt(} \descr{box contents} \hbox{\tt)}
+$$
+where \tdescr{box name} is a suffix and \tdescr{box contents} is either a
+picture expression, a string expression, or \tdescr{empty}.
+
+The {\tt circleit} macro defines pair variable just as {\tt boxit} does, except
+that there are no corner points \tdescr{box name}{\tt.ne},
+\tdescr{box name}{\tt.sw}, etc. A call to
+$$ \hbox{\tt circleit.a(}\ldots \hbox{\tt )} $$
+gives relationships among points {\tt a.c}, {\tt a.s},
+{\tt a.e}, {\tt a.n}, {\tt a.w}
+and distances {\tt a.dx} and {\tt a.dy}. Together with {\tt a.c} and {\tt a.off},
+these variables describe how the picture is centered in an oval as can be seen
+from the Figure~\ref{fig50}.
+
+\begin{figure}[htp]
+$$ \epsfbox{manfig.50} $$
+\caption[How a {\tt circleit} picture relates to the associated variables]
+ {The relationship between the picture given to {\tt circleit} and the
+ associated variables. The picture is indicated by a gray rectangle.}
+\label{fig50}
+\end{figure}
+
+The {\tt drawboxed}\index{drawboxed?\texttt{drawboxed}}, {\tt drawunboxed}\index{drawunboxed?\texttt{drawunboxed}},
+{\tt drawboxes}\index{drawboxes?\texttt{drawboxes}}, {\tt pic}\index{pic?\texttt{pic}}, and
+{\tt bpath}\index{bpath?\texttt{bpath}} macros work for {\tt circleit} boxes just as they do
+for {\tt boxit} boxes. By default, the boundary path for a {\tt circleit} box is
+a circle large enough to surround the box contents with a small safety margin
+controlled by the
+internal variable\index{internal variables}\index{variables!internal}
+{\tt circmargin}\label{Dcmargin}. Figure~\ref{fig51} gives
+a basic example of the use of {\tt bpath} with {\tt circleit} boxes.
+
+\begin{figure}[htbp]
+$$\begin{verbatim}
+vardef drawshadowed(text t) =
+ fixsize(t);
+ forsuffixes s=t:
+ fill bpath.s shifted (1pt,-1pt);
+ unfill bpath.s;
+ drawboxed(s);
+ endfor
+enddef;
+
+beginfig(51)
+circleit.a(btex Box 1 etex);
+circleit.b(btex Box 2 etex);
+b.n = a.s - (0,20pt);
+drawshadowed(a,b);
+drawarrow a.s -- b.n;
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\epsfbox{manfig.51}} $$
+\caption[MetaPost code and the resulting figure.]
+ {MetaPost code and the resulting figure. Note that the {\tt drawshadowed}
+ macro used here is not part of the {\tt boxit.mp} macro package.}
+\label{fig51}
+\index{drawshadowed?\texttt{drawshadowed}}
+\end{figure}
+
+A full example of {\tt circleit} boxes appears in Figure~\ref{fig52}.
+The oval boundary paths around ``Start'' and ``Stop'' are due to the equations
+$$ \hbox{\tt aa.dx=aa.dy;} \quad {\rm and}\quad \hbox{\tt ee.dx=ee.dy} $$
+after
+$$ \hbox{\verb|circleit.ee(btex\strut Stop etex)|}
+ \quad{\rm and}\quad
+ \hbox{\verb|circleit.ee(btex\strut Stop etex)|}.
+$$
+The general rule is that {\tt bpath.}$c$ comes out circular if $c${\tt.dx},
+$c${\tt.dy}, and $c\hbox{\tt.dx}-c\hbox{\tt.dy}$ are all unknown. Otherwise, the
+macros select an oval big enough to contain the given picture with the safety
+margin {\tt circmargin}\index{circmargin?\texttt{circmargin}}.
+
+
+\begin{figure}[htp]
+$$\hbox{$\begin{verbatim}
+vardef cuta(suffix a,b) expr p =
+ drawarrow p cutbefore bpath.a cutafter bpath.b;
+ point .5*length p of p
+enddef;
+
+vardef self@# expr p =
+ cuta(@#,@#) @#.c{curl0}..@#.c+p..{curl0}@#.c enddef;
+
+beginfig(52);
+verbatimtex \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
+circleit.aa(btex\strut Start etex); aa.dx=aa.dy;
+circleit.bb(btex \stk B{(a|b)^*a} etex);
+circleit.cc(btex \stk C{b^*} etex);
+circleit.dd(btex \stk D{(a|b)^*ab} etex);
+circleit.ee(btex\strut Stop etex); ee.dx=ee.dy;
+numeric hsep;
+bb.c-aa.c = dd.c-bb.c = ee.c-dd.c = (hsep,0);
+cc.c-bb.c = (0,.8hsep);
+xpart(ee.e - aa.w) = 3.8in;
+drawboxed(aa,bb,cc,dd,ee);
+label.ulft(btex$b$etex, cuta(aa,cc) aa.c{dir50}..cc.c);
+label.top(btex$b$etex, self.cc(0,30pt));
+label.rt(btex$a$etex, cuta(cc,bb) cc.c..bb.c);
+label.top(btex$a$etex, cuta(aa,bb) aa.c..bb.c);
+label.llft(btex$a$etex, self.bb(-20pt,-35pt));
+label.top(btex$b$etex, cuta(bb,dd) bb.c..dd.c);
+label.top(btex$b$etex, cuta(dd,ee) dd.c..ee.c);
+label.lrt(btex$a$etex, cuta(dd,bb) dd.c..{dir140}bb.c);
+label.bot(btex$a$etex, cuta(ee,bb) ee.c..tension1.3 ..{dir115}bb.c);
+label.urt(btex$b$etex, cuta(ee,cc) ee.c{(cc.c-ee.c)rotated-15}..cc.c);
+endfig;
+\end{verbatim}
+$}
+\atop \vcenter{\vskip8pt\hbox{\epsfbox{manfig.52}}}
+$$
+\caption{MetaPost code and the corresponding figure}
+\label{fig52}
+\index{self?\texttt{self}}
+\end{figure}
+
+
+\section{Debugging}
+
+MetaPost inherits from \MF\index{metafont?\MF} numerous facilities for interactive
+debugging, most of which can only be mentioned briefly here. Further information
+on error messages, debugging, and generating tracing information can be found in
+{\it The\ \MF book} \cite{kn:c}.
+
+Suppose your input file says
+$$ \hbox{\tt draw z1--z2;} $$
+on line 17 without first giving known values to {\tt z1} and {\tt z2}.
+Figure~\ref{errmsg} shows what the MetaPost interpreter prints on your terminal
+when it finds the error. The actual error message is the line beginning with
+``{\tt !}''; the next six lines give the context that shows exactly what input
+was being read when the error was found; and the ``{\tt ?}'' on last line is a
+prompt for your response. Since the error message talks about an undefined
+$x$~coordinate, this value is printed on the first line after the ``{\tt >>}''.
+In this case the $x$~coordinate of {\tt z1} is just the unknown variable {\tt x1},
+so the interpreter prints the variable name {\tt x1} just as it would if it
+were told to\index{show?\texttt{show}} ``{\tt show x1}'' at this point.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+>> x1
+! Undefined x coordinate has been replaced by 0.
+<to be read again>
+ {
+--->{
+ curl1}..{curl1}
+l.17 draw z1--
+ z2;
+?
+\end{verbatim}
+$$
+\caption{An example of an error message.}
+\label{errmsg}
+\end{figure}
+
+The context listing may seem a little confusing at first, but it really just
+gives a few lines of text showing how much of each line has been read so far.
+Each line of input is printed on two lines like this:
+\begin{eqnarray*}
+ \descr{descriptor}\ \hbox{Text read so far} \\
+ && \hbox{Text yet to be read}
+\end{eqnarray*}
+The \tdescr{descriptor} identifies the input source. It is either a line number
+like ``{\tt l.17}'' for line 17 of the current file; or it can be a macro name
+followed by ``{\tt ->}''; or it is a descriptive phrase in angle brackets.
+Thus, the meaning of the context listing in Figure~\ref{errmsg} is that the
+interpreter has just read line 17 of the input file up to ``{\tt --},'' the
+expansion of the {\tt --} macro has just started, and the initial
+``\verb|{|'' has been reinserted to allow for user input before scanning
+this token.
+
+Among the possible responses to a {\tt ?} prompt are the following:
+\begin{description}
+\item[x] terminates the run so that you can fix you input file and start over.
+\item[h] prints a help message followed by another {\tt ?} prompt.
+\item[\tdescr{return}] causes the interpreter to proceed as best it can.
+\item[?] prints a listing of the options available, followed by another
+ {\tt ?} prompt.
+\end{description}
+
+Error messages and responses to {\tt show} commands are also written into the
+transcript\index{files!transcript} file whose name is obtained from the name
+of the main input file by changing ``{\tt .mp}'' to ``{\tt .log}''. When the
+internal variable\index{internal variables}\index{variables!internal}
+{\tt tracingonline}\index{tracingonline?\texttt{tracingonline}} is at its default
+value of zero, some {\tt show} commands print their results in full detail only
+in transcript file.
+
+Only one type of {\tt show}\index{show?\texttt{show}} command has been discussed so far:
+{\tt show} followed by a comma-separated list of expressions prints symbolic
+representations of the expressions.
+
+The {\tt showtoken}\index{showtoken?\texttt{showtoken}}\label{Dshtok}
+command can be used to show the
+parameters and replacement text of a macro. It takes a comma-separated list of
+tokens and identifies each one. If the token is a primitive as in
+``\verb|showtoken +|'' it is just identified as being itself:
+$$ \hbox{\verb|> +=+|} $$
+Applying {\tt showtoken} to a variable or a {\tt vardef} macro yields
+$$ \hbox{\tt > } \descr{token}\hbox{\tt =variable} $$
+
+To get more information about a variable, use
+{\tt showvariable}\index{showvariable?\texttt{showvariable}}\label{Dshvar}
+instead of {\tt showtoken}. The
+argument to {\tt showvariable} is a comma-separated list of symbolic tokens
+and the result is a description of all the variables whose names begin with
+one of the listed tokens. This even works for {\tt vardef} macros. For
+example, {\tt showvariable z} yields
+$$ \hbox{\verb|z@#=macro:->begingroup(x(SUFFIX2),y(SUFFIX2))endgroup|} $$
+
+There is also a {\tt showdependencies}\index{showdependencies?\texttt{showdependencies}}\label{Dshdep}
+command that takes no arguments and prints a list of all {\em dependent} variables
+and how the linear equations given so far make them depend on other variables.
+Thus after
+$$ \hbox{\tt z2-z1=(5,10); z1+z2=(a,b);} $$
+{\tt showdependencies} prints what is shown in Figure~\ref{shdep}. This could
+be useful in answering a question like ``What does it mean
+`{\tt !\ Undefined x coordinate}?' I thought the equations given so far would
+determine {\tt x1}.''
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+x2=0.5a+2.5
+y2=0.5b+5
+x1=0.5a-2.5
+y1=0.5b-5
+\end{verbatim}
+$$
+\caption{The result of {\tt z2-z1=(5,10); z1+z2=(a,b); showdependencies;}}
+\label{shdep}
+\end{figure}
+
+When all else fails, the predefined macro
+{\tt tracingall}\index{tracingall?\texttt{tracingall}}\label{Dtall}
+causes the interpreter to print a detailed listing of everything it is doing.
+Since the tracing information is often quite voluminous, it may be better to use
+the {\tt loggingall}\index{loggingall?\texttt{loggingall}}\label{Dlogall}
+macro that produces the same information
+but only writes it in the transcript\index{files!transcript} file. There is also
+a {\tt tracingnone}\index{tracingnone?\texttt{tracingnone}}\label{Dtnone}
+macro that turns off all the tracing output.
+
+Tracing output is controlled by the set of
+internal variables\index{internal variables}\index{variables!internal}
+summarized below.
+When any one of these variables is given a positive value, the corresponding form
+of tracing is turned on. Here is the set of tracing variables and what happens
+when each of them is positive:
+\begin{description}
+\item[{\tt tracingcapsules}]\index{tracingcapsules?\texttt{tracingcapsules}}\label{Dtcapsules}%
+shows the values of temporary quantities (capsules) when they become known.
+%
+\item[{\tt tracingchoices}]\index{tracingchoices?\texttt{tracingchoices}}\label{Dtchoices}%
+shows the B\'ezier control\index{control points} points of each new path when they
+are chosen.
+%
+\item[{\tt tracingcommands}]\index{tracingcommands?\texttt{tracingcommands}}\label{Dtcommands}%
+shows the commands before they are performed. A setting ${}>1$ also shows
+{\tt if}\index{if?\texttt{if}} tests and loops before they are expanded;
+a setting ${}>2$ shows algebraic operations before they are performed.
+%
+\item[{\tt tracingequations}]\index{tracingequations?\texttt{tracingequations}}\label{Dtequations}%
+shows each variable when it becomes known.
+%
+\item[{\tt tracinglostchars}]\index{tracinglostchars?\texttt{tracinglostchars}}\label{Dtlostchars}%
+warns about characters omitted from a picture because they are not in the font
+being used to typeset labels.
+%
+\item[{\tt tracingmacros}]\index{tracingmacros?\texttt{tracingmacros}}\label{Dtmacros}%
+shows macros before they are expanded.
+%
+\item[{\tt tracingoutput}]\index{tracingoutput?\texttt{tracingoutput}}\label{Dtoutput}%
+shows pictures as they are being shipped out as PostScript files.
+%
+\item[{\tt tracingrestores}]\index{tracingrestores?\texttt{tracingrestores}}\label{Dtrestores}%
+shows symbols and internal variables as they are being restored at the end
+of a group.
+%
+\item[{\tt tracingspecs}]\index{tracingspecs?\texttt{tracingspecs}}\label{Dtspecs}%
+shows the outlines generated when drawing with a
+polygonal pen\index{pens!polygonal}.
+%
+\item[{\tt tracingstats}]\index{tracingstats?\texttt{tracingstats}}\label{Dtstats}
+shows in the transcript file at the end of the job how many of the
+MetaPost interpreter's limited resources were used.
+\end{description}
+
+
+\section*{Acknowledgement}
+
+I would like to thank Don Knuth for making this work possible by developing
+\MF\ and placing it in the public domain. I am also indebted to him for helpful
+suggestions, particularly with regard to the treatment of included \TeX\ material.
+
+
+\appendix
+
+\section{Reference Manual}
+
+\let\svtopfrac=\topfraction % prepare to restore values at end of this appendix
+\let\svtxtfrac=\textfraction % grouping would fail because \setcounter is global
+\newcounter{svtopnum}
+\newcounter{svtotnum}
+\setcounter{svtopnum}{\value{topnumber}}
+\setcounter{svtotnum}{\value{totalnumber}}
+
+\renewcommand\topfraction{1.0} % set values to allow *lots* of figures and tables
+\renewcommand\textfraction{0.0}
+\setcounter{topnumber}{10}
+\setcounter{totalnumber}{10}
+
+Tables \ref{ivartab}--\ref{pseudotab} summarize the built-in features of
+Plain MetaPost and the features defined in the {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}}
+macro file. As explained in Section~\ref{boxessec}, the {\tt boxes.mp} macro
+file is not automatically preloaded and the macros defined there are not
+accessible until you ask for them via the command\index{input?\texttt{input}}
+$$ \hbox{\tt input boxes} $$
+
+Features that depend on {\tt boxes.mp} are marked by \bx\ symbols.
+Features from the Plain\index{Plain macros} macro package are marked are marked
+by \pl\ symbols, and MetaPost primitives are not marked by \bx\ or \pl.
+The distinction between primitives and plain macros can be ignored by the casual
+user, but it is important to remember that features marked by a \bx\ can only
+be used after reading in the {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}} macro file.
+
+The tables in this appendix give the name each feature, the page number where
+it is explained, and a short description. A few features are not explained
+elsewhere and have no page number listed. These features exist primarily for
+compatibility with \MF\index{metafont?\MF} and are intended to be self-explanatory.
+Certain other features from \MF\ are omitted entirely because they are of
+limited interest to the MetaPost users and/or would require long explanations.
+All of these are documented in {\it The \MF book} \cite{kn:c} as explained
+in Appendix~\ref{MPvsMF}.
+
+Table~\ref{ivartab} lists internal variables that take on numeric values.
+Table~\ref{pvartab} lists predefined variables of other types.
+Table~\ref{consttab} lists predefined constants. Some of these are implemented
+as variables whose values are intended to be left unchanged.
+
+Tables \ref{optabA}--\ref{optabD} summarize MetaPost operators and list the
+possible argument and result types for each one. A ``--'' entry for the left
+argument indicates a unary operator; ``--'' entries for both arguments indicate a
+nullary operator. Operators that take suffix parameters are not listed in
+these tables because they are treated as ``function-like macros''.
+
+The last two tables are Table~\ref{cmdtab} for commands and Table~\ref{pseudotab}
+macros that behave like functions or procedures. Such macros take parenthesized
+argument lists and/or suffix parameters, returning either a value whose type is
+listed in the table, or nothing. The latter case is for macros that behave
+like procedures. Their return values are listed as ``--''.
+
+The figures in this appendix present the syntax of the MetaPost language
+starting with expressions in Figures \ref{syexpr1}--\ref{sypseudo}.
+Although the productions sometimes specify types for expressions, primaries,
+secondaries, and tertiaries, no attempt is made to give separate syntaxes
+for \tdescr{numeric expression}, \tdescr{pair expression}, etc.
+The simplicity of the productions in Figure~\ref{sytypexpr} is due to this
+lack of type information. Type information
+can be found in Tables \ref{ivartab}--\ref{pseudotab}.
+
+Figures \ref{syprog} and \ref{sycmds} give the syntax for MetaPost programs,
+including statements and commands. They do not mention loops\index{loops}
+and {\tt if}\index{if?\texttt{if}}
+tests because these constructions do not behave like statements. The syntax
+given in Figures \ref{syexpr1}--\ref{pseudotab} applies to the result of
+expanding all conditionals and loops. Conditionals and loops do have a
+syntax, but they deal with almost arbitrary sequences of tokens.
+Figure~\ref{sycondloop} specifies conditionals in terms of
+\tdescr{balanced tokens} and loops in terms of \tdescr{loop text}, where
+\tdescr{balanced tokens} is any sequence of tokens balanced with respect
+to {\tt if} and {\tt fi}, and \tdescr{loop text} is a sequence of tokens
+balanced with respect to {\tt for}, {\tt forsuffixes}, {\tt forever},
+and {\tt endfor}.
+
+\begin{table}[htp]
+\caption{Internal variables with numeric values}
+$$\begin{tabular}{|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt ahangle& \pageref{Dahangle}&
+ angle for arrowheads in degrees (default: 45)\\\hline
+\pl\tt ahlength& \pageref{Dahlength}&
+ size of arrowheads (default: 4{\tt bp})\\\hline
+\pl\tt bboxmargin& \pageref{Dbbmargin}&
+ extra space allowed by {\tt bbox} (default 2{\tt bp})\\\hline
+\tt charcode& \pageref{Dcharcode}&
+ the number of the next character to be output\\\hline
+\bx\tt circmargin& \pageref{Dcmargin}&
+ clearance around contents of a circular or oval box\\\hline
+\tt day& --&
+ the current day of the month\\\hline
+\bx\tt defaultdx& \pageref{Ddefaultdx}&
+ usual horizontal space around box contents (default 3{\tt bp})\\\hline
+\bx\tt defaultdy& \pageref{Ddefaultdy}&
+ usual vertical space around box contents (default 3{\tt bp})\\\hline
+\pl\tt defaultpen& \pageref{Ddefaultpen}&
+ numeric index used by {\tt pickup} to select default pen\\\hline
+\pl\tt defaultscale& \pageref{Ddfscale}&
+ font scale factor for label strings (default 1)\\\hline
+\pl\tt labeloffset& \pageref{Dlaboff}&
+ offset distance for labels (default 3{\tt bp})\\\hline
+\tt linecap& \pageref{Dlinecap}&
+ 0 for butt, 1 for round, 2 for square\\\hline
+\tt linejoin& \pageref{Dlinejoin}&
+ 0 for mitered, 1 for round, 2 for beveled\\\hline
+\tt miterlimit& \pageref{Dmiterlim}&
+ controls miter length as in PostScript\\\hline
+\tt month& --&
+ the current month (e.g, 3 $\equiv$ March)\\\hline
+\tt pausing& --&
+ ${}>0$ to display lines on the terminal before they are read\\\hline
+\tt prologues& \pageref{Dprologs}&
+ ${}>0$ to output conforming PostScript using built-in fonts\\\hline
+\tt showstopping& --&
+ ${}>0$ to stop after each {\tt show} command\\\hline
+\tt time& --&
+ the number of minutes past midnight when this job started\\\hline
+\tt tracingcapsules& \pageref{Dtcapsules}&
+ ${}>0$ to show capsules too\\\hline
+\tt tracingchoices& \pageref{Dtchoices}&
+ ${}>0$ to show the control points chosen for paths\\\hline
+\tt tracingcommands& \pageref{Dtcommands}&
+ ${}>0$ to show commands and operations as they are performed\\\hline
+\tt tracingequations& \pageref{Dtequations}&
+ ${}>0$ to show each variable when it becomes known\\\hline
+\tt tracinglostchars& \pageref{Dtlostchars}&
+ ${}>0$ to show characters that aren't {\tt infont}\\\hline
+\tt tracingmacros& \pageref{Dtmacros}&
+ ${}>0$ to show macros before they are expanded\\\hline
+\tt tracingonline& \pageref{Dtonline}&
+ ${}>0$ to show long diagnostics on the terminal\\\hline
+\tt tracingoutput& \pageref{Dtoutput}&
+ ${}>0$ to show digitized edges as they are output\\\hline
+\tt tracingrestores& \pageref{Dtrestores}&
+ ${}>0$ to show when a variable or internal is restored\\\hline
+\tt tracingspecs& \pageref{Dtspecs}&
+ ${}>0$ to show path subdivision when using a polygonal a pen\\\hline
+\tt tracingstats& \pageref{Dtstats}&
+ ${}>0$ to show memory usage at end of job\\\hline
+\tt tracingtitles& --&
+ ${}>0$ to show titles online when they appear\\\hline
+\tt truecorners& \pageref{Dtruecorn}&
+ ${}>0$ to make {\tt llcorner} etc. ignore {\tt setbounds}\\\hline
+\tt warningcheck& \pageref{Dwarncheck}&
+ controls error message when variable value is large\\\hline
+\tt year& --&
+ the current year (e.g., 1992)\\\hline
+\end{tabular}
+$$
+\label{ivartab}%
+\index{day?\texttt{day}}\index{month?\texttt{month}}\index{pausing?\texttt{pausing}}\index{showstopping?\texttt{showstopping}}%
+\index{time?\texttt{time}}\index{tracingtitles?\texttt{tracingtitles}}\index{year?\texttt{year}}
+\end{table}
+
+\begin{table}[htp]
+\caption{Other Predefined Variables}
+$$\begin{tabular}{|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Type}& \multicolumn1{|c}{Page}&
+ \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt background& color& \pageref{Dbground}&
+ Color for {\tt unfill} and {\tt undraw} (usually white)\\\hline
+\pl\tt currentpen& pen& \pageref{Dcurpen}&
+ Last pen picked up (for use by the {\tt draw} command)\\\hline
+\pl\tt currentpicture& picture& \pageref{Dcurpic}&
+ Accumulate results of {\tt draw} and {\tt fill} commands\\\hline
+\pl\tt cuttings& path& \pageref{Dcuttings}&
+ subpath cut off by last {\tt cutbefore} or {\tt cutafter}\\\hline
+\pl\tt defaultfont& string& \pageref{Ddffont}&
+ Font used by label commands for typesetting strings\\\hline
+\pl\tt extra\_beginfig& string& \pageref{Dxbfig}&
+ Commands for {\tt beginfig} to scan\\\hline
+\pl\tt extra\_endfig& string& \pageref{Dxefig}&
+ Commands for {\tt endfig} to scan\\\hline
+\end{tabular}
+$$
+\label{pvartab}
+\end{table}
+
+\begin{table}[htp]
+\caption{Predefined Constants}
+$$\begin{tabular}{|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Type}& \multicolumn1{|c}{Page}&
+ \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt beveled& numeric& \pageref{Dbvled}&
+ {\tt linejoin} value for beveled joins [2]\\\hline
+\pl\tt black& color& \pageref{Dblack}&
+ Equivalent to {\tt (0,0,0)}\\\hline
+\pl\tt blue& color& \pageref{Dblue}&
+ Equivalent to {\tt (0,0,1)}\\\hline
+\pl\tt bp& numeric& \pageref{Dbp}&
+ One PostScript point in {\tt bp} units [1]\\\hline
+\pl\tt butt& numeric& \pageref{Dbutt}&
+ {\tt linecap} value for butt end caps [0]\\\hline
+\pl\tt cc& numeric& --&
+ One cicero in {\tt bp} units [12.79213]\\\hline
+\pl\tt cm& numeric& \pageref{Dcm}&
+ One centimeter in {\tt bp} units [28.34645]\\\hline
+\pl\tt dd& numeric& --&
+ One didot point in {\tt bp} units [1.06601]\\\hline
+\pl\tt ditto& string& --&
+ The {\tt "} character as a string of length 1\\\hline
+\pl\tt down& pair& \pageref{Ddown}&
+ Downward direction vector $(0,-1)$\\\hline
+\pl\tt epsilon& numeric& --&
+ Smallest positive MetaPost number [$1\over65536$]\\\hline
+\pl\tt evenly& picture& \pageref{Devenly}&
+ Dash pattern for equal length dashes\\\hline
+\tt false& boolean& \pageref{Dfalse}&
+ The boolean value {\it false\/}\\\hline
+\pl\tt fullcircle& path& \pageref{Dfcirc}&
+ Circle of diameter 1 centered on $(0,0)$\\\hline
+\pl\tt green& color& \pageref{Dgreen}&
+ Equivalent to {\tt (0,1,0)}\\\hline
+\pl\tt halfcircle& path& \pageref{Dhcirc}&
+ Upper half of a circle of diameter 1\\\hline
+\pl\tt identity& transform& \pageref{Dident}&
+ Identity transformation\\\hline
+\pl\tt in& numeric& \pageref{Din}&
+ One inch in {\tt bp} units [72]\\\hline
+\pl\tt infinity& numeric& \pageref{Dinf}&
+ Large positive value [4095.99998]\\\hline
+\pl\tt left& pair& \pageref{Dleft}&
+ Leftward direction $(-1,0)$\\\hline
+\pl\tt mitered& numeric& \pageref{Dmitred}&
+ {\tt linejoin} value for mitered joins [0]\\\hline
+\pl\tt mm& numeric& \pageref{Dmm}&
+ One millimeter in {\tt bp} units [2.83464]\\\hline
+\tt nullpicture& picture& \pageref{Dnlpic}&
+ Empty picture\\\hline
+\pl\tt origin& pair& --&
+ The pair $(0,0)$\\\hline
+\pl\tt pc& numeric& --&
+ One pica in {\tt bp} units [11.95517]\\\hline
+\tt pencircle& pen& \pageref{Dpncirc}&
+ Circular pen of diameter 1\\\hline
+\pl\tt pensquare& pen& \pageref{Dpnsqr}&
+ square pen of height 1 and width 1\\\hline
+\pl\tt pt& numeric& \pageref{Dpt}&
+ One printer's point in {\tt bp} units [0.99626]\\\hline
+\pl\tt quartercircle& path& --&
+ First quadrant of a circle of diameter 1\\\hline
+\pl\tt red& color& \pageref{Dred}&
+ Equivalent to {\tt (1,0,0)}\\\hline
+\pl\tt right& pair& \pageref{Dright}&
+ Rightward direction $(1,0)$\\\hline
+\pl\tt rounded& numeric& \pageref{Drnded}&
+ {\tt linecap} and {\tt linejoin} value for round joins\\
+\tt & & &
+ and end caps [1]\\\hline
+\pl\tt squared& numeric& \pageref{Dsqred}&
+ {\tt linecap} value for square end caps [2]\\\hline
+\tt true& boolean& \pageref{Dtrue}&
+ The boolean value {\tt true}\\\hline
+\pl\tt unitsquare& path& --&
+ The path {\tt (0,0)--(1,0)--(1,1)--(0,1)--cycle}\\\hline
+\pl\tt up& pair& \pageref{Dup}&
+ Upward direction $(0,1)$\\\hline
+\pl\tt white& color& \pageref{Dwhite}&
+ Equivalent to {\tt (1,1,1)}\\\hline
+\pl\tt withdots& picture& \pageref{Dwdots}&
+ Dash pattern that produces dotted lines\\\hline
+\end{tabular}
+$$
+\label{consttab}%
+\index{cc?\texttt{cc}}\index{dd?\texttt{dd}}\index{ditto?\texttt{ditto}}\index{epsilon?\texttt{epsilon}}%
+\index{origin?\texttt{origin}}\index{pc?\texttt{pc}}\index{quartercircle?\texttt{quartercircle}}%
+\index{unitsquare?\texttt{unitsquare}}
+\end{table}
+
+\begin{table}[htp]
+\caption{Operators (Part 1)}
+$$\begin{tabular}{|l|l|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn3{|c}{Argument/result types}&
+ \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\cline{2-4}
+& Left& Right& Result& & \\
+\hline
+\hline
+\tt \verb|&|& string& string& string& \pageref{Damp}&
+ Concatenation---works for paths $l\hbox{\tt\&}r$ if\\
+& path& path& path& &
+ $r$ starts exactly where the $l$ ends\\\hline
+\tt \verb|*|& numeric& color& color& \pageref{Dmldiv}&
+ Multiplication\\
+& & numeric& numeric& &
+ \\
+& & pair& pair& &
+ \\\hline
+\tt \verb|*|& color& numeric& color& \pageref{Dmldiv}&
+ Multiplication\\
+& numeric& & numeric& &
+ \\
+& pair& & pair& &
+ \\\hline
+\tt \verb|**|& numeric& numeric& numeric& \pageref{Dpow}&
+ Exponentiation\\\hline
+\tt \verb|+|& color& color& color& \pageref{Dadd}&
+ Addition\\
+& numeric& numeric& numeric& &
+ \\
+& pair& pair& pair& &
+ \\\hline
+\tt \verb|++|& numeric& numeric& numeric& \pageref{Dpyadd}&
+ Pythagorean addition $\sqrt{l^2+r^2}$\\\hline
+\tt \verb|+-+|& numeric& numeric& numeric& \pageref{Dpysub}&
+ Pythagorean subtraction $\sqrt{l^2-r^2}$\\\hline
+\tt \verb|-|& color& color& color& \pageref{Dadd}&
+ Subtraction\\
+& numeric& numeric& numeric& &
+ \\
+& pair& pair& pair& &
+ \\\hline
+\tt \verb|-|& --& color& color& \pageref{Dneg}&
+ Negation\\
+& & numeric& numeric& &
+ \\
+& & pair& pair& &
+ \\\hline
+\tt \verb|/|& color& numeric& color& \pageref{Dmldiv}&
+ Division\\
+& numeric& & numeric& &
+ \\
+& pair& & pair& &
+ \\\hline
+\tt \verb|< = >|& string& string& boolean& \pageref{Dcmpar}&
+ Comparison operators\\
+\tt \verb|<= >=|& numeric& numeric& & &
+ \\
+\tt \verb|<>|& pair& pair& & &
+ \\
+& color& color& & &
+ \\
+& transform& transform& & &
+ \\\hline
+\pl\tt \verb|abs|& --& numeric& numeric& \pageref{Dabs}&
+ Absolute value\\
+& & pair& & &
+ \\\hline
+\tt \verb|and|& boolean& boolean& boolean& \pageref{Dand}&
+ Logical and\\\hline
+\tt \verb|angle|& --& pair& numeric& \pageref{Dangle}&
+ 2$-$argument arctangent (in degrees)\\\hline
+\tt \verb|arclength|& --& path& numeric& \pageref{Darclng}&
+ Arc length of a path\\\hline
+\tt \verb|arctime|& numeric& path& numeric& \pageref{Darctim}&
+ Time on a path where arclength from\\
+\tt \verb|of|& & & & &
+ the start reaches a given value\\\hline
+\tt \verb|ASCII|& --& string& numeric& --&
+ ASCII value of first character in string\\\hline
+\pl\tt \verb|bbox|& --& picture& path& \pageref{Dbbox}&
+ A rectangular path for the bounding\\
+& & path& & &
+ box\\
+& & pen& & &
+ \\\hline
+\tt \verb|bluepart|& --& color& numeric& \pageref{Drgbprt}&
+ Extracts the third component\\\hline
+\tt \verb|boolean|& --& any& boolean& \pageref{Dboolop}&
+ Is the expression of type boolean?\\\hline
+\tt \verb|bot|& --& numeric& numeric& \pageref{Dbot}&
+ Bottom of current pen when centered\\
+& & pair& pair& &
+ at the given coordinate(s)\\\hline
+\pl\tt \verb|ceiling|& --& numeric& numeric& \pageref{Dceil}&
+ Least integer greater than or equal to\\\hline
+\pl\tt \verb|center|& --& picture& pair& \pageref{Dcenter}&
+ Center of the bounding box\\
+& & path& & &
+ \\
+& & pen& & &
+ \\\hline
+\end{tabular}
+$$
+\index{ASCII?\texttt{ASCII}}%
+\label{optabA}
+\end{table}
+
+\begin{table}[htp]
+\caption{Operators (Part 2)}
+$$\begin{tabular}{|l|l|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn3{|c}{Argument/result types}&
+ \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\cline{2-4}
+& Left& Right& Result& & \\
+\hline
+\hline
+\tt \verb|char|& --& numeric& string& \pageref{Dchar}&
+ Character with a given ASCII code\\\hline
+\tt \verb|color|& --& any& boolean& \pageref{Dcolrop}&
+ Is the expression of type color?\\\hline
+\tt \verb|cosd|& --& numeric& numeric& \pageref{Dcosd}&
+ Cosine of angle in degrees\\\hline
+\pl\tt \verb|cutafter|& path& path& path& \pageref{Dcuta}&
+ Left argument with part after the\\
+& & & & &
+ intersection dropped\\\hline
+\pl\tt \verb|cutbefore|& path& path& path& \pageref{Dcutb}&
+ Left argument with part before the\\
+& & & & &
+ intersection dropped\\\hline
+\tt \verb|cycle|& --& path& boolean& \pageref{Dcycop}&
+ Determines whether a path is cyclic\\\hline
+\tt \verb|decimal|& --& numeric& string& \pageref{Ddecop}&
+ The decimal representation\\\hline
+\pl\tt \verb|dir|& --& numeric& pair& \pageref{Ddirop}&
+ $(\cos\theta,\sin\theta)$ given $\theta$ in degrees\\\hline
+\pl\tt \verb|direction|& numeric& path& pair& \pageref{Ddirof}&
+ The direction of a path at a given\\
+\tt \verb| of|& & & & &
+ `time'\\\hline
+\pl\tt \verb|direction-|& pair& path& numeric& \pageref{Ddpntof}&
+ Point where a path has a given\\
+\tt \verb|point of|& & & & &
+ direction\\\hline
+\tt \verb|direction-|& pair& path& numeric& \pageref{Ddtimof}&
+ `Time' when a path has a given\\
+\tt \verb|time of|& & & & &
+ direction\\\hline
+\pl\tt \verb|div|& numeric& numeric& numeric& --&
+ Integer division $\lfloor l/r\rfloor$\\\hline
+\pl\tt \verb|dotprod|& pair& pair& numeric& \pageref{Ddprod}&
+ vector dot product\\\hline
+\tt \verb|floor|& --& numeric& numeric& \pageref{Dfloor}&
+ Greatest integer less than or equal to\\\hline
+\tt \verb|fontsize|& --& string& numeric& \pageref{Dfntsiz}&
+ The point size of a font\\\hline
+\tt \verb|greenpart|& --& color& numeric& \pageref{Drgbprt}&
+ Extract the second component\\\hline
+\tt \verb|hex|& --& string& numeric& --&
+ Interpret as a hexadecimal number\\\hline
+\tt \verb|infont|& string& string& picture& \pageref{Sinfont}&
+ Typeset string in given font\\\hline
+\pl\tt \verb|intersec-|& path& path& pair& \pageref{Disecpt}&
+ An intersection point\\
+\tt \verb| tionpoint|& & & & &
+ \\\hline
+\tt \verb|intersec-|& path& path& pair& \pageref{Disectt}&
+ Times ($t_l,t_r)$ on paths $l$ and $r$\\
+\tt \verb|tiontimes|& & & & &
+ when the paths intersect\\\hline
+\pl\tt \verb|inverse|& --& transform& transform& \pageref{Dinv}&
+ Invert a transformation\\\hline
+\tt \verb|known|& --& any& boolean& \pageref{Dknown}&
+ Does argument have a known value?\\\hline
+\tt \verb|length|& --& path& numeric& \pageref{Dlength}&
+ Number of arcs in a path\\\hline
+\pl\tt \verb|lft|& --& numeric& numeric& \pageref{Dlft}&
+ Left side of current pen when its\\
+& & pair& pair& &
+ center is at the given coordinate(s)\\\hline
+\tt \verb|llcorner|& --& picture& pair& \pageref{Dcornop}&
+ Lower-left corner of bounding box\\
+& & path& & &
+ \\
+& & pen& & &
+ \\\hline
+\tt \verb|lrcorner|& --& picture& pair& \pageref{Dcornop}&
+ Lower-left corner of bounding box\\
+& & path& & &
+ \\
+& & pen& & &
+ \\\hline
+\tt \verb|makepath|& --& pen& path& \pageref{Dmkpath}&
+ Cyclic path bounding the pen shape\\\hline
+\tt \verb|makepen|& --& path& pen& \pageref{Dmkpen}&
+ A polygonal pen made from the\\
+& & & & &
+ convex hull of the path knots\\\hline
+\tt \verb|mexp|& --& numeric& numeric& --&
+ The function $\exp(x/256)$\\\hline
+\tt \verb|mlog|& --& numeric& numeric& --&
+ The function $256\ln(x)$\\\hline
+\pl\tt \verb|mod|& --& numeric& numeric& --&
+ The remainder function $l-r\lfloor l/r\rfloor$\\\hline
+\tt \verb|normal-|& --& --& numeric& --&
+ Choose a random number with\\
+\tt \verb|deviate|& & & & &
+ mean 0 and standard deviation 1\\\hline
+\end{tabular}
+$$
+\index{div?\texttt{div}}\index{hex?\texttt{hex}}\index{mexp?\texttt{mexp}}\index{mlog?\texttt{mlog}}%
+\index{mod?\texttt{mod}}\index{normaldeviate?\texttt{normaldeviate}}%
+\label{optabB}
+\end{table}
+
+\begin{table}[htp]
+\caption{Operators (Part 3)}
+$$\begin{tabular}{|l|l|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn3{|c}{Argument/result types}&
+ \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\cline{2-4}
+& Left& Right& Result& & \\
+\hline
+\hline
+\tt \verb|not|& --& boolean& boolean& \pageref{Dnot}&
+ Logical negation\\\hline
+\tt \verb|numeric|& --& any& boolean& \pageref{Dnumop}&
+ Is the expression of type numeric?\\\hline
+\tt \verb|oct|& --& string& numeric& --&
+ Interpret a string as an octal number\\\hline
+\tt \verb|odd|& --& numeric& boolean& --&
+ Is the closest integer odd or even?\\\hline
+\tt \verb|or|& boolean& boolean& boolean& \pageref{Dor}&
+ Logical inclusive or\\\hline
+\tt \verb|pair|& --& any& boolean& \pageref{Dpairop}&
+ Is the expression of type pair?\\\hline
+\tt \verb|path|& --& any& boolean& \pageref{Dpathop}&
+ Is the expression of type path?\\\hline
+\tt \verb|pen|& --& any& boolean& \pageref{Dpenop}&
+ Is the expression of type pen?\\\hline
+\tt \verb|penoffset|& pair& pen& pair& --&
+ Point on the pen furthest to the\\
+\tt \verb|of|& & & & &
+ right of the given direction\\\hline
+\tt \verb|picture|& --& any& boolean& \pageref{Dpictop}&
+ Is the expression of type picture?\\\hline
+\tt \verb|point of|& numeric& path& pair& \pageref{Dpntof}&
+ Point on a path given a time value\\\hline
+\tt \verb|postcontrol|& numeric& path& pair& --&
+ First B\'ezier control point on path\\
+\tt \verb|of|& & & & &
+ segment starting at the given time\\\hline
+\tt \verb|precontrol|& numeric& path& pair& --&
+ Last B\'ezier control point on path\\
+\tt \verb|of|& & & & &
+ segment ending at the given time\\\hline
+\tt \verb|redpart|& --& color& numeric& \pageref{Drgbprt}&
+ Extract the first component\\\hline
+\tt \verb|reverse|& --& path& path& \pageref{Drevrse}&
+ `time'-reversed path with beginning\\
+& & & & &
+ swapped with ending\\\hline
+\tt \verb|rotated|& picture& numeric& picture& \pageref{Dtranop}&
+ Rotate counterclockwise a given\\
+& path& & path& &
+ number of degrees\\
+& pair& & pair& &
+ \\
+& pen& & pen& &
+ \\
+& transform& & transform& &
+ \\\hline
+\pl\tt \verb|round|& --& numeric& numeric& \pageref{Dround}&
+ round each component to the nearest\\
+& & pair& pair& &
+ integer\\\hline
+\pl\tt \verb|rt|& --& numeric& numeric& \pageref{Drt}&
+ Right side of current pen when\\
+& & pair& pair& &
+ centered at given coordinate(s)\\\hline
+\tt \verb|scaled|& picture& numeric& picture& \pageref{Dtranop}&
+ Scale all coordinates by the given\\
+& path& & path& &
+ amount\\
+& pair& & pair& &
+ \\
+& pen& & pen& &
+ \\
+& transform& & transform& &
+ \\\hline
+\tt \verb|shifted|& picture& pair& picture& \pageref{Dtranop}&
+ Add the given shift amount to each\\
+& path& & path& &
+ pair of coordinates\\
+& pair& & pair& &
+ \\
+& pen& & pen& &
+ \\
+& transform& & transform& &
+ \\\hline
+\tt \verb|sind|& --& numeric& numeric& \pageref{Dsind}&
+ Sine of an angle in degrees\\\hline
+\tt \verb|slanted|& picture& numeric& picture& \pageref{Dtranop}&
+ Apply the slanting transformation\\
+& path& & path& &
+ that maps $(x,y)$ into $(x+sy,y)$,\\
+& pair& & pair& &
+ where $s$ is the numeric argument\\
+& pen& & pen& &
+ \\
+& transform& & transform& &
+ \\\hline
+\tt \verb|sqrt|& --& numeric& numeric& \pageref{Dsqrt}&
+ Square root\\\hline
+\tt \verb|str|& --& suffix& string& \pageref{Dstr}&
+ String representation for a suffix\\\hline
+\end{tabular}
+$$
+\index{oct?\texttt{oct}}\index{odd?\texttt{odd}}\index{penoffset?\texttt{penoffset}}\index{postcontrol?\texttt{postcontrol}}%
+\index{precontrol?\texttt{precontrol}}%
+\label{optabC}
+\end{table}
+
+\begin{table}[htp]
+\caption{Operators (Part 4)}
+$$\begin{tabular}{|l|l|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn3{|c}{Argument/result types}&
+ \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\cline{2-4}
+& Left& Right& Result& & \\
+\hline
+\hline
+\tt \verb|string|& --& any& boolean& \pageref{Dstrgop}&
+ Is the expression of type string?\\\hline
+\tt \verb|subpath|& pair& path& path& \pageref{Dsubpth}&
+ Portion of a path for given range\\
+\tt \verb|of|& & & & &
+ of time values\\\hline
+\tt \verb|substring|& pair& string& string& \pageref{Dsubstr}&
+ Substring bounded by given indices\\
+\tt \verb|of|& & & & &
+ \\\hline
+\pl\tt \verb|top|& --& numeric& numeric& \pageref{Dtop}&
+ Top of current pen when centered\\
+& & pair& pair& &
+ at the given coordinate(s)\\\hline
+\tt \verb|transform|& --& any& boolean& \pageref{Dtrnfop}&
+ Is the argument of type transform?\\\hline
+\tt \verb|transformed|& picture& transform& picture& \pageref{Dtrfrmd}&
+ Apply the given transform to all\\
+& path& & path& &
+ coordinates\\
+& pair& & pair& &
+ \\
+& pen& & pen& &
+ \\
+& transform& & transform& &
+ \\\hline
+\tt \verb|ulcorner|& --& picture& pair& \pageref{Dcornop}&
+ Upper-left corner of bounding box\\
+& & path& & &
+ \\
+& & pen& & &
+ \\\hline
+\tt \verb|uniform-|& --& numeric& numeric& --&
+ Random number between zero and\\
+\tt \verb|deviate|& & & & &
+ the value of the argument\\\hline
+\pl\tt \verb|unitvector|& --& pair& pair& \pageref{Duvec}&
+ Rescale a vector so its length is 1\\\hline
+\tt \verb|unknown|& --& any& boolean& \pageref{Dunknwn}&
+ Is the value unknown?\\\hline
+\tt \verb|urcorner|& --& picture& pair& \pageref{Dcornop}&
+ Upper-left corner of bounding box\\
+& & path& & &
+ \\
+& & pen& & &
+ \\\hline
+\pl\tt \verb|whatever|& --& --& numeric& \pageref{Dwhatev}&
+ Create a new anonymous unknown\\\hline
+\tt \verb|xpart|& --& pair& number& \pageref{Dxprt}&
+ $x$ or $t_x$ component\\
+& & transform& & &
+ \\\hline
+\tt \verb|xscaled|& picture& numeric& picture& \pageref{Dtranop}&
+ Scale all $x$ coordinates by the\\
+& path& & path& &
+ given amount\\
+& pair& & pair& &
+ \\
+& pen& & pen& &
+ \\
+& transform& & transform& &
+ \\\hline
+\tt \verb|xxpart|& --& transform& number& \pageref{Dtrprt}&
+ $t_{xx}$ entry in transformation matrix\\\hline
+\tt \verb|xypart|& --& transform& number& \pageref{Dtrprt}&
+ $t_{xy}$ entry in transformation matrix\\\hline
+\tt \verb|ypart|& --& pair& number& \pageref{Dyprt}&
+ $y$ or $t_y$ component\\
+& & transform& & &
+ \\\hline
+\tt \verb|yscaled|& picture& numeric& picture& \pageref{Dtranop}&
+ Scale all $y$ coordinates by the\\
+& path& & path& &
+ given amount\\
+& pair& & pair& &
+ \\
+& pen& & pen& &
+ \\
+& transform& & transform& &
+ \\\hline
+\tt \verb|yxpart|& --& transform& number& \pageref{Dtrprt}&
+ $t_{yx}$ entry in transformation matrix\\\hline
+\tt \verb|yypart|& --& transform& number& \pageref{Dtrprt}&
+ $t_{yy}$ entry in transformation matrix\\\hline
+\tt \verb|zscaled|& picture& pair& picture& \pageref{Dtranop}&
+ Rotate and scale all coordinates so\\
+& path& & path& &
+ that $(1,0)$ is mapped into the\\
+& pair& & pair& &
+ given pair; i.e., do complex\\
+& pen& & pen& &
+ multiplication.\\
+& transform& & transform& &
+ \\\hline
+\end{tabular}
+$$
+\index{uniformdeviate?\texttt{uniformdeviate}}%
+\label{optabD}
+\end{table}
+
+\begin{table}[htp]
+\caption{Commands}
+$$\begin{tabular}{|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\tt \verb|addto|& \pageref{sydraw}&
+ Low-level command for drawing and filling\\\hline
+\tt \verb|clip|& \pageref{Dclip}&
+ Applies a clipping path to a picture\\\hline
+\pl\tt \verb|cutdraw|& \pageref{Dctdraw}&
+ Draw with butt end caps\\\hline
+\pl\tt \verb|draw|& \pageref{curves}&
+ Draw a line or a picture\\\hline
+\pl\tt \verb|drawarrow|& \pageref{Ddrwarr}&
+ Draw a line with an arrowhead at the end\\\hline
+\pl\tt \verb|drawdblarrow|& \pageref{Ddrwdar}&
+ Draw a line with arrowheads at both ends\\\hline
+\pl\tt \verb|fill|& \pageref{Dfill}&
+ Fill inside a cyclic path\\\hline
+\pl\tt \verb|filldraw|& \pageref{Dfildrw}&
+ Draw a cyclic path and fill inside it\\\hline
+\tt \verb|interim|& \pageref{Dinterm}&
+ Make a local change to an internal variable\\\hline
+\tt \verb|let|& --&
+ Assign one symbolic token the meaning of another\\\hline
+\pl\tt \verb|loggingall|& \pageref{Dlogall}&
+ Turn on all tracing (log file only)\\\hline
+\tt \verb|newinternal|& \pageref{Dnewint}&
+ Declare new internal variables\\\hline
+\pl\tt \verb|pickup|& \pageref{Dpickup}&
+ Specify new pen for line drawing\\\hline
+\tt \verb|save|& \pageref{Dsave}&
+ Make variables local\\\hline
+\tt \verb|setbounds|& \pageref{Dsetbnd}&
+ Make a picture lie about its bounding box\\\hline
+\tt \verb|shipout|& \pageref{Dship}&
+ Low-level command to output a figure\\\hline
+\tt \verb|show|& \pageref{Dshow}&
+ print out expressions symbolically\\\hline
+\tt \verb|showdependencies|& \pageref{Dshdep}&
+ print out all unsolved equations\\\hline
+\tt \verb|showtoken|& \pageref{Dshtok}&
+ print an explanation of what a token is\\\hline
+\tt \verb|showvariable|& \pageref{Dshvar}&
+ print variables symbolically\\\hline
+\tt \verb|special|& \pageref{Dspecl}&
+ print a string directly in the PostScript output file\\\hline
+\pl\tt \verb|tracingall|& \pageref{Dtall}&
+ Turn on all tracing\\\hline
+\pl\tt \verb|tracingnone|& \pageref{Dtnone}&
+ Turn off all tracing\\\hline
+\pl\tt \verb|undraw|& \pageref{Dundraw}&
+ Erase a line or a picture\\\hline
+\pl\tt \verb|unfill|& \pageref{Dunfill}&
+ Erase inside a cyclic path\\\hline
+\pl\tt \verb|unfilldraw|& \pageref{Dunfdrw}&
+ Erase a cyclic path and its inside\\\hline
+\end{tabular}
+$$
+\index{let?\texttt{let}}%
+\label{cmdtab}
+\end{table}
+
+\begin{table}[htp]
+\caption{Function-Like Macros}
+$$\begin{tabular}{|l|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Arguments}&
+ \multicolumn1{|c}{Result}& \multicolumn1{|c}{Page}&
+ \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\bx\tt \verb|boxit|& suffix, picture& --& \pageref{Dboxit}&
+ Define a box containing the picture\\\hline
+\bx\tt \verb|boxit|& suffix, string& --& \pageref{Dsboxit}&
+ Define a box containing text\\\hline
+\bx\tt \verb|boxit|& suffix, \tdescr{empty}& --& \pageref{Deboxit}&
+ Define an empty box\\\hline
+\bx\tt \verb|boxjoin|& equations& --& \pageref{Dbxjoin}&
+ Give equations for connecting boxes\\\hline
+\bx\tt \verb|bpath|& suffix& path& \pageref{Dbpath}&
+ A box's bounding circle or rectangle\\\hline
+\pl\tt \verb|buildcycle|& list of paths& path& \pageref{buildcy}&
+ Build a cyclic path\\\hline
+\bx\tt \verb|circleit|& suffix, picture& --& \pageref{Dcircit}&
+ Put picture in a circular box\\\hline
+\bx\tt \verb|circleit|& suffix, picture& --& \pageref{Dcircit}&
+ Put a string in a circular box\\\hline
+\bx\tt \verb|circleit|& suffix, \tdescr{empty}& --& \pageref{Dcircit}&
+ Define an empty circular box\\\hline
+\pl\tt \verb|dashpattern|& on/off distances& picture& \pageref{Ddshpat}&
+ Create a pattern for dashed lines\\\hline
+\pl\tt \verb|decr|& numeric variable& numeric& \pageref{Dincr}&
+ Decrement and return new value\\\hline
+\pl\tt \verb|dotlabel|& suffix, picture, pair& --& \pageref{Ddotlab}&
+ Mark point and draw picture nearby\\\hline
+\pl\tt \verb|dotlabel|& suffix, string, pair& --& \pageref{Ddotlab}&
+ Mark point and place text nearby\\\hline
+\pl\tt \verb|dotlabels|& suffix, point numbers& --& \pageref{Ddotlbs}&
+ Mark {\tt z} points with their numbers\\\hline
+\bx\tt \verb|drawboxed|& list of suffixes& --& \pageref{Ddrbxed}&
+ Draw the named boxes and their\\
+& & & &
+ contents\\\hline
+\bx\tt \verb|drawboxes|& list of suffixes& --& \pageref{Ddrbxes}&
+ Draw the named boxes\\\hline
+\pl\tt \verb|drawoptions|& drawing options& --& \pageref{Ddropts}&
+ Set options for drawing commands\\\hline
+\bx\tt \verb|drawunboxed|& list of suffixes& --& \pageref{Ddrunbx}&
+ Draw contents of named boxes\\\hline
+\bx\tt \verb|fixpos|& list of suffixes& --& \pageref{Dfixpos}&
+ Solve for the size and position of the\\
+& & & &
+ named boxes\\\hline
+\bx\tt \verb|fixsize|& list of suffixes& --& \pageref{Dfixsiz}&
+ Solve for size of named boxes\\\hline
+\pl\tt \verb|incr|& numeric variable& numeric& \pageref{Dincr}&
+ Increment and return new value\\\hline
+\pl\tt \verb|label|& suffix, picture, pair& --& \pageref{Dlabel}&
+ Draw picture near given point\\\hline
+\pl\tt \verb|label|& suffix, string, pair& --& \pageref{Dlabel}&
+ Place text near given point\\\hline
+\pl\tt \verb|labels|& suffix, point numbers& --& \pageref{Dlabels}&
+ Draw {\tt z} point numbers; no dots\\\hline
+\pl\tt \verb|max|& list of numerics& numeric& --&
+ Find the maximum\\\hline
+\pl\tt \verb|max|& list of strings& string& --&
+ Find the lexicographically last string\\\hline
+\pl\tt \verb|min|& list of numerics& numeric& --&
+ Find the minimum\\\hline
+\pl\tt \verb|min|& list of strings& string& --&
+ Find the lexicographically first string\\\hline
+\bx\tt \verb|pic|& suffix& picture& \pageref{Dpic}&
+ Box contents shifted into position\\\hline
+\pl\tt \verb|thelabel|& suffix, picture, pair& picture& \pageref{Dthelab}&
+ Picture shifted as if to label a point\\\hline
+\pl\tt \verb|thelabel|& suffix, string, pair& picture& \pageref{Dthelab}&
+ text positioned as if to label a point\\\hline
+\pl\tt \verb|z|& suffix& pair& \pageref{Dzconv}&
+ The pair ${\tt x}\descr{suffix},{\tt y}\descr{suffix})$\\\hline
+\end{tabular}
+$$
+\index{min?\texttt{min}}\index{max?\texttt{max}}%
+\label{pseudotab}
+\end{table}
+
+\clearpage
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{atom} \rightarrow \descr{variable} \;|\; \descr{argument}$\\
+$\tt \qquad \;|\; \descr{number or fraction}$\\
+$\tt \qquad \;|\; \descr{internal variable}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; begingroup \descr{statement list} \descr{expression} endgroup$\\
+$\tt \qquad \;|\; \descr{nullary op}$\\
+$\tt \qquad \;|\; btex \descr{typesetting commands} etex$\\
+$\tt \qquad \;|\; \descr{pseudo function}$\\
+$\tt \descr{primary} \rightarrow \descr{atom}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{numeric expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{numeric expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \descr{of operator} \descr{expression} of \descr{primary}$\\
+$\tt \qquad \;|\; \descr{unary op} \descr{primary}$\\
+$\tt \qquad \;|\; str \descr{suffix}$\\
+$\tt \qquad \;|\; z \descr{suffix}$\\
+$\tt \qquad \;|\; \descr{numeric atom}\hbox{\tt [}\descr{expression}\hbox{\tt ,}\descr{expression}\hbox{\tt ]}$\\
+$\tt \qquad \;|\; \descr{scalar multiplication op} \descr{primary}$\\
+$\tt \descr{secondary} \rightarrow \descr{primary}$\\
+$\tt \qquad \;|\; \descr{secondary} \descr{primary binop} \descr{primary}$\\
+$\tt \qquad \;|\; \descr{secondary} \descr{transformer}$\\
+$\tt \descr{tertiary} \rightarrow \descr{secondary}$\\
+$\tt \qquad \;|\; \descr{tertiary} \descr{secondary binop} \descr{secondary}$\\
+$\tt \descr{subexpression} \rightarrow \descr{tertiary}$\\
+$\tt \qquad \;|\; \descr{path expression} \descr{path join} \descr{path knot}$\\
+$\tt \descr{expression} \rightarrow \descr{subexpression}$\\
+$\tt \qquad \;|\; \descr{expression} \descr{tertiary binop} \descr{tertiary}$\\
+$\tt \qquad \;|\; \descr{path subexpression} \descr{direction specifier}$\\
+$\tt \qquad \;|\; \descr{path subexpression} \descr{path join} cycle$\\
+$\tt $\\
+$\tt \descr{path knot} \rightarrow \descr{tertiary}$\\
+$\tt \descr{path join} \rightarrow --$\\
+$\tt \qquad \;|\; \descr{direction specifier} \descr{basic path join} \descr{direction specifier}$\\
+$\tt \descr{direction specifier} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \char`\{curl \descr{numeric expression}\char`\}$\\
+$\tt \qquad \;|\; \char`\{\descr{pair expression}\char`\}$\\
+$\tt \qquad \;|\; \char`\{\descr{numeric expression}\hbox{\tt ,}\descr{numeric expression}\char`\}$\\
+$\tt \descr{basic path join} \rightarrow \hbox{\tt ..} \;|\; \hbox{\tt ...} \;|\; \hbox{\tt ..}\descr{tension}\hbox{\tt ..} \;|\; \hbox{\tt ..}\descr{controls}\hbox{\tt ..}$\\
+$\tt \descr{tension} \rightarrow tension \descr{numeric primary}$\\
+$\tt \qquad \;|\; tension \descr{numeric primary} and \descr{numeric primary}$\\
+$\tt \descr{controls} \rightarrow controls \descr{pair primary}$\\
+$\tt \qquad \;|\; controls \descr{pair primary} and \descr{pair primary}$\\
+$\tt $\\
+$\tt \descr{argument} \rightarrow \descr{symbolic token}$\\
+$\tt \descr{number or fraction} \rightarrow \descr{number}\hbox{\tt /}\descr{number}$\\
+$\tt \qquad \;|\; \descr{number not followed by `\hbox{\tt /}\tdescr{number}'}$\\
+$\tt \descr{scalar multiplication op} \rightarrow + \;|\; -$\\
+$\tt \qquad \;|\; \descr{`\tdescr{number or fraction}' not followed by `\tdescr{add op}\tdescr{number}'}$
+\end{ctabbing}
+\caption{Part 1 of the syntax for expressions}
+\index{expression?\tdescr{expression}}\index{nullary op?\tdescr{nullary op}}\index{of operator?\tdescr{of operator}}%
+\index{path knot?\tdescr{path knot}}\index{primary?\tdescr{primary}}\index{primary binop?\tdescr{primary binop}}%
+\index{secondary?\tdescr{secondary}}\index{secondary binop?\tdescr{secondary binop}}\index{suffix?\tdescr{suffix}}%
+\index{tertiary?\tdescr{tertiary}}\index{tertiary binop?\tdescr{tertiary binop}}\index{unary op?\tdescr{unary op}}%
+\label{syexpr1}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{transformer} \rightarrow rotated \descr{numeric primary}$\\
+$\tt \qquad \;|\; scaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; shifted \descr{pair primary}$\\
+$\tt \qquad \;|\; slanted \descr{numeric primary}$\\
+$\tt \qquad \;|\; transformed \descr{transform primary}$\\
+$\tt \qquad \;|\; xscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; yscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; zscaled \descr{pair primary}$\\
+$\tt \qquad \;|\; reflectedabout\hbox{\tt (}\descr{pair expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; rotatedaround\hbox{\tt (}\descr{pair expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt )}$\\
+$\tt $\\
+$\tt \descr{nullary op} \rightarrow false \;|\; normaldeviate \;|\; nullpicture \;|\; pencircle$\\
+$\tt \qquad \;|\; true \;|\; whatever$\\
+$\tt \descr{unary op} \rightarrow \descr{type}$\\
+$\tt \qquad \;|\; abs \;|\; angle \;|\; arclength \;|\; ASCII \;|\; bbox \;|\; bluepart \;|\; bot \;|\; ceiling$\\
+$\tt \qquad \;|\; center \;|\; char \;|\; cosd \;|\; cycle \;|\; decimal \;|\; dir \;|\; floor \;|\; fontsize$\\
+$\tt \qquad \;|\; greenpart \;|\; hex \;|\; inverse \;|\; known \;|\; length \;|\; lft \;|\; llcorner$\\
+$\tt \qquad \;|\; lrcorner\;|\; makepath \;|\; makepen \;|\; mexp \;|\; mlog \;|\; not \;|\; oct \;|\; odd$\\
+$\tt \qquad \;|\; redpart \;|\; reverse \;|\; round \;|\; rt \;|\; sind \;|\; sqrt \;|\; top \;|\; ulcorner$\\
+$\tt \qquad \;|\; uniformdeviate \;|\; unitvector \;|\; unknown \;|\; urcorner \;|\; xpart \;|\; xxpart$\\
+$\tt \qquad \;|\; xypart \;|\; ypart \;|\; yxpart \;|\; yypart$\\
+$\tt \descr{type} \rightarrow boolean \;|\; color \;|\; numeric \;|\; pair$\\
+$\tt \qquad \;|\; path \;|\; pen \;|\; picture \;|\; string \;|\; transform$\\
+$\tt \descr{primary binop} \rightarrow \hbox{\tt *} \;|\; \hbox{\tt /} \;|\; \hbox{\tt **} \;|\; and$\\
+$\tt \qquad \;|\; dotprod \;|\; div \;|\; infont \;|\; mod$\\
+$\tt \descr{secondary binop} \rightarrow + \;|\; - \;|\; ++ \;|\; +-+ \;|\; or$\\
+$\tt \qquad \;|\; intersectionpoint \;|\; intersectiontimes$\\
+$\tt \descr{tertiary binop} \rightarrow \hbox{\tt \&} \;|\; \hbox{\verb|<|} \;|\; \hbox{\verb|<=|} \;|\; \hbox{\verb|<>|} \;|\; \hbox{\tt =} \;|\; \hbox{\verb|>|} \;|\; \hbox{\verb|>=|}$\\
+$\tt \qquad \;|\; cutafter \;|\; cutbefore$\\
+$\tt \descr{of operator} \rightarrow arctime \;|\; direction \;|\; directiontime \;|\; directionpoint$\\
+$\tt \qquad \;|\; penoffset \;|\; point \;|\; postcontrol \;|\; precontrol \;|\; subpath$\\
+$\tt \qquad \;|\; substring$\\
+$\tt $\\
+$\tt \descr{variable} \rightarrow \descr{tag}\descr{suffix}$\\
+$\tt \descr{suffix} \rightarrow \descr{empty} \;|\; \descr{suffix}\descr{subscript} \;|\; \descr{suffix}\descr{tag}$\\
+$\tt \qquad \;|\; \descr{suffix parameter}$\\
+$\tt \descr{subscript} \rightarrow \descr{number} \;|\; \hbox{\tt [}\descr{numeric expression}\hbox{\tt ]}$\\
+$\tt $\\
+$\tt \descr{internal variable} \rightarrow ahangle \;|\; ahlength \;|\; bboxmargin$\\
+$\tt \qquad \;|\; charcode \;|\; day \;|\; defaultpen \;|\; defaultscale \;|\; labeloffset$\\
+$\tt \qquad \;|\; linecap \;|\; linejoin \;|\; miterlimit \;|\; month \;|\; pausing$\\
+$\tt \qquad \;|\; prologues \;|\; showstopping \;|\; time \;|\; tracingoutput$\\
+$\tt \qquad \;|\; tracingcapsules \;|\; tracingchoices \;|\; tracingcommands$\\
+$\tt \qquad \;|\; tracingequations \;|\; tracinglostchars \;|\; tracingmacros$\\
+$\tt \qquad \;|\; tracingonline \;|\; tracingrestores \;|\; tracingspecs$\\
+$\tt \qquad \;|\; tracingstats \;|\; tracingtitles \;|\; truecorners$\\
+$\tt \qquad \;|\; warningcheck \;|\; year$\\
+$\tt \qquad \;|\; \descr{symbolic token defined by {\tt newinternal}}$
+\end{ctabbing}
+\caption{Part 2 of the syntax for expressions}
+\index{nullary op?\tdescr{nullary op}}\index{of operator?\tdescr{of operator}}\index{primary binop?\tdescr{primary binop}}%
+\index{secondary binop?\tdescr{secondary binop}}\index{subscript?\tdescr{subscript}}\index{suffix?\tdescr{suffix}}%
+\index{tertiary binop?\tdescr{tertiary binop}}\index{unary op?\tdescr{unary op}}%
+\label{syexpr2}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{pseudo function} \rightarrow min\hbox{\tt (}\descr{expression list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; max\hbox{\tt (}\descr{expression list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; incr\hbox{\tt (}\descr{numeric variable}\hbox{\tt )}$\\
+$\tt \qquad \;|\; decr\hbox{\tt (}\descr{numeric variable}\hbox{\tt )}$\\
+$\tt \qquad \;|\; dashpattern\hbox{\tt (}\descr{on\hbox{\tt /}off list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; interpath\hbox{\tt (}\descr{numeric expression}\hbox{\tt ,} \descr{path expression}\hbox{\tt ,} \descr{path expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; buildcycle\hbox{\tt (}\descr{path expression list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; thelabel\descr{label suffix}\hbox{\tt (}\descr{expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \descr{path expression list} \rightarrow \descr{path expression}$\\
+$\tt \qquad \;|\; \descr{path expression list}\hbox{\tt ,} \descr{path expression}$\\
+$\tt \descr{on\hbox{\tt /}off list} \rightarrow \descr{on\hbox{\tt /}off list}\descr{on\hbox{\tt /}off clause} \;|\; \descr{on\hbox{\tt /}off clause}$\\
+$\tt \descr{on\hbox{\tt /}off clause} \rightarrow on \descr{numeric tertiary} \;|\; off \descr{numeric tertiary}$
+\end{ctabbing}
+\caption{The syntax for function-like macros}
+\index{label suffix?\tdescr{label suffix}}%
+\label{sypseudo}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{boolean expression} \rightarrow \descr{expression}$\\
+$\tt \descr{color expression} \rightarrow \descr{expression}$\\
+$\tt \descr{numeric atom} \rightarrow \descr{atom}$\\
+$\tt \descr{numeric expression} \rightarrow \descr{expression}$\\
+$\tt \descr{numeric primary} \rightarrow \descr{primary}$\\
+$\tt \descr{numeric tertiary} \rightarrow \descr{tertiary}$\\
+$\tt \descr{numeric variable} \rightarrow \descr{variable} \;|\; \descr{internal variable}$\\
+$\tt \descr{pair expression} \rightarrow \descr{expression}$\\
+$\tt \descr{pair primary} \rightarrow \descr{primary}$\\
+$\tt \descr{path expression} \rightarrow \descr{expression}$\\
+$\tt \descr{path subexpression} \rightarrow \descr{subexpression}$\\
+$\tt \descr{pen expression} \rightarrow \descr{expression}$\\
+$\tt \descr{picture expression} \rightarrow \descr{expression}$\\
+$\tt \descr{picture variable} \rightarrow \descr{variable}$\\
+$\tt \descr{string expression} \rightarrow \descr{expression}$\\
+$\tt \descr{suffix parameter} \rightarrow \descr{parameter}$\\
+$\tt \descr{transform primary} \rightarrow \descr{primary}$
+\end{ctabbing}
+\caption{Miscellaneous productions needed to complete the BNF}
+\label{sytypexpr}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{program} \rightarrow \descr{statement list} end$\\
+$\tt \descr{statement list} \rightarrow \descr{empty} \;|\; \descr{statement list} \hbox{\tt ;} \descr{statement}$\\
+$\tt \descr{statement} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{equation} \;|\; \descr{assignment}$\\
+$\tt \qquad \;|\; \descr{declaration} \;|\; \descr{macro definition}$\\
+$\tt \qquad \;|\; \descr{compound} \;|\; \descr{pseudo procedure}$\\
+$\tt \qquad \;|\; \descr{command}$\\
+$\tt \descr{compound} \rightarrow begingroup \descr{statement list} endgroup$\\
+$\tt \qquad \;|\; beginfig\hbox{\tt (}\descr{numeric expression}\hbox{\tt );} \descr{statement list}\hbox{\tt ;} endfig$\\
+$\tt $\\
+$\tt \descr{equation} \rightarrow \descr{expression} \hbox{\tt =} \descr{right-hand side}$\\
+$\tt \descr{assignment} \rightarrow \descr{variable} \hbox{\tt :=} \descr{right-hand side}$\\
+$\tt \qquad \;|\; \descr{internal variable} \hbox{\tt :=} \descr{right-hand side}$\\
+$\tt \descr{right-hand side} \rightarrow \descr{expression} \;|\; \descr{equation} \;|\; \descr{assignment}$\\
+$\tt $\\
+$\tt \descr{declaration} \rightarrow \descr{type} \descr{declaration list}$\\
+$\tt \descr{declaration list} \rightarrow \descr{generic variable}$\\
+$\tt \qquad \;|\; \descr{declaration list}\hbox{\tt ,} \descr{generic variable}$\\
+$\tt \descr{generic variable} \rightarrow \descr{symbolic token} \descr{generic suffix}$\\
+$\tt \descr{generic suffix} \rightarrow \descr{empty} \;|\; \descr{generic suffix} \descr{tag}$\\
+$\tt \qquad \;|\; \descr{generic suffix} \hbox{\tt []}$\\
+$\tt $\\
+$\tt \descr{macro definition} \rightarrow \descr{macro heading} \hbox{\tt =} \descr{replacement text} enddef$\\
+$\tt \descr{macro heading} \rightarrow def \descr{symbolic token} \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef \descr{generic variable} \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef \descr{generic variable} \hbox{\verb|@#|} \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; \descr{binary def} \descr{parameter} \descr{symbolic token} \descr{parameter}$\\
+$\tt \descr{delimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{delimited part}\hbox{\tt (}\descr{parameter type} \descr{parameter tokens}\hbox{\tt )}$\\
+$\tt \descr{parameter type} \rightarrow expr \;|\; suffix \;|\; text$\\
+$\tt \descr{parameter tokens} \rightarrow \descr{parameter} \;|\; \descr{parameter tokens}\hbox{\tt ,} \descr{parameter}$\\
+$\tt \descr{parameter} \rightarrow \descr{symbolic token}$\\
+$\tt \descr{undelimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{parameter type} \descr{parameter}$\\
+$\tt \qquad \;|\; \descr{precedence level} \descr{parameter}$\\
+$\tt \qquad \;|\; expr \descr{parameter} of \descr{parameter}$\\
+$\tt \descr{precedence level} \rightarrow primary \;|\; secondary \;|\; tertiary$\\
+$\tt \descr{binary def} \rightarrow primarydef \;|\; secondarydef \;|\; tertiarydef$\\
+$\tt $\\
+$\tt \descr{pseudo procedure} \rightarrow drawoptions\hbox{\tt (}\descr{option list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; label\descr{label suffix}\hbox{\tt (}\descr{expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; dotlabel\descr{label suffix}\hbox{\tt (}\descr{expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; labels\descr{label suffix}\hbox{\tt (}\descr{point number list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; dotlabels\descr{label suffix}\hbox{\tt (}\descr{point number list}\hbox{\tt )}$\\
+$\tt \descr{point number list} \rightarrow \descr{suffix} \;|\; \descr{point number list}\hbox{\tt ,} \descr{suffix}$\\
+$\tt \descr{label suffix} \rightarrow \descr{empty} \;|\; lft \;|\; rt \;|\; top \;|\; bot \;|\; ulft \;|\; urt \;|\; llft \;|\; lrt$
+\end{ctabbing}
+\caption{Overall syntax for MetaPost programs}
+\index{generic variable?\tdescr{generic variable}}\index{label suffix?\tdescr{label suffix}}\index{replacement text?\tdescr{replacement text}}%
+\index{suffix?\tdescr{suffix}}%
+\label{syprog}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{command} \rightarrow clip \descr{picture variable} to \descr{path expression}$\\
+$\tt \qquad \;|\; interim \descr{internal variable} \hbox{\tt :=} \descr{right-hand side}$\\
+$\tt \qquad \;|\; let \descr{symbolic token} \hbox{\tt =} \descr{symbolic token}$\\
+$\tt \qquad \;|\; newinternal \descr{symbolic token list}$\\
+$\tt \qquad \;|\; pickup \descr{expression}$\\
+$\tt \qquad \;|\; randomseed \hbox{\tt :=} \descr{numeric expression}$\\
+$\tt \qquad \;|\; save \descr{symbolic token list}$\\
+$\tt \qquad \;|\; setbounds \descr{picture variable} to \descr{path expression}$\\
+$\tt \qquad \;|\; shipout \descr{picture expression}$\\
+$\tt \qquad \;|\; special \descr{string expression}$\\
+$\tt \qquad \;|\; \descr{addto command}$\\
+$\tt \qquad \;|\; \descr{drawing command}$\\
+$\tt \qquad \;|\; \descr{font metric command}$\\
+$\tt \qquad \;|\; \descr{show command}$\\
+$\tt \qquad \;|\; \descr{tracing command}$\\
+$\tt $\\
+$\tt \descr{show command} \rightarrow show \descr{expression list}$\\
+$\tt \qquad \;|\; showvariable \descr{symbolic token list}$\\
+$\tt \qquad \;|\; showtoken \descr{symbolic token list}$\\
+$\tt \qquad \;|\; showdependencies$\\
+$\tt $\\
+$\tt \descr{symbolic token list} \rightarrow \descr{symbolic token}$\\
+$\tt \qquad \;|\; \descr{symbolic token}\hbox{\tt ,} \descr{symbolic token list}$\\
+$\tt \descr{expression list} \rightarrow \descr{expression} \;|\; \descr{expression list}\hbox{\tt ,} \descr{expression}$\\
+$\tt $\\
+$\tt \descr{addto command} \rightarrow$\\
+$\tt \qquad addto \descr{picture variable} also \descr{picture expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{picture variable} contour \descr{path expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{picture variable} doublepath \descr{path expression} \descr{option list}$\\
+$\tt \descr{option list} \rightarrow \descr{empty} \;|\; \descr{drawing option} \descr{option list}$\\
+$\tt \descr{drawing option} \rightarrow withcolor \descr{color expression}$\\
+$\tt \qquad \;|\; withpen \descr{pen expression} \;|\; dashed \descr{picture expression}$\\
+$\tt $\\
+$\tt \descr{drawing command} \rightarrow draw \descr{picture expression} \descr{option list}$\\
+$\tt \qquad \;|\; \descr{fill type} \descr{path expression} \descr{option list}$\\
+$\tt \descr{fill type} \rightarrow fill \;|\; draw \;|\; filldraw \;|\; unfill \;|\; undraw \;|\; unfilldraw$\\
+$\tt \qquad \;|\; drawarrow \;|\; drawdblarrow \;|\; cutdraw$\\
+$\tt $\\
+$\tt \descr{tracing command} \rightarrow tracingall \;|\; loggingall \;|\; tracingnone$
+\end{ctabbing}
+\caption{The syntax for commands}
+\index{option list?\tdescr{option list}}\index{picture variable?\tdescr{picture variable}}%
+\label{sycmds}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{if test} \rightarrow if \descr{boolean expression} \hbox{\tt :} \descr{balanced tokens} \descr{alternatives} fi$\\
+$\tt \descr{alternatives} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; else\hbox{\tt :} \descr{balanced tokens}$\\
+$\tt \qquad \;|\; elseif \descr{boolean expression} \hbox{\tt :} \descr{balanced tokens} \descr{alternatives}$\\
+$\tt $\\
+$\tt \descr{loop} \rightarrow \descr{loop header}\hbox{\tt :} \descr{loop text} endfor$\\
+$\tt \descr{loop header} \rightarrow for \descr{symbolic token} \hbox{\tt =} \descr{progression}$\\
+$\tt \qquad \;|\; for \descr{symbolic token} \hbox{\tt =} \descr{for list}$\\
+$\tt \qquad \;|\; forsuffixes \descr{symbolic token} \hbox{\tt =} \descr{suffix list}$\\
+$\tt \qquad \;|\; forever$\\
+$\tt \descr{progression} \rightarrow \descr{numeric expression} upto \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{numeric expression} downto \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{numeric expression} step \descr{numeric expression} until \descr{numeric expression} $\\
+$\tt \descr{for list} \rightarrow \descr{expression} \;|\; \descr{for list}\hbox{\tt ,} \descr{expression}$\\
+$\tt \descr{suffix list} \rightarrow \descr{suffix} \;|\; \descr{suffix list}\hbox{\tt ,} \descr{suffix}$
+\end{ctabbing}
+\caption{The syntax for conditionals and loops}
+\index{balanced tokens?\tdescr{balanced tokens}}\index{suffix?\tdescr{suffix}}%
+\label{sycondloop}
+\end{figure}
+
+\clearpage
+
+\let\topfraction=\svtopfrac % restore values from the start of this appendix
+\let\textfraction=\svtxtfrac
+\setcounter{topnumber}{\value{svtopnum}}
+\setcounter{totalnumber}{\value{svtotnum}}
+
+
+\section{MetaPost Versus METAFONT}
+\label{MPvsMF}
+
+Since the \MF\index{metafont?\MF} and MetaPost languages have so much in common, expert
+users of \MF\ will want to skip most of the explanations in this document and
+concentrate on concepts that are unique to MetaPost. The comparisons in this
+appendix are intended to help experts that are familiar with {\it The\ \MF book}
+as well as other users that want to benefit from Knuth's more detailed
+explanations \cite{kn:c}.
+
+Since \MF\ is intended for making \TeX\ fonts, it has a number of primitives for
+generating the {\tt tfm}\index{tfm file?{\tt tfm} file}\index{files!tfm?{\tt tfm}} files that
+\TeX\ needs for character dimensions, spacing information,
+ligatures\index{ligatures} and kerning\index{kerning}. MetaPost can also be
+used for generating fonts, and it also has \MF's primitives for making
+{\tt tfm} files. These are listed in Table~\ref{tfmprim}. Explanations can be
+found in the \MF\ documentation \cite{kn:c,kn:mf3}
+
+\begin{table}[htp]
+$$\begin{tabular}{|l|l|} \hline
+commands& {\tt charlist}, {\tt extensible},
+ {\tt fontdimen}, {\tt headerbyte} \\
+ & {\tt kern}, {\tt ligtable} \\ \hline
+ligtable operators& \verb!::!, \verb!=:!, \verb!=:|!, \verb!=:|>!,
+ \verb!|=:!, \verb!|=:>!, \\
+ & \verb!|=:|!, \verb!|=:|>!, \verb!|=:|>>!,
+ \verb!||:! \\ \hline
+internal variables\index{internal variables}\index{variables!internal}&
+ {\tt boundarychar}, {\tt chardp},
+ {\tt charext}, {\tt charht}, \\
+ & {\tt charic}, {\tt charwd},
+ {\tt designsize}, {\tt fontmaking} \\ \hline
+other operators& {\tt charexists} \\ \hline
+\end{tabular}
+$$
+\caption{MetaPost primitives for making {\tt tfm} files.}
+\label{tfmprim}
+\end{table}
+
+Even though MetaPost has the primitives for generating fonts, many of the
+font-making primitives and internal variables that are part of Plain
+\MF\index{metafont?\MF} are not defined in Plain MetaPost\index{Plain macros}. Instead,
+there is a separate macro package called {\tt mfplain}\index{mfplain?\texttt{mfplain}} that
+defines the macros required to allow MetaPost to process Knuth's Computer Modern
+fonts as shown in Table~\ref{mfponly} \cite{kn:e}.
+To load these macros, put ``\verb|&mfplain|'' before the name of the
+input file. This can be done at the {\tt **} prompt after invoking the MetaPost
+interpreter with no arguments, or on a command line that looks something like
+this:\footnote{Command line syntax is system dependent. Quotes are needed on
+most Unix\reg systems to protect special characters like {\tt\&}.}
+$$ \hbox{\verb|mp '&mfplain' cmr10|} $$
+The analog of a \MF\ command line like
+$$ \hbox{\verb|mf '\mode=lowres; mag=1.2; input cmr10'|} $$
+is
+$$ \hbox{\verb|mp '&mfplain \mode=lowres; mag=1.2; input cmr10'|} $$
+The result is a set of PostScript files, one for each character in the font.
+Some editing would be required in order to merge them into a downloadable Type~3
+PostScript font \cite{ad:red}.
+
+\begin{table}[htp]
+$$
+\renewcommand{\FancyVerbFormatLine}[1]{\hbox{#1}\strut}
+\begin{tabular}{|l|} \hline
+\multicolumn 1{|c|}
+{Defined in the {\tt mfplain} package} \\ \hline
+\begin{verbatim}
+beginchar font_identifier
+blacker font_normal_shrink
+capsule_def font_normal_space
+change_width font_normal_stretch
+define_blacker_pixels font_quad
+define_corrected_pixels font_size
+define_good_x_pixels font_slant
+define_good_y_pixels font_x_height
+define_horizontal_corrected_pixels italcorr
+define_pixels labelfont
+define_whole_blacker_pixels makebox
+define_whole_pixels makegrid
+define_whole_vertical_blacker_pixels maketicks
+define_whole_vertical_pixels mode_def
+endchar mode_setup
+extra_beginchar o_correction
+extra_endchar proofrule
+extra_setup proofrulethickness
+font_coding_scheme rulepen
+font_extra_space smode
+\end{verbatim}
+ \\ \hline
+\multicolumn 1{|c|}
+{Defined as no-ops in the {\tt mfplain} package}\\ \hline
+\begin{verbatim}
+cullit proofoffset
+currenttransform screenchars
+gfcorners screenrule
+grayfont screenstrokes
+hround showit
+imagerules slantfont
+lowres_fix titlefont
+nodisplays unitpixel
+notransforms vround
+openit
+\end{verbatim}
+ \\ \hline
+\end{tabular}
+\renewcommand{\FancyVerbFormatLine}[1]{#1}
+$$
+\caption{Macros and internal variables defined only in the {\tt mfplain} package.}
+\label{mfponly}
+\end{table}
+
+Another limitation of the {\tt mfplain} package is that certain internal
+variables from Plain \MF\index{metafont?\MF} cannot be given reasonable MetaPost
+definitions. These include {\tt displaying}, {\tt currentwindow},
+\verb|screen_rows|, and \verb|screen_cols| which depend on \MF's ability to
+display images on the computer screen. In addition, \verb|pixels_per_inch| is
+irrelevant since MetaPost uses fixed units of PostScript points.
+
+The reason why some macros and
+internal variables\index{internal variables}\index{variables!internal}
+are not meaningful in MetaPost
+is that \MF\ primitive commands {\tt cull}, {\tt display}, {\tt openwindow},
+{\tt numspecial} and {\tt totalweight} are not implemented in MetaPost. Also not
+implemented are a number of internal variables as well as the
+\tdescr{drawing option} {\tt withweight}. Here is a complete listing of the
+internal variables whose primitive meanings in \MF\ do not make sense in MetaPost:
+$$\begin{verbatim}
+autorounding fillin proofing tracingpens xoffset
+chardx granularity smoothing turningcheck yoffset
+chardy hppp tracingedges vppp
+\end{verbatim}
+$$
+
+There is also one \MF\ primitive that has a slightly different meaning in
+MetaPost. Both languages allow statements of the
+form\index{special?\texttt{special}}\label{Dspecl}
+$$ {\tt special}\, \descr{string expression} \hbox{\tt;} $$
+but \MF\ copies the string into its ``generic font'' output file, while
+MetaPost interprets the string as a sequence of PostScript commands that are
+to be placed at the beginning of the next output file.
+
+All the other differences between \MF\ and MetaPost are features found only in
+MetaPost. These are listed in Table~\ref{mponly}. The only commands listed
+in this table that the preceding sections do not discuss are
+\verb|extra_beginfig|\index{extra_beginfig?\texttt{extra\_beginfig}}\label{Dxbfig},
+\verb|extra_endfig|\index{extra_endfig?\texttt{extra\_endfig}}\label{Dxefig}, and {\tt mpxbreak}.
+The first two are strings that contain extra commands to be processed
+by {\tt beginfig}\index{beginfig?\texttt{beginfig}} and {\tt endfig}\index{endfig?\texttt{endfig}}
+just as \verb|extra_beginchar| and \verb|extra_endchar| are processed by
+{\tt beginchar} and {\tt endchar}.
+(The file {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}} uses these features).
+
+The other new feature listed in Table~\ref{mponly} not listed in the index
+is {\tt mpxbreak}\index{mpxbreak?\texttt{mpxbreak}}. This is used to separate blocks of
+translated \TeX\index{TeX?\TeX} or troff\index{troff} commands in
+{\tt mpx}\index{files!mpx?{\tt mpx}} files. It should be of no concern to
+users since {\tt mpx} files are generated automatically.
+
+\begin{table}[htp]
+$$
+\renewcommand{\FancyVerbFormatLine}[1]{\hbox{#1}\strut}
+\begin{tabular}{|l|} \hline
+\multicolumn 1{|c|}
+{MetaPost primitives not found in \MF} \\ \hline
+$\begin{verbatim}
+bluepart infont redpart
+btex linecap setbounds
+clip linejoin tracinglostchars
+color llcorner truecorners
+dashed lrcorner ulcorner
+etex miterlimit urcorner
+fontsize mpxbreak verbatimtex
+greenpart prologues withcolor
+\end{verbatim}
+$ \\ \hline
+\multicolumn 1{|c|}
+{Variables and Macros defined only in Plain MetaPost}\\ \hline
+$\begin{verbatim}
+ahangle cutbefore extra_beginfig
+ahlength cuttings extra_endfig
+background dashpattern green
+bbox defaultfont label
+bboxmargin defaultpen labeloffset
+beginfig defaultscale mitered
+beveled dotlabel red
+black dotlabels rounded
+blue drawarrow squared
+buildcycle drawdblarrow thelabel
+butt drawoptions white
+center endfig
+cutafter evenly
+\end{verbatim}
+$ \\ \hline
+\end{tabular}
+\renewcommand{\FancyVerbFormatLine}[1]{#1}
+$$
+\caption{Macros and internal variables defined in MetaPost but not \MF.}
+\label{mponly}
+\end{table}
+
+
+
+
+\bibliographystyle{plain}
+\bibliography{mpman}
+
+
+\printindex
+
+
+\end{document}
+
+% Copyright 1990 - 1995 by AT&T Bell Laboratories.
+
+% Permission to use, copy, modify, and distribute this software
+% and its documentation for any purpose and without fee is hereby
+% granted, provided that the above copyright notice appear in all
+% copies and that both that the copyright notice and this
+% permission notice and warranty disclaimer appear in supporting
+% documentation, and that the names of AT&T Bell Laboratories or
+% any of its entities not be used in advertising or publicity
+% pertaining to distribution of the software without specific,
+% written prior permission.
+
+% AT&T disclaims all warranties with regard to this software,
+% including all implied warranties of merchantability and fitness.
+% In no event shall AT&T be liable for any special, indirect or
+% consequential damages or any damages whatsoever resulting from
+% loss of use, data or profits, whether in an action of contract,
+% negligence or other tortious action, arising out of or in
+% connection with the use or performance of this software.
+
+% In addition, John Hobby, the original author of MetaPost and this
+% manual, makes the following requests:
+% - I request that it remain clear that I am the author of
+% "A User's Manual for MetaPost" and "Drawing Graphs with MetaPost".
+% - I request to be consulted before significant changes are made.
diff --git a/Master/texmf-dist/doc/metapost/base/source/timepop.d b/Master/texmf-dist/doc/metapost/base/source/timepop.d
new file mode 100644
index 00000000000..2b1555289c2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/base/source/timepop.d
@@ -0,0 +1,21 @@
+1790 3.93
+1800 5.31
+1810 7.24
+1820 9.64
+1830 12.87
+1840 17.07
+1850 23.19
+1860 31.44
+1870 39.82
+1880 50.16
+1890 62.95
+1900 75.99
+1910 91.97
+1920 105.71
+1930 122.78
+1940 131.67
+1950 150.70
+1960 179.32
+1970 203.30
+1980 226.55
+1990 248.71 \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/exteps/LICENSE b/Master/texmf-dist/doc/metapost/exteps/LICENSE
new file mode 100644
index 00000000000..6d45519c8c6
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/exteps/LICENSE
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Master/texmf-dist/doc/metapost/exteps/README b/Master/texmf-dist/doc/metapost/exteps/README
new file mode 100644
index 00000000000..e1f96065426
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/exteps/README
@@ -0,0 +1,5 @@
+exteps is a module for inclusion of external EPS figures into MetaPost
+figures. It is written solely in MetaPost, and whence does not require
+any post processing of the MetaPost output.
+
+Palle Jřrgensen \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/exteps/exteps.pdf b/Master/texmf-dist/doc/metapost/exteps/exteps.pdf
new file mode 100644
index 00000000000..50bdeb3d7bf
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/exteps/exteps.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/README.ctan b/Master/texmf-dist/doc/metapost/featpost/README.ctan
new file mode 100644
index 00000000000..5a7f3e02dd0
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/README.ctan
@@ -0,0 +1,29 @@
+I've uploaded the file
+ featpost.tgz
+to
+ ftp://dante.ctan.org/incoming/
+
+This file contains, among other files and directories:
+
+ -An installation script
+ bashscript/dosome.sh
+
+ -Documentation
+ doc/featpost.sgml
+ doc/tug2004.pdf
+
+ -One set of macros
+ macro/featpost3Dplus2D.mp
+
+ -And lots of example programs in
+ example/
+
+It is meant to replace the actual
+ graphics/metapost/contrib/macros/featpost
+sub-tree. The description of this package is:
+"FeatPost is an extension of the MetaPost language,
+works in two and three dimensions
+and has several features to facilitate
+the production of physics diagrams."
+
+No change was introduced in the licensing: GPL.
diff --git a/Master/texmf-dist/doc/metapost/featpost/README.featpost b/Master/texmf-dist/doc/metapost/featpost/README.featpost
new file mode 100644
index 00000000000..412e68a7f46
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/README.featpost
@@ -0,0 +1,36 @@
+If you've just unpacked FEATPOST it's time to do
+ bashscript/dosome.sh < /dev/null
+You'll see many text lines rolling up your scren,
+some of them containing error messages.
+DON'T PANIC. This will just take quite
+some time and about 80MB of disk space.
+It is supposed that you've got, at least,
+ImageMagick and Linuxdoc installed. Galrey, dog and
+textutils are also in order. All software is available
+as Debian GNU/Linux packages (except FEATPOST).
+Well, this is a bit complicated. The simple way is
+to copy the file
+ macro/featpost3Dplus2D.mp
+to
+ /usr/TeX/texmf-local/metapost/local/
+or
+ /usr/share/texmf/metapost/misc/
+or something appropriate and to do
+ texhash
+
+If you're returning you should remember to do
+ export TEX=latex
+ mpost -mem featpost example/standard/someexamplefile.mp
+ bashscript/laproof someexamplefile N
+ gv someexamplefile.N.eps &
+but, again, if you chose the simple way you must uncomment
+ %input featpost3Dplus2D;
+in someexamplefile.mp
+
+Good luck!
+
+P.S. - The cutting-edge feature is
+ "Automatic Perspective Tuning"
+as processed by the macro "photoreverse".
+If you want to know more about this:
+ nobre@lince.cii.fc.ul.pt
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/dosome.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/dosome.sh
new file mode 100644
index 00000000000..ff908c37ed9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/dosome.sh
@@ -0,0 +1,95 @@
+#! /bin/bash
+# Execute this script with the command
+# bashscript/dosome.sh < /dev/null > dosome.log
+# (from the featpost root directory)
+# Don't worry about the error messages.
+# L. Nobre G.
+# IYP (2005)
+
+export TEX=latex
+mkdir alleps
+mkdir allpng
+mkdir allps
+mkdir ppm
+mkdir galreyimages
+cd macro
+mpost --ini featpost.mp
+cd ..
+ln -s macro/featpost.mem
+ln -s latex/mflogohack.sty
+echo \\documentclass[twocolumn]{article}\
+ \\usepackage[dvips]{epsfig}\
+ \\usepackage{mflogohack}\
+ \\begin{document}\
+ \\title{\\FP\\ Exemplifier}\
+ \\author{L.\\ Nobre G.}\
+ \\maketitle\
+ \\begin{center}\
+ > FeatPostExemplifier.tex
+for a in example/standard/*.mp
+do
+ b=`basename $a .mp`
+ mpost -mem featpost example/standard/$b
+ for c in $b.?
+ do
+ echo \\vfill\
+ \\begin\{tabular\}\{c\}\
+ \\epsfig\{file=$c\,width=0.9\\columnwidth\} \\\\\
+ \\texttt\{$c\}\
+ \\end\{tabular\} \\\\ >> FeatPostExemplifier.tex
+ echo \\documentclass{article}\\usepackage[dvips]{epsfig}\\begin{document}\\pagestyle{empty}\\epsfig{file=$c,width=0.9\\textwidth}\\end{document} > $c.latex
+ latex $c.latex
+ dvips -E -o $c.PS $c.dvi
+ epstopdf --nogs $c.PS > $c.eps
+ gs -q -sDEVICE=png256 -r120 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dCOLORSCREEN -dNOPAUSE -sOutputFile=$c.gs.png $c.eps
+# composite -filter Lanczos -geometry 300x300 -gravity Center $c.gs.png png/borderframetest.png ppm/t_$c.ppm
+ composite -filter Lanczos -geometry 120x120 -gravity Center $c.gs.png png/border140.png ppm/t_$c.ppm
+ done
+ for ((num=0;num<10;num=num+1))
+ do
+ cp $b.$num.gs.png galreyimages/$b$num.png
+ mv ppm/t_$b.$num.ppm ppm/t_$b$num.ppm
+ done
+done
+echo \\end{center}\\end{document} >> FeatPostExemplifier.tex
+latex FeatPostExemplifier.tex
+dvips -o FeatPostExemplifier.ps FeatPostExemplifier.dvi
+bzip2 FeatPostExemplifier.ps
+mv FeatPostExemplifier.ps.bz2 doc/
+rm FeatPostExemplifier.*
+rm mflogohack.sty
+rm *.?.PS *.?.aux *.?.latex *.?.dvi *.log *.?.mgk *.?.orig
+rm example/standard/*.mpx
+mv *.? allps/
+mv *.?.gs.png allpng/
+mv *.?.png nontextualpng/
+mv *.?.eps alleps/
+#animate -delay 125 ppm/* &
+cd doc
+linuxdoc -B html --split=2 --toc=2 featpost.sgml
+linuxdoc -B latex featpost.sgml
+mv featpost.tex ../latex/
+cd ../latex
+latex featpost.tex
+latex featpost.tex
+dvips -o featpost.ps featpost.dvi
+ps2pdf featpost.ps
+mv featpost.ps featpost.pdf ../doc/
+#sed 's/article/ltugboat/' featpost.tex > tugboatMan.tex
+#latex tugboatMan.tex
+#latex tugboatMan.tex
+#dvips -o ../doc/tugboatMan.ps tugboatMan.dvi
+cd ../galrey
+source galrey.sh
+cd ..
+for a in ppm/t_*.ppm
+do
+ convert $a galreyimages/`basename $a ppm`png
+done
+pwd
+
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/eps2j.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/eps2j.sh
new file mode 100755
index 00000000000..4fe6fd4265a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/eps2j.sh
@@ -0,0 +1 @@
+gs -q -sDEVICE=jpeggray -dNOPAUSE -sOutputFile=eps.jpeg $1 </dev/null
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/fpost b/Master/texmf-dist/doc/metapost/featpost/bashscript/fpost
new file mode 100644
index 00000000000..63d3588a4c2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/fpost
@@ -0,0 +1 @@
+mpost -mem featpost example/standard/$1 \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/insertinputcommands.sed b/Master/texmf-dist/doc/metapost/featpost/bashscript/insertinputcommands.sed
new file mode 100644
index 00000000000..6fe8c6ed0c2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/insertinputcommands.sed
@@ -0,0 +1,5 @@
+4i\
+\
+%input featpost3D;\
+%input par3Dplotmacros; % Contributed by J. Schwaiger \
+%input featpost2D;
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/insertinputcommands.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/insertinputcommands.sh
new file mode 100755
index 00000000000..d562871aed7
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/insertinputcommands.sh
@@ -0,0 +1,6 @@
+for a in *.mp; do mv $a `basename $a mp`mpN; done
+for a in *.mpN
+ do sed -f ../bashscript/insertinputcommands.sed $a > `basename $a mpN`mp
+done
+#rm *.mpN
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/laproof b/Master/texmf-dist/doc/metapost/featpost/bashscript/laproof
new file mode 100755
index 00000000000..298e99a382e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/laproof
@@ -0,0 +1,13 @@
+#!/bin/sh
+name=`basename $1 .mp`
+figname=$name.$2
+echo \\documentclass{article}\\usepackage[dvips]{epsfig}\\begin{document}\\pagestyle{empty}\\epsfig{file=$figname}\\end{document} > $figname.latex
+latex $figname.latex
+dvips -Pcmz -Pamz -E -o $figname.eps $figname.dvi
+# epstopdf -d --nogs $figname.eps > $name.eps
+# Modification of an original by J.M.C.Esteves
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/lbproof b/Master/texmf-dist/doc/metapost/featpost/bashscript/lbproof
new file mode 100755
index 00000000000..491bdb66a83
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/lbproof
@@ -0,0 +1,16 @@
+#!/bin/sh
+name=`basename $1 .mp`
+figname=$name.$2
+#mpost -mem featpost $name
+echo \\documentclass{article}\\usepackage[dvips]{epsfig}\\setlength{\\paperwidth}{8.2in}\\setlength{\\paperheight}{11.2in}\\setlength{\\textwidth}{8in}\\setlength{\\textheight}{11in}\\setlength{\\voffset}{-1in}\\setlength{\\hoffset}{-1in}\\setlength{\\topmargin}{0pt}\\setlength{\\headheight}{0pt}\\setlength{\\headsep}{0pt}\\setlength{\\oddsidemargin}{0pt}\\begin{document}\\pagestyle{empty}\\epsfig{file=$figname,width=\\columnwidth,clip=}\\end{document} > $figname.latex
+latex $figname.latex
+dvips -Pcmz -Pamz -E -o $figname.eps $figname.dvi
+#epstopdf -d --nogs $figname.eps > tmp.eps
+#gs -sDEVICE=jpeggray -dNOPAUSE -sOutputFile=$name.jpeg tmp.eps </dev/null
+#rm -v tmp.eps
+# Modification of an original by J.M.C.Esteves
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/lcproof b/Master/texmf-dist/doc/metapost/featpost/bashscript/lcproof
new file mode 100755
index 00000000000..27ba07313bf
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/lcproof
@@ -0,0 +1,13 @@
+#!/bin/sh
+name=`basename $1 .mp`
+figname=$name.$2
+echo \\documentclass{article}\\usepackage[dvips]{epsfig}\\setlength{\\paperwidth}{8.2in}\\setlength{\\paperheight}{11.2in}\\setlength{\\textwidth}{8in}\\setlength{\\textheight}{11in}\\setlength{\\voffset}{-1in}\\setlength{\\hoffset}{-1in}\\setlength{\\topmargin}{0pt}\\setlength{\\headheight}{0pt}\\setlength{\\headsep}{0pt}\\setlength{\\oddsidemargin}{0pt}\\begin{document}\\pagestyle{empty}\\epsfig{file=$figname,height=\\textheight,clip=}\\end{document} > $figname.latex
+latex $figname.latex
+dvips -Pcmz -Pamz -E -o $figname.eps $figname.dvi
+# epstopdf -d --nogs $figname.eps > $name.eps
+# Modification of an original by J.M.C.Esteves
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/makelogo.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/makelogo.sh
new file mode 100644
index 00000000000..7753995c94e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/makelogo.sh
@@ -0,0 +1,9 @@
+#! /bin/bash
+cd latex
+latex logofeatpost.tex
+dvips -E -o logofeatpost.ps logofeatpost.dvi
+epstopdf -d -nogs logofeatpost.ps > featpost.eps
+gs -q -sDEVICE=png256 -r300x300 -dNOPAUSE -sOutputFile=featpost.png featpost.eps </dev/null
+cp featpost.png featpost2.png
+mogrify -geometry 25% featpost2.png
+cd ..
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/maketugboatart.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/maketugboatart.sh
new file mode 100755
index 00000000000..cb96f1a651a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/maketugboatart.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+cd latex/
+sgml2latex ../doc/macroMan.sgml
+sed 's/article/ltugboat/' macroMan.tex > tugboatMan.tex
+latex tugboatMan.tex
+dvips -o ../doc/tugboatMan.ps tugboatMan.dvi
+rm -v tugboatMan.???
+cd ../ \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/nontextualpng.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/nontextualpng.sh
new file mode 100644
index 00000000000..aa86f2f943c
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/nontextualpng.sh
@@ -0,0 +1,10 @@
+#! /bin/bash
+# L. Nobre G.
+# IYP (2005)
+
+mkdir nontextualpng
+for a in allps/*
+do
+ convert -bordercolor white -border 20x20 -transparent white \
+ -format png $a nontextualpng/`basename $a`.png
+done
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/procedurenames.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/procedurenames.sh
new file mode 100755
index 00000000000..82629e1415b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/procedurenames.sh
@@ -0,0 +1,8 @@
+#! /bin/bash
+sed -n '/ def /p' macro/la3Dmacros.mp > la3Ddef.txt
+sed -n '/ vardef /p' macro/hlr3Dmacros.mp > hlr3Dvardef.txt
+sed -n '/ def /p' macro/hlr3Dmacros.mp > hlr3Ddef.txt
+cat la3Ddef.txt hlr3Dvardef.txt hlr3Ddef.txt > alldef.txt
+rm -v la3Ddef.txt hlr3Dvardef.txt hlr3Ddef.txt
+# there are two "vardefined" procedures:
+# makeline@# and makeface@#
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/remfi.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/remfi.sh
new file mode 100644
index 00000000000..cb37397d06b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/remfi.sh
@@ -0,0 +1,32 @@
+#! /bin/bash
+# remfi.sh
+# L. Nobre G.
+# IYP (2005)
+rm -fR alleps allpng allps ppm galreyimages
+rm macro/*~ example/standard/*.mpx example/standard/*~
+rm doc/*~ bashscript/*~ latex/*~ *~
+rm latex/featpost.*
+rm latex/tugboatMan.*
+rm latex/macroMan.dvi
+rm latex/macroMan.log
+rm latex/macroMan.aux
+rm doc/featpost.ps
+rm doc/featpost.pdf
+rm doc/featpost.html
+rm doc/featpost-*.html
+rm doc/tugboatMan.ps
+rm galrey/galrey.fn
+rm galrey/galrey.ls
+rm galrey/galrey.memo
+rm galrey/galrey.nms
+rm *.tex *.aux *.dvi *.log *.latex *.eps *.?
+rm macro/featpost.mem macro/featpost.log
+rm *.?.PS *.?.aux *.?.latex *.?.dvi *.log *.?.mgk *.?.orig
+rm *.?.gs.png *.?.png
+rm featpost.mem
+rm doc/featpost.sgml.flc
+rm macro/featpost3Dplus2D.mp.flc
+rm doc/FeatPostExemplifier.ps.bz2
+rm mflogohack.sty
+cd ..
+tar cvzf down/featpost.tgz featpost/
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/removeinputcommand.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/removeinputcommand.sh
new file mode 100644
index 00000000000..a1d41226431
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/removeinputcommand.sh
@@ -0,0 +1,9 @@
+for a in *; do cp $a $a.NEW; done
+for a in *.NEW
+do
+ b=`basename $a .NEW`
+ sed -e '/%input featpost2D;/d' $a > $b
+# echo $a ----- $b
+done
+rm *.NEW
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/replacetext.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/replacetext.sh
new file mode 100644
index 00000000000..2afdf6f28c4
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/replacetext.sh
@@ -0,0 +1,7 @@
+for a in *; do mv $a `basename $a`.NEW; done
+#for a in *.mp; do mv $a `basename $a mp`mpN; done
+for a in *.NEW
+ do sed -e 's/featpost3D/featpost3Dplus2D/' $a > `basename $a .NEW`
+done
+rm *.NEW
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/bashscript/simpleviewer.sh b/Master/texmf-dist/doc/metapost/featpost/bashscript/simpleviewer.sh
new file mode 100644
index 00000000000..4cef12f11fb
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/bashscript/simpleviewer.sh
@@ -0,0 +1,15 @@
+prefwidth=640
+prefheigh=480
+prefratio=$(( 1000 * $prefwidth / $prefheigh ))
+tmpfilename=`mktemp simpleviewer.XXXXXX`
+epstopdf --nogs $1 > $tmpfilename
+epswidth=`identify $tmpfilename | cut -d " " -f 3 | cut -d x -f 1`
+epsheigh=`identify $tmpfilename | cut -d " " -f 3 | cut -d x -f 2`
+aspectra=$(( 1000 * $epswidth / $epsheigh ))
+if test $aspectra -ge $prefratio
+then resol=$(( 72 * $prefwidth / $epswidth ))
+else resol=$(( 72 * $prefheigh / $epsheigh ))
+fi
+echo " Resolution:" $resol "dpi."
+gs -q -r$resol -sDEVICE=x11 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 $tmpfilename
+rm $tmpfilename \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/doc/doclicense.txt b/Master/texmf-dist/doc/metapost/featpost/doc/doclicense.txt
new file mode 100644
index 00000000000..caacdfcf042
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/doc/doclicense.txt
@@ -0,0 +1,10 @@
+ This document, FEATPOST macros,
+ is copyrighted (c) 2003 by L. Nobre G.
+ Permission is granted to copy, distribute and/or modify
+ this document under the terms of the
+ GNU Free Documentation License, Version 1.1 or any later
+ version
+ published by the Free Software Foundation; with no
+ Invariant Sections, with no Front-Cover Texts, and with
+ no Back-Cover Texts. A copy of the license is available
+ at <url url="http://www.gnu.org/copyleft/fdl.html">.
diff --git a/Master/texmf-dist/doc/metapost/featpost/doc/featexamples.html b/Master/texmf-dist/doc/metapost/featpost/doc/featexamples.html
new file mode 100644
index 00000000000..43d119f304b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/doc/featexamples.html
@@ -0,0 +1,163 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+ <title>FeatPost Examples</title>
+ </head>
+ <body text="#000000" link="#0000ff" vlink="#ff5599" alink="#00ff00"
+ background="../jpeg/mymetapostclearback.jpeg" bgcolor="white">
+ <h1 align="center"><img src="../png/featpost2.png"
+ alt="FeatPost Examples">
+ </h1>
+
+ <p>
+ Most diagrams are done with sort-of-CAD packages. These packages
+ usually hide their language from the user and, probably, draw only
+ planar diagrams. FeatPost is an extension of the
+ <a href="http://cm.bell-labs.com/who/hobby/MetaPost.html">MetaPost</a>
+ language, works in three dimensions and has several features to
+ facilitate the production of physics diagrams. For the production of
+ animations see
+ <a href="http://matagalatlante.org/nobre/aneemate/nodocs/aneematepage.html">aneemate</a>.
+ </p>
+
+ <center>
+ <p>If you do not see any pictures on this page,
+ you may locally run the <a href="../bashscript/dosome.sh">installation
+ script</a> (after downloading) or visit
+ <a href="http://matagalatlante.org/nobre/featpost/doc/featexamples.html">http://matagalatlante.org/nobre/featpost/doc/featexamples.html</a></p>
+ <table>
+ <tbody>
+ <tr>
+ <td align="right" valign="middle">
+ Click on this icon to download:</td>
+ <td><a href="../../down/featpost.tgz">
+ <img src="../png/downloadicon.png" alt="Download Now! ">
+ </a></td>
+ <td align="left" valign="top">
+ <a href="./featpost.html">Online User's
+ Guide.</a><br>
+ <a href="./featpost.pdf">PDF User's
+ Guide.</a><br>
+ <a href="../galreyimages/index.html">Online Examples.</a><br>
+ <a href="./FeatPostExemplifier.ps.bz2">PostScript Examples.</a><br>
+ <a href="http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros/featpost/">CTAN.</a><br>
+ <a href="http://matagalatlante.org/nobre/tug04/bundle/tug04handout.ps.bz2">TUG04 handout.</a>
+ </td>
+ </tr>
+ <tr>
+ <!-- one of (TD TH) -->
+ <td align="center" valign="top">
+
+ </td>
+ <td align="center">
+
+ </td>
+ <td align="center">
+
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ <h4>Thick Lines</h4>
+ <a href="../example/standard/torus.mp">
+ <img src="../nontextualpng/torus.5.png" alt="torus.5.eps">
+ </a>
+ <h4>Vector Fields</h4>
+ <a href="../example/standard/rotatnlc.mp">
+ <img src="../nontextualpng/rotatnlc.1.png" alt="rotatnlc.1.eps">
+ </a>
+ <h4>Volumic Angles and Circles in Space</h4>
+ <a href="../example/standard/anglinerigorouscircle.mp">
+ <img src="../allpng/anglinerigorouscircle.1.gs.png"
+ alt="angline_rigorouscircle.1.eps">
+ </a>
+ <h4>Cones</h4>
+ <a href="../example/standard/rigorouscone.mp">
+ <img src="../nontextualpng/rigorouscone.1.png" alt="rigorouscone.1.eps">
+ </a>
+ <h4>Cylinders and Spherical Distortions</h4>
+ <a href="../example/standard/cylimple.mp">
+ <img src="../nontextualpng/cylimple.1.png" alt="cylimple.1.eps">
+ </a>
+ <h4>Globes</h4>
+ <a href="../example/standard/globe.mp">
+ <img src="../nontextualpng/globe.1.png"
+ alt="globe.1.eps">
+ </a>
+ <h4>Polyhedra</h4>
+ <a href="../example/standard/torus.mp">
+ <img src="../nontextualpng/torus.6.png" alt="torus.6.eps">
+ </a>
+ <h4>Generic Stuff</h4>
+ <a href="../example/standard/stageforthree.mp">
+ <img src="../nontextualpng/stageforthree.2.png"
+ alt="stageforthree.2.eps">
+ </a>
+ <h4>Molecular Structures</h4>
+ <a href="../example/standard/rigorousfearpath.mp">
+ <img src="../nontextualpng/rigorousfearpath.1.png"
+ alt="cubicfacecentered.1.eps">
+ </a>
+ <h4>Surfaces</h4>
+ <a href="../example/standard/triangulartrimesh.mp">
+ <img src="../nontextualpng/triangulartrimesh.1.png"
+ alt="triangulartrimesh.1.eps">
+ </a>
+ <h4>Parametric Surfaces</h4>
+ <p>Kindly contributed by
+ <a href="http://www-ang.kfunigraz.ac.at/~schwaige/">Jens Schwaiger</a>
+ </p>
+ <a href="../example/highmemory/par3Dplotexamples.mp">
+ <img src="../jpeg/par3Dplotexamples1.jpg"
+ alt="par3Dplotexamples.1.eps">
+ </a>
+ <h4>Automatic Perspective Tuning</h4>
+ <a href="../example/standard/photoreverse.mp">
+ <img src="../allpng/photoreverse.1.gs.png"
+ alt="photoreverse.1.eps">
+ </a>
+ <h4>Main Referers</h4>
+ <p>
+ <a href="http://www.tug.org/metapost.html">
+ TUG</a><br>
+ <a href="http://dmoz.org/Computers/Software/Typesetting/TeX/MetaPost/">
+ Open Directory</a><br>
+ <a href="http://www.cs.ucc.ie/~dongen/mpost/links.html">Marc
+ van Dongen</a><br>
+ <a href="http://www-math.univ-poitiers.fr/~phan/m3Dplain.html">
+ Anthony Phan</a><br>
+ <a href="http://asymptote.sourceforge.net/doc/featpost3D.html#featpost3D">
+ Asymptote</a>
+
+
+ </p>
+ </center>
+ <hr size="4">
+ <table>
+ <tbody>
+ <tr>
+ <td>
+ <a href="../../../oldindex.html">
+ <img border="0" src="../png/myicon.png" alt="Home." height="36" width="72">
+ </a>
+ </td>
+ <td align="center" valign="middle">
+ <a href="http://www.xemacs.org">
+ <img align="middle" border="0"
+ src="../jpeg/cbxSmall.jpg"
+ alt="Created by XEmacs."
+ height="36"
+ width="100">
+ </a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <!-- Created: Sun Sep 23 20:33:28 WEST 2001 -->
+ <!-- hhmts start -->
+Last modified: Mon Aug 29 11:22:26 WEST 2005
+<!-- hhmts end --> <br>
+ <br>
+ </body>
+</html>
diff --git a/Master/texmf-dist/doc/metapost/featpost/doc/featpost.1.gz b/Master/texmf-dist/doc/metapost/featpost/doc/featpost.1.gz
new file mode 100644
index 00000000000..a98a55c9d06
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/doc/featpost.1.gz
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/doc/featpost.sgml b/Master/texmf-dist/doc/metapost/featpost/doc/featpost.sgml
new file mode 100644
index 00000000000..5d3ab082321
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/doc/featpost.sgml
@@ -0,0 +1,1623 @@
+<!doctype linuxdoc system>
+<!-- macroMan.sgml
+ L. Nobre G.
+ 2004
+ -->
+<linuxdoc>
+ <article>
+ <titlepag>
+ <title>FEATPOST macros</title>
+ <author>L. Nobre G., <tt>http://matagalatlante.org</tt></name>
+ <date>December 2004</date>
+ <abstract>
+ This document intends to be an explanation of the MetaPost macros
+ defined in the <tt>FEATPOST</tt> package. Its purpose is to draw
+ two or three-dimensional physics diagrams.
+
+ The <tt>FEATPOST</tt> package is supposed to help you draw figures
+ containing 3D dots, vectors, flat arrows, angles, parametric
+ lines, circles, ellipses,
+ cones, cylinders, spheres,
+ globes, hemispheres, toruses,
+ elliptical frusta,
+ polygons, polyhedra, functional and parametric surfaces,
+ direction fields, field lines
+ and trajectories in vector fields,
+ schematic automobiles, electric charges,
+ etc.
+
+ The fact that it is a programming language instead of
+ Computer Aided Design (CAD)
+ helps the user to experiment different
+ figure layouts without changing specified geometric relationships
+ among figure elements.
+
+ Two of the intrinsic MetaPost features which may be important
+ for physics diagrams are: (i) the typesetting power of
+ TeX is easily called when needed and (ii) besides a sufficient
+ number of mathematical operators, geometric relationships may
+ be expressed by linear equations, without explicit assignements.
+ </abstract>
+ </titlepag>
+ <sect>
+ <heading>Introduction</heading>
+ <p>
+ 3D in MetaPost is not a new idea. Denis Roegel
+ contributed related packages to CTAN some years ago. It was the
+ subject of a 1997 TUGboat article (V18, N4, 274-283). Recently
+ he developed <url
+ url="http://www.loria.fr/~roegel/TeX/mousson2005.pdf"
+ name="MP2GL">. Anthony
+ Phan has been developing a very elegant package
+ called <url url="http://www-math.univ-poitiers.fr/~phan/m3Dplain.html" name="m3D">. Due to his skilled coding, <tt>m3D</tt> can
+ handle larger objects and can produce more realistic renderings than
+ <tt>FEATPOST</tt>. Other possibilities include <url
+ url="http://directory.fsf.org/GNU/3DLDF.html" name="GNU
+ 3DLDF">, <url
+ url="http://robert.silve.free.fr/latex/metapost3D/"
+ name="Bob's Info"> or <url
+ url="http://asymptote.sourceforge.net/"
+ name="Asymptote">.
+ In any case we are talking about vector-based abstract diagrams,
+ so the functionality of
+ these packages is nearer to <tt>GNUPLOT</tt> than to <tt>OpenGL</tt>.
+ We could also talk about <tt><url url="http://www.povray.org/" name="POV-ray"></tt> or
+ <tt><url url="http://www.blender3d.org/" name="blender"></tt> but these
+ are focused on ray-traced images, a completely different thing.
+ </p>
+ <p>
+ Regarding software <tt>FEATPOST</tt> requires only MetaPost but
+ recommends <tt>LaTeX, bash, ImageMagick, ghostscript,
+ Linuxdoc, Textutils, dvips, epstopdf, sed, gv, plaympeg, <url url="http://jl.photodex.com/dog/" name="dog">, <url url="http://www.flexer.it/galrey/" name="galrey"></tt> and <tt><url url="http://lince.cii.fc.ul.pt/xcmd/xcmd.html" name="xcmd"></tt>. Also, it is highly beneficial to
+ be able to understand and cope with MetaPost error messages as
+ <tt>FEATPOST</tt> has no protection against mistaken inputs. One
+ probable cause of errors is the use of variables with the name of
+ procedures, like
+ <tscreen><verb>X, Y, Z, N, rp, cb, ps</verb>
+ </tscreen>All other procedure names have six or more characters.
+ </p>
+ <p>
+ The user must be aware that MetaPost has a limited arithmetic power
+ and that the author has limited programming skills,
+ which may lead to unperfect 3D figures, very long processing
+ time or shear bugs.
+ It's advisable not to try very complex diagrams at first
+ and it's recommended to
+ keep 3D coordinates near order 1 (default MetaPost units).
+ </p>
+ <p>
+ All <tt>FEATPOST</tt> macros are build apon the MetaPost
+ <tt>color</tt> variable type. It looks like this:
+ <tscreen><verb>(red,green,blue)</verb>
+ </tscreen>Its components may, nevertheless,
+ be arbtitrary numbers, like:
+ <tscreen><verb>(X,Y,Z)</verb></tscreen>So, the
+ <tt>color</tt> type is adequate to define not only colors but
+ also 3D points and vectors.
+ </p>
+ </sect>
+ <sect>
+ <heading>Small Tutorial</heading>
+ <p>
+ One very minimalistic example program could be:
+ <tscreen><verb>
+beginfig(1);
+ cartaxes(1,1,1);
+endfig;
+end;</verb></tscreen>where <tt>cartaxes</tt> is a
+ <tt>FEATPOST</tt> macro that produces
+ the Cartesian referential.
+ </p>
+ <p>
+ One small example program may be:
+ <tscreen><verb>
+f := 5.4*(1.5,0.5,1);
+Spread := 30;
+beginfig(1);
+ numeric gridstep, sidenumber, i, j, coord, aa, ab, ac;
+ color pa;
+ gridstep = 0.9;
+ sidenumber = 10;
+ coord = 0.5*sidenumber*gridstep;
+ for i=0 upto sidenumber:
+ for j=0 upto sidenumber:
+ pa := (-coord+j*gridstep,-coord+i*gridstep,0);
+ aa := uniformdeviate(360);
+ ab := uniformdeviate(180);
+ ac := uniformdeviate(90);
+ kindofcube( false, false, pa, aa, ab, ac, 0.4, 0.4, 0.9 );
+ endfor;
+ endfor;
+endfig;
+end.</verb></tscreen>where <tt>kindofcube</tt>
+ is a <tt>FEATPOST</tt> macro that produces
+ a rectangular prism (cuboid).
+ </p>
+ <p>
+ <figure>
+ <eps file="../allps/kindofcube.1">
+ <img src="../allpng/kindofcube.1.gs.png">
+ <caption>Example that uses <tt>kindofcube</tt>.</caption>
+ </figure><label id="figkindofcube1">
+ </p>
+ <p>
+ The main variable of any three-dimensional figure is the
+ point of view. <tt>FEATPOST</tt> uses the variable <tt>f</tt>
+ as the point of view. <tt>Spread</tt> is another global
+ variable that controls the size of the projection.
+ </p>
+ <p>
+ Another example may be:
+ <tscreen>
+ <verb>
+f := (13,7,3.5);
+Spread := 35;
+beginfig(1);
+ numeric i, len, wang, reflen, frac, coordg;
+ numeric fws, NumLines, inray, outay;
+ path conepath, cira, cirb, ella, ellb, tuba, tubb, tubc;
+ color axe, aroc, cubevertex, conecenter, conevertex;
+ color allellaxe, ellaaxe, ellbaxe, pca, pea, pcb, peb;
+ frac := 0.5;
+ len := 0.6;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ reflen := 0.2*fws;
+ outay := 0.45*fws;
+ inray := 0.7*outay;
+ coordg := frac*fws;
+ NumLines := 30;
+ HoriZon := -0.5*fws;
+ setthestage( 0.5*NumLines, 2*fws );
+ cubevertex = (0.12*fws,-0.5*fws,-0.5*fws);
+ kindofcube(false,true,cubevertex,180,0,0,0.65*fws,0.2*fws,fws);
+ aroc := outay*(0,cosd(wang),sind(wang))-0.5*(0,fws,fws);
+ rigorousdisc( inray, true, aroc, outay, axe*len );
+ allellaxe := reflen*( 0.707, 0.707, 0 );
+ ellaaxe := reflen*( 0.707, -0.707, 1.0 );
+ ellbaxe := reflen*( -0.707, 0.707, 1.0 );
+ conecenter = ( coordg, coordg, -0.5*fws );
+ pca := ( coordg, -coordg, -0.5*fws );
+ pcb := ( -coordg, coordg, -0.5*fws );
+ pea := ( coordg, -coordg, 0.9*fws );
+ peb := ( -coordg, coordg, 0.9*fws );
+ cira := goodcirclepath( pca, blue, reflen );
+ cirb := goodcirclepath( pcb, blue, reflen );
+ ella := ellipticpath( pea, allellaxe, ellaaxe );
+ ellb := ellipticpath( peb, allellaxe, ellbaxe );
+ tuba := twocyclestogether( cira, ella );
+ tubb := twocyclestogether( cirb, ellb );
+ tubc := twocyclestogether( ella, ellb );
+ unfill tubb; draw tubb;
+ unfill tubc; draw tubc;
+ unfill tuba; draw tuba;
+ conevertex = conecenter + ( -3.5*reflen, 0, 0.8*fws );
+ verygoodcone(false,conecenter,blue,reflen,conevertex);
+endfig;
+end.</verb></tscreen>where we find a <tt>rigorousdisc</tt>
+ and a <tt>verygoodcone</tt>
+ (the nicest <tt>FEATPOST</tt> macros) in addition to
+ <tt>setthestage</tt>, <tt>twocyclestogether</tt> and
+ <tt>kindofcube</tt>.
+ </p>
+ <p>
+ <figure>
+ <eps file="../allps/stageforthree.1">
+ <img src="../allpng/stageforthree.1.gs.png">
+ <caption>Example that uses <tt>rigorousdisc</tt> and
+ <tt>verygoodcone</tt>.</caption>
+ </figure><label id="figstageforthree">
+ </p>
+ <sect1>
+ <heading>Mechanics</heading>
+ <p>
+ The following is the sequence of steps necessary to produce
+ the diagrams.
+ <enum>
+ <item>There are two methods that one can use to instruct
+ MetaPost to process the TeX parts of the input file with
+ LaTeX instead of plain TeX. One is to put a first
+ line containing just <code>%&latex</code> in
+ the file. This is the simplest method, but it doesn't
+ work on all systems. Alternately, you can set the
+ environment variable <tt>TEX</tt> to "<tt>latex</tt>",
+ like: <code>export TEX=latex</code> or run
+ <tt>mpost</tt> with a command-line option, like:
+ <code>mpost --tex=latex myfile.mp</code> (this text was
+ originally written by Brooks Moses)
+ </item>
+ <item>
+ Make your MetaPost program know <tt>FEATPOST</tt> macros.
+ This may be accomplished in two ways:
+ <itemize>
+ <item>
+ Insert the line:
+ <tscreen><verb>input featpost3Dplus2D;</verb></tscreen>at
+ the beginning
+ of your program and
+ then enter the shell command
+ <code>mpost yourprogram.mp</code> or
+ </item>
+ <item>
+ Pre-compile the macros into a <tt>mem</tt> file,
+ for instance:
+ <code>mpost -ini featpost</code> and then run your
+ program with
+ <code>mpost -mem featpost yourprogram.mp</code>
+ </item>
+ </itemize>
+ </item>
+ <item>
+ If your program contains LaTeX text you may insert, at the
+ beginning, the lines
+ <tscreen><verb>
+verbatimtex
+\documentclass{article}
+\begin{document}
+etex</verb></tscreen>and at the end
+ <tscreen><verb>
+verbatimtex
+\end{document}
+etex</verb></tscreen>or make use of the
+<url url="http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros/latexmp/" name="latexmp"> package.</item>
+ <item>
+ Pass the produced figure(s) through <tt>dvips</tt>
+ if they contain any text. You may do this with the provided
+ shell script <tt>laproof</tt>.
+ <code>laproof yourprogram N</code> where <tt>N</tt>
+ is the figure number. This
+ script produces an EPS figure that may be viewed with
+ <tt>gv</tt> but that should not be inserted in LaTeX
+ documents. Insert the original figure in LaTeX
+ documents. Instead of <tt>laproof</tt> you may just as
+ well use <url
+ url="http://www.ida.liu.se/~joned/download/mps2eps/"
+ name="MPS2EPS"> or <url
+ url="http://www.iee.et.tu-dresden.de/~fimmel/metapost.html" name="metapost.pl">.
+ </item>
+ </enum>
+ </p>
+ </sect1>
+ <sect1>
+ <heading>Main Features</heading>
+ <sect2>
+ <heading>Perspectives</heading>
+ <p>
+ <tt>FEATPOST</tt> can do three kinds of perspective.
+ <tscreen>
+ <verb>
+f := ( 1.2 , 2.0 , 1.6 );
+Spread := 75;
+
+V1 := (1,1,1);
+V2 := (-1,1,1);
+V3 := (-1,-1,1);
+V4 := (1,-1,1);
+V5 := (1,1,-1);
+V6 := (-1,1,-1);
+V7 := (-1,-1,-1);
+V8 := (1,-1,-1);
+makeface1(1,2,3,4);makeface2(5,6,7,8);
+makeface3(1,2,6,5);makeface4(2,3,7,6);
+makeface5(3,4,8,7);makeface6(4,1,5,8);
+makeline1(1,7);makeline2(2,8);
+makeline3(3,5);makeline4(4,6);
+
+beginfig(1);
+ ParallelProj := true;
+ SphericalDistortion := false;
+ draw_all_test(red,true);
+endfig;
+
+beginfig(2);
+ ParallelProj := false;
+ SphericalDistortion := false;
+ draw_all_test(green,true);
+endfig;
+
+beginfig(3);
+ ParallelProj := false;
+ SphericalDistortion := true;
+ PrintStep := 5;
+ draw_all_test(blue,true);
+endfig;
+
+end;</verb>
+ </tscreen>
+ </p>
+ <p>
+ <figure>
+ <eps file="../allps/cubicfigures.1">
+ <img src="../allpng/cubicfigures.1.gs.png">
+ <caption>Orthogonal perspective.</caption>
+ </figure><label id="figcubicfigures1">
+ </p>
+ <p>
+ <figure>
+ <eps file="../allps/cubicfigures.2">
+ <img src="../allpng/cubicfigures.2.gs.png">
+ <caption>Rigorous perspective.</caption>
+ </figure><label id="figcubicfigures2">
+ </p>
+ <p>
+ <figure>
+ <eps file="../allps/cubicfigures.3">
+ <img src="../allpng/cubicfigures.3.gs.png">
+ <caption>Fish-eye perspective.</caption>
+ </figure><label id="figcubicfigures3">
+ </p>
+ </sect2>
+ <sect2>
+ <heading>From 3D to 2D</heading>
+ <p>
+ The most important macro is <tt>rp</tt> that converts 3D points
+ to two-dimensional (2D) rigorous, orthogonal
+ or fish-eye projections. To draw a line in
+ 3D-space try
+ <tscreen><verb>draw rp(a)--rp(b);</verb></tscreen>where
+ <tt>a</tt> and <tt>b</tt> are points in space
+ (of <tt>color</tt> type).
+ But if you're going for fish-eye it's better to
+ <tscreen><verb>draw pathofstraightline(a,b);</verb></tscreen>If
+ you don't know, leave it as
+ <tscreen><verb>drawsegment(a,b);</verb></tscreen>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Angles</heading>
+ <p>
+ When <tt>FEATPOST</tt> was created its main ability was
+ to mark and to calculate angles. This is done with the
+ macros <tt>angline</tt> and <tt>getangle</tt> as in the
+ following program:
+ <tscreen>
+ <verb>
+f := (5,3.5,1);
+beginfig(2);
+ cartaxes(1,1,1);
+ color va, vb, vc, vd;
+ va = (0.29,0.7,1.0);
+ vb = (X(va),Y(va),0);
+ vc = N((-Y(va),X(va),0));
+ vd = (0,Y(vc),0);
+ drawarrow rp(black)--rp(va);
+ draw rp(black)--rp(vb)--rp(va) dashed evenly;
+ draw rp(vc)--rp(vd) dashed evenly;
+ drawarrow rp(black)--rp(vc);
+ squareangline( va, vc, black, 0.15 );
+ angline(va,red,black,0.75,decimal getangle(va,red),lft);
+endfig;</verb>
+ </tscreen><figure>
+ <eps file="../allps/cartaxes.2">
+ <img src="../allpng/cartaxes.2.gs.png">
+ <caption>Example that uses <tt>cartaxes</tt>,
+ <tt>angline</tt> and <tt>getangle</tt>.</caption>
+ </figure><label id="figcartaxes2">
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Intersections</heading>
+ <p>
+ The most advanced feature of <tt>FEATPOST</tt> is the
+ ability to calculate the intersections of planar and
+ convex polygons<footnote>Unfortunately, this is also the
+ most "bugged" feature.</footnote>. It can draw the visible
+ part of arbitrary sets of polygons as in
+ the following program:
+ <tscreen>
+ <verb>
+numeric phi;
+phi = 0.5*(1+sqrt(5));
+V1 := ( 1, phi,0);V2 := (-1, phi,0);
+V3 := (-1,-phi,0);V4 := ( 1,-phi,0);
+V5 := (0, 1, phi);V6 := (0,-1, phi);
+V7 := (0,-1,-phi);V8 := (0, 1,-phi);
+V9 := ( phi,0, 1);V10:= ( phi,0,-1);
+V11:= (-phi,0,-1);V12:= (-phi,0, 1);
+makeface1(1,2,3,4);makeface2(5,6,7,8);
+makeface3(9,10,11,12);
+beginfig(1);
+ sharpraytrace;
+endfig;
+end</verb></tscreen>
+ </p>
+ <p>
+ <figure>
+ <eps file="../allps/sharpraytrace.1">
+ <img src="../allpng/sharpraytrace.1.gs.png">
+ <caption>Example that uses <tt>sharpraytrace</tt>.</caption>
+ </figure><label id="figsharpraytrace">
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Coming back to 3D from 2D</heading>
+ <p>
+ It is now possible to do an "automatic perspective tuning"
+ with the aid of macro <tt>photoreverse</tt> which is under
+ development. Please, refer to example
+ <tt>photoreverse.mp</tt> and to <url url="http://matagalatlante.org/nobre/hyt/technicaldrawfromphoto.html" name="FeatPost Deeper Technicalities">.
+ </p>
+ <p>
+ <figure>
+ <eps file="../alleps/photoreverse.1.eps">
+ <img src="../allpng/photoreverse.1.gs.png">
+ <caption>Example that uses <tt>photoreverse</tt>. It may
+ not work when vertical lines are not vertical in
+ average on the photo.</caption>
+ </figure><label id="figphotoreverse">
+ </p>
+ <sect3>
+ <heading>Coming back to 3D from 1D</heading>
+ <p>
+ Using the same algorithm of <tt>photoreverse</tt>, the
+ macro <tt>improvertex</tt> allows one to approximate a
+ point in 3D-space with given distances from three other
+ points (an initial guess is required).
+ </p>
+ </sect3>
+ </sect2>
+ </sect1>
+ </sect>
+ <sect>
+ <heading>Reference Manual</heading>
+ <p>
+ Some words about notation.
+ The meaning of macro, function, procedure and routine is the same.
+ Global variables are presented like this:
+ <tscreen>
+ <verb>
+vartype var, anothervar
+anothervartype yetanothervar</verb>
+ </tscreen>Explanation of var, anothervar and
+ yetanothervar. vartype can be any one of
+ MetaPost types but the meaning
+ of <tt>color</tt> is a three-dimensional point or vector, not an
+ actual color like yellow, black or white. If the meaning is
+ an actual color then the type will be <tt>colour</tt>.
+ All global variables have default values.
+ </p>
+ <p>
+ Functions are presented like this:
+ <itemize>
+ <item>returntype <bf>function()</bf>
+ Explanation of function. returntype can be any one of MetaPost
+ types plus global, draw or drawlabel.
+ global means that the function
+ changes some of the global variables. draw means that
+ the function
+ changes the currentpicture. drawlabel means that the
+ function changes
+ the currentpicture and adds text to it.
+ <enum>
+ <item> <tt>type1</tt>
+ Explanation of the first argument. The type of
+ one argument can be any one
+ of MetaPost types plus <tt>suffix</tt> or
+ <tt>text</tt>.</item>
+ <item> <tt>type2</tt>
+ Explanation of the second argument.
+ There is the possibility that the
+ function has no arguments. In that case the
+ function is presented like
+ "returntype <bf>function</bf>".</item>
+ <item> Etc.</item>
+ </enum>
+ </item>
+ </itemize>
+ </p>
+ <sect1>
+ <heading>Global variables</heading>
+ <p>
+ <tscreen>
+ <verb>
+boolean ParallelProj
+boolean SphericalDistortion</verb>
+ </tscreen>Kind of projection calculated by <tt>rp</tt>.
+ By default projections
+ are rigorous but if <tt>ParallelProj</tt> is set
+ <tt>true</tt> then
+ parallel lines remain parallel in the projection.
+ It is the same as
+ placing the point of view infinitely far without loosing
+ sight.
+ If <tt>SphericalDistortion</tt> is set <tt>true</tt>
+ there will be a
+ distortion coming from: (i) the projection being done
+ on a sphere of
+ center <tt>f</tt> and (ii) this sphere being plaited
+ onto the paper page.
+ </p>
+ <p>
+ <figure>
+ <eps file="../allps/rigorousdiscSD.1">
+ <img src="../allpng/rigorousdiscSD.1.gs.png">
+ <caption>Figure that uses <tt>SphericalDistortion:=true</tt>
+ and <tt>rigorousdisc</tt>.</caption>
+ </figure><label id="sphericaldisc">
+ </p>
+ <p>
+ <tscreen>
+ <verb>
+color f, viewcentr</verb>
+ </tscreen>The point of view is <tt>f</tt>. The plane or sphere
+ of projection contains
+ the center of view <tt>viewcentr</tt>.
+ The axis parallel to zz that contains the
+ <tt>viewcentr</tt> is projected on a vertical line.
+ <tscreen>
+ <verb>
+numeric Spread
+pair ShiftV, OriginProjPagePos
+numeric PageWidth
+numeric PageHeight</verb>
+ </tscreen>These variables control
+ the placement of the projection on the
+ paper. <tt>Spread</tt> is the magnification
+ and <tt>ShiftV</tt> is the position of the
+ <tt>viewcentr</tt> projection on the
+ paper. But, if at some point in your program you introduce
+ <tt>produce_auto_scale</tt> then the
+ <tt>currentpicture</tt> will be
+ centered at <tt>OriginProjPagePos</tt>
+ and scaled to fit inside a rectangle of
+ <tt>PageWidth</tt> by <tt>PageHeight</tt>.
+ <tscreen>
+ <verb>
+color V[]
+color L[]p[]
+color F[]p[]</verb>
+ </tscreen>Vertexes, lines and faces.
+ The idea here is to draw
+ polygons and/or arbitrary lines in 3D space.
+ Defining the polygons and
+ the lines can be a bit tedious as <tt>FEATPOST</tt> is not
+ interactive. First, one defines a list of the
+ vertexes (<tt>V[]</tt>) that define the
+ polygons and/or the lines.
+ There is a list of polygons and a list of
+ lines. Each polygon (<tt>F[]p[]</tt>) or
+ line (<tt>L[]p[]</tt>) is itself a list of vertexes.
+ All vertexes of the same poligon should belong
+ to the same plane.
+ <tscreen>
+ <verb>
+numeric NL
+numeric npl[]
+numeric NF
+numeric npf[]</verb>
+ </tscreen>Number of lines, number of vertexes of each line,
+ number of faces, number of vertexes of each face.
+ <tscreen>
+ <verb>
+numeric PrintStep</verb>
+ </tscreen>
+ <tt>Printstep</tt> is the size of iterative jumps
+ along lines. Used by
+ <tt>lineraytrace</tt>, <tt>faceraytrace</tt> and
+ <tt>pathofstraightline</tt>.
+ Big <tt>Printstep</tt>s make fast raytracings.
+ <tscreen>
+ <verb>
+boolean FCD[]
+colour TableC[]
+numeric TableColors
+numeric FC[]
+colour HigColor
+colour SubColor
+color LightSource</verb>
+ </tscreen><tt>FCD</tt> means "face color defined". The
+ <tt>draw_invisible</tt> macro draws
+ polygons in colour, if it is defined. The colour must be
+ selected from the table of colours <tt>TableC</tt> that has
+ as many as <tt>TableColors</tt>. The colour <tt>FC</tt>
+ of each polygon will depend on its position relatively to
+ <tt>LightSource</tt> where we suppose there is a lamp that
+ emits light coloured <tt>HigColor</tt>. Furthermore the
+ colour of each polygon may be modified if it belongs to a
+ functional or parametric surface. In this case, if we are
+ looking at the polygon from below than <tt>SubColor</tt> is
+ subtracted from its colour.
+ <tscreen>
+ <verb>
+numeric RopeColorSeq[]
+numeric RopeColors</verb>
+ </tscreen>
+ These are used by <tt>ropepattern</tt>.
+ <tscreen>
+ <verb>
+numeric TDAtiplen
+numeric TDAhalftipbase
+numeric TDAhalfthick</verb>
+ </tscreen>
+ These control the shape of Three-Dimensional Arrows.
+ <tscreen>
+ <verb>
+boolean ShadowOn
+numeric HoriZon</verb>
+ </tscreen>
+ When <tt>ShadowOn</tt> is set <tt>true</tt>, some objects can
+ cast a black shadow on a horizontal plane of <tt>Z</tt>
+ coordinate equal to <tt>HoriZon</tt> (an area from
+ this plane may be drawn with <tt>setthestage</tt>) as if
+ there is a punctual source of light at
+ <tt>LightSource</tt>.
+ The macros that can produce shadows, in addition to their
+ specific production, are<itemize>
+ <item><tt>emptyline</tt></item>
+ <item><tt>rigorousdisc</tt></item>
+ <item><tt>verygoodcone</tt></item>
+ <item><tt>tropicalglobe</tt></item>
+ <item><tt>whatisthis</tt></item>
+ <item><tt>kindofcube</tt></item>
+ <item><tt>draw_all_test</tt></item>
+ <item><tt>fill_faces</tt></item>
+ <item><tt>positivecharge</tt></item>
+ </itemize>
+ All macros that contain <bf>shadow</bf> in their name
+ calculate the location of shadows (using <tt>cb</tt>).
+ <tscreen>
+ <verb>
+path VGAborder</verb>
+ </tscreen>
+ This path and the macro <tt>produce_vga_border</tt> are
+ meant to help you clip the <tt>currentpicture</tt> to a 4:3
+ rectangle as in a movie frame.
+ <tscreen>
+ <verb>
+pair PhotoPair[]
+color PhotoPoint[]
+numeric PhotoMarks</verb>
+ </tscreen>
+ These are used by <tt>photoreverse</tt>.
+ <tscreen>
+ <verb>
+pen ForePen, BackPen
+path CLPath
+numeric NCL</verb>
+ </tscreen>
+ These are used by <tt>closedline</tt>.
+ </p>
+ </sect1>
+ <sect1>
+ <heading>Definitions</heading>
+ <p>
+ <itemize>
+ <item>global makeline@&num;( text1)</item>
+ <item>global makeface@&num;( text1)</item>
+ </itemize>
+ Both of these functions ease the task of
+ defining lines and polygons. Just
+ provide a list of vertexes in the right
+ sequence for each polygon and/or
+ line. Suppose a tetrahedron
+ <tscreen><verb>
+V3:=(+1,-1,-1);V2:=(-1,+1,-1);
+V4:=(+1,+1,+1);V1:=(-1,-1,+1);
+makeface2(1,2,3);makeface3(1,2,4);
+makeface1(3,4,1);makeface4(3,4,2);</verb></tscreen>The
+ number in the last makeface or last
+ makeline procedure name must be the
+ number of polygons or lines. All polygons and lines from 1 upto this
+ number must be defined but the sorting may be any of your liking.
+ </p>
+ </sect1>
+ <sect1>
+ <heading>Macros</heading>
+ <sect2>
+ <heading>Very Basic Macros</heading>
+ <p>
+ <itemize>
+ <item>numeric <bf>X()</bf>
+ Returns the first coordinate of a point or vector (of
+ color type). Replaces <tt>redpart</tt>.
+ </item>
+ <item>numeric <bf>Y()</bf>
+ Returns the second coordinate of a point or vector.
+ Replaces <tt>greenpart</tt>.
+ </item>
+ <item>numeric <bf>Z()</bf>
+ Returns the second coordinate of a point or vector.
+ Replaces <tt>bluepart</tt>.
+ </item>
+ <item>draw <bf>produce_auto_scale</bf>
+ The currentpicture is centered in, and adjusted
+ to the size of, an A4
+ paper page. This avoids the control of <tt>Spread</tt> and
+ <tt>ShiftV</tt>.
+ </item>
+ <item>string <bf>cstr()</bf> Converts a color into its
+ string. Usefull in combination with <tt>getready</tt>.
+ </item>
+ <item>string <bf>bstr()</bf> Converts a boolean
+ expression into its
+ string. Usefull in combination with <tt>getready</tt>.
+ </item>
+ </itemize>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Vector Calculus</heading>
+ <p>
+ <itemize>
+ <item>color <bf>N()</bf> Unit vector. Returns
+ <tt>black</tt> (the null vector) when the argument has
+ null norm. The "N" means "normalized".</item>
+ <item>numeric <bf>cdotprod()</bf> Dot product of two
+ vectors.</item>
+ <item>color <bf>ccrossprod()</bf> Cross product of two
+ vectors.</item>
+ <item>numeric <bf>ndotprod()</bf> Cossine of the angle
+ beetween two vectors.</item>
+ <item>color <bf>ncrossprod()</bf> Normalized cross product
+ of twovectors.</item>
+ <item>numeric <bf>conorm()</bf> Euclidean norm of a
+ vector.</item>
+ <item>numeric <bf>getangle()</bf> Angle beetween two
+ vectors.</item>
+ <item>pair <bf>getanglepair()</bf> Orientation angles
+ of a vector. The first angle (<tt>xpart</tt>) is
+ measured beetween the vector projection on the <tt>XY</tt>
+ plane and the <tt>X</tt> axis. The second angle
+ (<tt>ypart</tt>)is measured
+ beetween the vector and its projection on the <tt>XY</tt>
+ plane. This may be usefull to find the arguments of
+ <tt>kindofcube</tt></item>
+ <item>color <bf>eulerrotation()</bf> Three-dimensional
+ rotation of a vector. See the figure explaining
+ <tt>kindofcube</tt> to visualize the following
+ movement: (i) grab the <tt>X</tt> component of the
+ vector; (ii) rotate it on the <tt>XY</tt> plane as
+ much as the first argument;
+ (iii) raise it up as much as the second argument; and
+ (iv) turn it around as much as the third argument.
+ <enum>
+ <item><tt>numeric</tt> Angle of rotation around the
+ <tt>Z</tt> component.</item>
+ <item><tt>numeric</tt> Angle of rotation around the
+ rotated <tt>Y</tt> component.</item>
+ <item><tt>numeric</tt> Angle of rotation around the
+ two times rotated <tt>X</tt> component.</item>
+ <item><tt>color</tt> Vector to be rotated.</item>
+ </enum>
+ </item>
+ <item>color <bf>randomfear</bf> Generates a randomly
+ oriented unit vector.
+ </item>
+ </itemize>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Projection Macros</heading>
+ <p>
+ <itemize>
+ <item>pair <bf>rp()</bf> Converts spatial positions into
+ planar positions on the paper page. The conversion
+ considers the values of the following global
+ variables: <tt>viewcentr</tt>,
+ <tt>ParallelProj</tt>, <tt>SphericalDistortion</tt>,
+ <tt>Spread</tt> and <tt>ShiftV</tt>. When both
+ <tt>ParallelProj</tt> and <tt>SphericalDistortion</tt>
+ are <tt>false</tt> it won't work if either (i) the
+ vectors <tt>f-viewcentr</tt> and <tt>f-R</tt> are
+ perpendicular (<tt>R</tt> is the argument) or (ii)
+ <tt>f</tt> and <tt>viewcentr</tt> share the same
+ <tt>X</tt> and <tt>Y</tt> coordinates. <enum>
+ <item><tt>color</tt> Spatial position.</item>
+ </enum>
+ </item>
+ <item>color <bf>cb()</bf> Calculates the position of the
+ shadow of a point. Uses <tt>HoriZon</tt> and
+ <tt>LightSource</tt>.
+ <enum>
+ <item><tt>color</tt> Point position.</item>
+ </enum>
+ </item>
+ <item>color <bf>projectpoint()</bf> Calculates the
+ intersection beetween a plane and a straight
+ line. The plane contains a given point and is
+ perpendicular to the line connecting the
+ <tt>LightSource</tt> and this same point.
+ The line is defined by another given point and the
+ <tt>LightSource</tt>. Summary: <tt>projectpoint</tt>
+ returns the projection of the second argument on a
+ plane that contains the first argument. Can be used to
+ draw shadows cast on generic planes.
+ <enum>
+ <item><tt>color</tt> Origin of the projection plane.</item>
+ <item><tt>color</tt> Point to be projected.</item>
+ </enum>
+ </item>
+ <item>color <bf>lineintersectplan()</bf> Calculates the
+ intersection beetween a generic plane and a straight
+ line. The plane contains a given point and is
+ perpendicular to a given vector.
+ The line contains a given point and is parallel to
+ a given vector.
+ <enum>
+ <item><tt>color</tt> Point of the line.</item>
+ <item><tt>color</tt> Vector parallel to the line.</item>
+ <item><tt>color</tt> Point of the projection plane.</item>
+ <item><tt>color</tt> Vector perpendicular to the
+ projection plane.</item>
+ </enum>
+ </item>
+ </itemize>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Plain Basic Macros</heading>
+ <p>
+ <itemize>
+ <item>draw <bf>signalvertex()</bf> Draws a dot
+ sized inversely proportional to its distance from
+ the viewpoint <tt>f</tt>.
+ <enum>
+ <item><tt>color</tt> Location.</item>
+ <item><tt>numeric</tt> Factor of proportionality
+ ("size of the dot").</item>
+ <item><tt>colour</tt> Colour of the dot.</item>
+ </enum>
+ <figure>
+ <eps file="../allps/torus.1">
+ <img src="../allpng/torus.1.gs.png">
+ <caption>Figure that uses <tt>signalvertex</tt>.</caption>
+ </figure>
+ </item>
+ <item>path <bf>pathofstraightline()</bf> When using
+ <tt>SphericalDistortion:=true</tt>, straight lines
+ look like curves. This macro returns the curved path
+ of a straight line beetween two points. This path will
+ have a greater <tt>length</tt> ("time") when
+ <tt>PrintStep</tt> is made smaller.</item>
+ <item>draw <bf>drawsegment()</bf> Alternative
+ <tt>pathofstraightline</tt> that avoids the
+ calculation of all the intermediate points when
+ <tt>SphericalDistortion:=false</tt>.
+ <item>drawlabel <bf>cartaxes()</bf>
+ Cartesean axis with prescribed lenghtes and apropriate labels.
+ <enum>
+ <item><tt>numeric</tt> Length of the <tt>X</tt> axis.</item>
+ <item><tt>numeric</tt> Length of the <tt>Y</tt> axis.</item>
+ <item><tt>numeric</tt> Length of the <tt>Z</tt> axis.</item>
+ </enum>
+ </item>
+ <item>draw <bf>emptyline()</bf> This procedure produces
+ a sort of a tube that can cross over itself. It
+ facilitates the drawing of, for instance, thick
+ helical curves but it won't
+ look right if the curves are drawn getting apart from
+ the point of view. Please, accept this inconveniance.
+ As like many other <tt>FEATPOST</tt> macros this one
+ can produce visually correct diagrams only in limited
+ conditions. Can cast a shadow.
+ <enum>
+ <item><tt>boolean</tt> Choose <tt>true</tt> to join
+ this line with a previously drawn line.</item>
+ <item><tt>numeric</tt> Factor of proportionality
+ ("diameter of the tube"). The tubes are just
+ sequences of dots drawn by <tt>signalvertex</tt>.</item>
+ <item><tt>colour</tt> Colour of the tube border.</item>
+ <item><tt>colour</tt> Colour of the tube.</item>
+ <item><tt>numeric</tt> Total number of dots on the
+ tube line.</item>
+ <item><tt>numeric</tt> Fraction of the tube diameter
+ that is drawn with the tube colour.</item>
+ <item><tt>numeric</tt> This is the number of dots
+ that are redrawn with the colour of the tube for
+ each drawn dot with the color of the tube
+ border. Usually 1 or 2 are enough.</item>
+ <item><tt>text</tt> This is the name a function
+ that returns a 3D point of the line for each value
+ of a parameter in beetween 0 and 1.
+ </item>
+ </enum>
+ <figure>
+ <eps file="../allps/joinedemptylines.1">
+ <img src="../allpng/joinedemptylines.1.gs.png">
+ <caption>Figure that uses <tt>emptyline</tt>.
+ The junction point of two different lines is indicated
+ by an arrow. Note the unperfection on the top
+ right, inside the upper turn. </caption>
+ </figure><label id="joinedemptylines">
+ </item>
+ <item>draw <bf>closedline()</bf> This procedure produces
+ a tube that can cross over itself. It
+ facilitates the drawing of, for instance, thick
+ helical curves but it won't
+ look right as its thickness does not change with the
+ distance from the point of view. The drawing is
+ entirely done in two dimensions, so the tube diameter
+ depends on the global variables <tt>ForePen</tt> and
+ <tt>BackPen</tt>. There can be more than one
+ line in a figure but all get the same diameter.
+ When calling <tt>closedline()</tt> in different
+ figures of the same program you must reinitialize both
+ <tt>NCL</tt> and <tt>Nobjects</tt> (because
+ <tt>closedline()</tt> uses <tt>getready()</tt>).
+ <enum>
+ <item><tt>boolean</tt> Value of "the line is closed".
+ </item>
+ <item><tt>numeric</tt> Total number of path segments
+ on the tube line.</item>
+ <item><tt>numeric</tt> Use 0.5 or more.</item>
+ <item><tt>numeric</tt> Use 0.75 or more.</item>
+ <item><tt>text</tt> This is the name of a function
+ that returns a 3D point of the line for each value
+ of a parameter in beetween 0 and 1.
+ </item>
+ </enum>
+ </item>
+ <item>drawlabel <bf>angline()</bf>
+ Draws an arch beetween two straight lines with a
+ common point and places a label
+ near the middle of the arch (marks an
+ angle). Note that the arch is not circular.
+ <enum>
+ <item><tt>color</tt> Point of one line.</item>
+ <item><tt>color</tt> Point ot the other line.</item>
+ <item><tt>color</tt> Common point.</item>
+ <item><tt>numeric</tt> Distance beetween the arch and
+ the common point.</item>
+ <item><tt>picture</tt> Label.</item>
+ <item><tt>suffix</tt> Position of the label relatively
+ to the middle of the arch. May
+ be one of <tt>lft, rt, top, bot, ulft, urt,
+ llft</tt> and <tt>lrt</tt>.</item>
+ </enum>
+ </item>
+ <item>drawlabel <bf>anglinen()</bf>
+ The same as the previous function but the
+ sixth argument is numeric:
+ 0=<tt>rt</tt>;
+ 1=<tt>urt</tt>;
+ 2=<tt>top</tt>;
+ 3=<tt>ulft</tt>;
+ 4=<tt>lft</tt>;
+ 5=<tt>llft</tt>;
+ 6=<tt>bot</tt>;
+ 7=<tt>lrt</tt>;
+ any other number places the label
+ on the middle of the arch.</item>
+ <item>draw <bf>squareangline()</bf>
+ This is supposed to mark 90 degree angles
+ but works for any angle value.
+ <enum>
+ <item><tt>color</tt> Point of one line.</item>
+ <item><tt>color</tt> Point ot the other line.</item>
+ <item><tt>color</tt> Common point.</item>
+ <item><tt>numeric</tt> Distance beetween the "arch"
+ and the common point.</item>
+ </enum>
+ </item>
+ <item>path <bf>rigorouscircle()</bf>
+ 3D circle. The total "time" of this path is 8. This
+ small number makes it easy to select parts of the
+ path. The circle is drawn using the
+ "left-hand-rule". If you put your left-hand thumb
+ parallel the circle axis then the other left-hand
+ fingers curl in the same sense as the circle
+ path. This path allways starts, approching the view
+ point, from a point on a diameter of the
+ circle that projects orthogonaly to its axis, and
+ rotating around the axis in the way of the left-hand-rule.
+ <enum>
+ <item><tt>color</tt> Center of the circle.</item>
+ <item><tt>color</tt> Direction orthogonal to the
+ circle (circle axis).</item>
+ <item><tt>numeric</tt> Radius of the circle.</item>
+ </enum>
+ <figure>
+ <eps file="../allps/anglinerigorouscircle.1">
+ <img src="../allpng/anglinerigorouscircle.1.gs.png">
+ <caption>Figure that uses <tt>anglinen</tt>
+ and <tt>rigorouscircle</tt>.</caption>
+ </figure>
+ </item>
+ <item>draw <bf>tdarrow()</bf> Draws a flat arrow that
+ begins at the first argument and ends at the second.
+ The shape of the arrow is controled by the global
+ variables <tt>TDAtiplen, TDAhalftipbase, TDAhalfthick</tt>.
+ </item>
+ <item>path <bf>twocyclestogether()</bf> This macro
+ allows you to draw any solid that has no vertexes
+ and that has two, exactly two, planar cyclic edges.
+ In fact, it doesn't need to be a solid. Just
+ provide the pathes of both cyclic edges as arguments
+ but note that the returned path is polygonal.
+ In order to complete
+ the drawing of this solid you have to choose one of
+ the edges to be drawn immediatly afterwards. This is
+ done automatically by the <tt>whatisthis</tt> macro
+ for the case of two parallel and concentric ellipses.
+ </item>
+ <item>path <bf>ellipticpath()</bf> Produces an elliptic
+ path in 3D space.
+ <enum>
+ <item><tt>color</tt> Position of the center.</item>
+ <item><tt>color</tt> Major or minor axis.</item>
+ <item><tt>color</tt> The other axis.</item>
+ </enum>
+ </item>
+ <item>drawlabel <bf>labelinspace()</bf> Draw some 2D
+ <tt>picture</tt> on some 3D plane (only when
+ <tt>ParallelProj:=true</tt>).
+ <enum>
+ <item><tt>color</tt> Position for the lower-left
+ corner. </item>
+ <item><tt>color</tt> Orientation of the picture's
+ bottom edge.</item>
+ <item><tt>color</tt> Orientation of the picture's
+ letf edge.</item>
+ <item><tt>text</tt> 2D picture's name.</item>
+ </enum>
+ <figure>
+ <eps file="../allps/labelinspace.1">
+ <img src="../allpng/labelinspace.1.gs.png">
+ <caption>Example that uses <tt>labelinspace</tt>.</caption>
+ </figure>
+ </item>
+ </itemize>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Standard Objects</heading>
+ <p>
+ <itemize>
+ <item>path <bf>goodcirclepath()</bf>
+ Another 3D circle macro. More rigorous
+ than <tt>rigorouscircle</tt> but when
+ the direction ortogonal to the circle is almost
+ orthogonal to the line <tt>viewpoint--center</tt>
+ it doesn't work correctly.
+ The total "time" of this path is 36.
+ <enum>
+ <item><tt>color</tt> Center of the circle.</item>
+ <item><tt>color</tt> Direction ortogonal to
+ the circle.</item>
+ <item><tt>numeric</tt> Radius of the
+ circle.</item>
+ </enum>
+ </item>
+ <item>draw <bf>spatialhalfsfear()</bf> An
+ hemisphere. Doesn't work with <tt>f</tt> inside it.
+ <enum>
+ <item><tt>color</tt> Center.</item>
+ <item><tt>color</tt> Vector ortogonal to
+ the frontier circle and pointing
+ out of the concavity.</item>
+ <item><tt>numeric</tt> Radius of the
+ (hemi)sphere.</item>
+ </enum>
+ </item>
+ <item>path <bf>spatialhalfcircle()</bf>
+ And yet another 3D circle macro. Only the visible or the hidden
+ part. This is usefull to mark sections of
+ cylinders or spherical major circles.
+ <enum>
+ <item><tt>color</tt> Center of the circle.</item>
+ <item><tt>color</tt> Direction ortogonal to the
+ circle.</item>
+ <item><tt>numeric</tt> Radius of the circle.</item>
+ <item><tt>boolean</tt> The visible part is selected with
+ <tt>true</tt> and the hidden
+ with <tt>false</tt>.</item>
+ </enum>
+ </item>
+ <item>draw <bf>rigorousdisc()</bf>
+ 3D opaque cylinder with/without a hole. Can cast a
+ shadow (without the hole).
+ <enum>
+ <item><tt>numeric</tt> Ray of an axial hole.</item>
+ <item><tt>boolean</tt> Option for completly opaque cylinder
+ (<tt>true</tt>) or partial
+ pipe (<tt>false</tt>) when there is no hole. When
+ the cylinder has an hole this option should be
+ <tt>true</tt>.</item>
+ <item><tt>color</tt> Center of one circular base.</item>
+ <item><tt>numeric</tt> Radius of both circular bases.</item>
+ <item><tt>color</tt> Vector that defines the length and
+ orientation of the
+ cylinder. The addition the third and fifth
+ arguments should give the
+ position of the center of the other circular base.
+ </item>
+ </enum>
+ </item>
+ <item>draw <bf>verygoodcone()</bf> 3D cone. Can cast a shadow.
+ <enum>
+ <item><tt>bolean</tt> Option to draw dashed evenly
+ the invisible edge (<tt>true</tt>) or not
+ (<tt>false</tt>).</item>
+ <item><tt>color</tt> Center of the circular base.</item>
+ <item><tt>color</tt> Direction ortogonal to the
+ circular base.</item>
+ <item><tt>numeric</tt> Radius of the circular base.</item>
+ <item><tt>color</tt> Position of the vertex</item>
+ </enum>
+ </item>
+ <item>path <bf>rigorousfearpath()</bf>
+ 3D sphere. Simple but hard.
+ <enum>
+ <item><tt>color</tt> Center position.</item>
+ <item><tt>numeric</tt> Radius.</item>
+ </enum>
+ </item>
+ <item>draw <bf>tropicalglobe()</bf> Globe with
+ minor circles. Can cast a shadow.
+ <enum>
+ <item><tt>numeric</tt> Number of marked latitudes.</item>
+ <item><tt>color</tt> Center position.</item>
+ <item><tt>numeric</tt> Radius</item>
+ <item><tt>color</tt> Axis orientation.</item>
+ </enum>
+ <figure>
+ <eps file="../allps/tropicalglobe.1">
+ <img src="../allpng/tropicalglobe.1.gs.png">
+ <caption>Figure that uses <tt>tropicalglobe</tt>.
+ </caption>
+ </figure>
+ </item>
+ <item>draw <bf>whatisthis()</bf> An elliptic
+ frustum. Both edges are elliptic an have the same
+ orientation but one may be greater than the other.
+ Can cast a shadow.
+ <enum>
+ <item><tt>color</tt> Reference edge center.</item>
+ <item><tt>color</tt> Major or minor axis.</item>
+ <item><tt>color</tt> The other axis.</item>
+ <item><tt>numeric</tt> Length of the original
+ cylinder.</item>
+ <item><tt>numeric</tt> Edges axis length ratio.</item>
+ </enum>
+ </item>
+ <item>draw <bf>kindofcube()</bf> Polyhedron with six
+ orthogonal faces (cuboid).
+ <enum>
+ <item><tt>boolean</tt> Also draw the invisible edges
+ <tt>dashed evenly</tt> (<tt>true</tt>) or do not.</item>
+ <item><tt>boolean</tt> The reference point may be a
+ vertex (<tt>true</tt>) or the center(<tt>false</tt>).</item>
+ <item><tt>color</tt> Reference point.</item>
+ <item><tt>numeric</tt> Alpha1.</item>
+ <item><tt>numeric</tt> Alpha2.</item>
+ <item><tt>numeric</tt> Alpha3.</item>
+ <item><tt>numeric</tt> L1. Length of the first side.</item>
+ <item><tt>numeric</tt> L2. Length of the second side.</item>
+ <item><tt>numeric</tt> L3. Length of the third side.</item>
+ </enum>
+ These arguments are represented in the next figure.
+ <figure>
+ <eps file="../allps/kindofcube.2">
+ <img src="../allpng/kindofcube.2.gs.png">
+ <caption>Figure that uses and explains
+ <tt>kindofcube</tt>. Note that the three indicated
+ angles may be used as arguments of <tt>eulerrotation</tt>.</caption>
+ </figure><label id="kindofcube2">
+ </item>
+ <item>draw <bf>setthestage()</bf> Produces an horizontal
+ square made of squares. Its <tt>Z</tt> coordinate is defined by
+ <tt>HoriZon</tt>.
+ <enum>
+ <item><tt>numeric</tt> Number of squares in each side.</item>
+ <item><tt>numeric</tt> Size of each side.</item>
+ </enum>
+ </item>
+ <item>draw <bf>setthearena()</bf> Produces an horizontal
+ circle made of circles. Its <tt>Z</tt> coordinate is defined by
+ <tt>HoriZon</tt>. Due to the fact that the center of a
+ circle is not on the center of its central perspective
+ projection, this may look a bit strange.
+ <enum>
+ <item><tt>numeric</tt> Number of circles on a
+ diameter.</item>
+ <item><tt>numeric</tt> Diameter.</item>
+ </enum>
+ </item>
+ <item>draw <bf>smoothtorus()</bf> Toxic donut (not to be
+ eaten). Produces an error message when <tt>f</tt> is
+ close to the table.
+ <enum>
+ <item><tt>color</tt> Center.</item>
+ <item><tt>color</tt> Direction orthogonal to the
+ torus plane.</item>
+ <item><tt>numeric</tt> Big ray.</item>
+ <item><tt>numeric</tt> Small ray.</item>
+ </enum>
+ </item>
+ </itemize>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Composed Objects</heading>
+ <p>
+ <itemize>
+ <item>draw <bf>positivecharge()</bf> Draws a sphere with a
+ plus or minus sign on the surface. The horizontal
+ segment of the sign is drawn on the horizontal plane
+ that contains the sphere center. The middle point of
+ this segment is on a vertical plane containing the
+ viewpoint.
+ <enum>
+ <item><tt>boolean</tt> Selects the sign (<tt>true</tt>
+ means positive).</item>
+ <item><tt>color</tt> Position of the center.</item>
+ <item><tt>numeric</tt> Sphere ray.</item>
+ </enum>
+ <figure>
+ <eps file="../allps/positivecharge.1">
+ <img src="../allpng/positivecharge.1.gs.png">
+ <caption>Figure that uses <tt>positivecharge</tt>,
+ <tt>getready</tt> and <tt>doitnow</tt>.
+ </caption>
+ </figure></item>
+ <item>draw <bf>simplecar()</bf> Draws a cuboid and four
+ discs in a configuration ressembling an automobile. The
+ first three arguments of <tt>simplecar</tt> are the same
+ as the the last seven arguments of <tt>kindofcube</tt>
+ but grouped in colors.
+ <enum>
+ <item><tt>color</tt> Center of the cuboid that
+ constitutes the body of the car..</item>
+ <item><tt>color</tt> Angles defining the orientation
+ of the car (see <tt>kindofcube</tt>).</item>
+ <item><tt>color</tt> Dimensions of the car.</item>
+ <item><tt>color</tt> Characteristics of the front
+ wheels. <tt>redpart</tt>-distance from the
+ front. <tt>greenpart</tt>-width of the front wheels (length
+ of the cylinders). <tt>bluepart</tt>-wheel ray.</item>
+ <item><tt>color</tt> Same as above for the rear wheels</item>
+ </enum>
+ <figure>
+ <eps file="../allps/simplecar.1">
+ <img src="../allpng/simplecar.1.gs.png">
+ <caption>Figure that uses <tt>setthearena</tt> and
+ <tt>simplecar</tt>.
+ </caption>
+ </figure></item>
+ </itemize>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Shadow Pathes</heading>
+ <p>
+ <itemize>
+ <item>draw <bf>signalshadowvertex()</bf> Draws the
+ shadow of a <tt>signalvertex</tt> dot.
+ <enum>
+ <item><tt>color</tt> Location of the light-blocking dot.</item>
+ <item><tt>numeric</tt> Factor of proportionality
+ ("size of the dot").</item>
+ <item><tt>colour</tt> Colour of the dot.</item>
+ </enum>
+ </item>
+ <item>path <bf>ellipticshadowpath()</bf> Produces the
+ shadow of an elliptic path.
+ <enum>
+ <item><tt>color</tt> Position of the center.</item>
+ <item><tt>color</tt> Major or minor axis.</item>
+ <item><tt>color</tt> The other axis.</item>
+ </enum>
+ </item>
+ <item>path <bf>circleshadowpath()</bf> Produces the
+ shadow of a circle.
+ <enum>
+ <item><tt>color</tt> Center of the circle.</item>
+ <item><tt>color</tt> Direction ortogonal to
+ the circle.</item>
+ <item><tt>numeric</tt> Radius of the
+ circle.</item>
+ </enum>
+ </item>
+ <item>path <bf>rigorousfearshadowpath()</bf>
+ 3D sphere shadow.
+ <enum>
+ <item><tt>color</tt> Center position.</item>
+ <item><tt>numeric</tt> Radius.</item>
+ </enum>
+ </item>
+ </itemize>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Differential Equations</heading>
+ <p>
+ Before we proceed, be aware that solving differential
+ equations (DE) is mainly an experimental activity. The most
+ probable result of a procedure that atempts to solve a DE
+ is garbage. The procedure may be unstable, the solution
+ may be littered with singularities or something may go
+ wrong. If you don't have a basic understanding of
+ differential equations then skip this section, please.
+ </p>
+ <p>
+ <itemize>
+ <item>path <bf>fieldlinepath()</bf> A vectorial field line is
+ everywhere tangent to the field vectors.
+ Two different parallel fields
+ have the same field lines. So the field only
+ constrains the direction of the field lines, not any kind
+ of "speed" and, therefore, it is recommended to
+ normalize the field before using this macro that
+ contains a second-order Runge-Kutta method
+ implementation.
+ <enum>
+ <item><tt>numeric</tt> Total number of steps.</item>
+ <item><tt>color</tt> Initial position.</item>
+ <item><tt>numeric</tt> Step (arc)length.</item>
+ <item><tt>text</tt> Name of the function that
+ returns a field vector for each 3D position.</item>
+ </enum>
+ </item>
+ <item>path <bf>trajectorypath()</bf> The acceleration of a
+ particle in a conservative force field is equal to the
+ ratio (conservative force)/(particle mass). The
+ acceleration is also equal to the second order time
+ derivative of the particle position. This produces a
+ second order differential equation that we solve using a
+ second-order Runge-Kutta method implementation.
+ <enum>
+ <item><tt>numeric</tt> Total number of steps.</item>
+ <item><tt>color</tt> Initial position.</item>
+ <item><tt>color</tt> Initial velocity.</item>
+ <item><tt>numeric</tt> Time step.</item>
+ <item><tt>text</tt> Name of the function that
+ returns a (force/mass) vector for each 3D position.</item>
+ </enum>
+ </item>
+ <item>path <bf>magnetictrajectorypath()</bf> The
+ acceleration of a
+ charged particle in a magnetic field is equal to the
+ ratio (magnetic force)/(particle mass) but the magnetic
+ force depends on both the velocity and the magnetic field. The
+ acceleration is also equal to the second order time
+ derivative of the particle position. This produces a
+ second order differential equation that we solve using a
+ fourth-order Runge-Kutta method implementation.
+ <enum>
+ <item><tt>numeric</tt> Total number of steps.</item>
+ <item><tt>color</tt> Initial position.</item>
+ <item><tt>color</tt> Initial velocity.</item>
+ <item><tt>numeric</tt> Time step.</item>
+ <item><tt>text</tt> Name of the function that
+ returns a (charge)*(magnetic field)/(partcle mass)
+ vector for each 3D position.</item>
+ </enum>
+ </item>
+ </itemize>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Renderers</heading>
+ <p>
+ <itemize>
+ <item>draw <bf>sharpraytrace</bf> Heavy procedure that
+ draws only the visible part of all edges of all defined
+ faces. There's no point in using this procedure when
+ there are no intersections beetween faces. Any how
+ this will not work for non-convex faces nor when
+ <tt>SphericalDistortion:=true</tt>.
+ </item>
+ <item>draw <bf>lineraytrace()</bf> Draws only the
+ visible part of all defined lines using sequences of dots
+ (<tt>signalvertex</tt> and <tt>PrintStep</tt>).
+ <enum>
+ <item><tt>numeric</tt> Dot size.</item>
+ <item><tt>colour</tt> Dot colour.</item>
+ </enum>
+ </item>
+ <item>draw <bf>faceraytrace()</bf> Draws only the
+ visible part of all edges of all defined faces
+ using sequences of dots
+ (<tt>signalvertex</tt> and <tt>PrintStep</tt>).
+ <enum>
+ <item><tt>numeric</tt> Dot size.</item>
+ <item><tt>colour</tt> Dot colour.</item>
+ </enum>
+ </item>
+ <item>draw <bf>draw_all_test()</bf> Draws all defined
+ edges (and lines) in a correct way independently of
+ the kind of projection used. Can cast a shadow (but
+ the shadow is not correct when
+ <tt>SphericalDistortion:=true</tt>).
+ <enum>
+ <item><tt>boolean</tt> If <tt>true</tt> the lines
+ are also drawn.</item>
+ </enum>
+ </item>
+ <item>draw <bf>fill_faces()</bf> Unfills and draws all
+ faces in the order they were defined (without
+ sorting). Can cast a shadow.
+ <enum>
+ <item><tt>text</tt> Like the argument of
+ <tt>drawoptions</tt> but used only inside this
+ macro and only for the edges.</item>
+ </enum>
+ </item>
+ <item>draw <bf>draw_invisible()</bf> This is a fast way
+ of removing hidden lines that doesn't
+ allow for intersecting polygons nor
+ polygons of very different area. It works by
+ sorting all polygons by
+ distance to <tt>f</tt> and then by "filling" the
+ polygons. This routine may be used to draw graphs
+ of 3D surfaces.
+ <enum>
+ <item><tt>boolean</tt> If <tt>true</tt> polygons are
+ sorted relatively to
+ nearest vertex and, if <tt>false</tt>, relatively to their
+ mass center. Choose <tt>false</tt> for surface
+ plots.</item>
+ <item><tt>boolean</tt> If <tt>false</tt> then the
+ polygons are painted with their <tt>FC</tt> colour
+ modified by <tt>LightSource</tt>. If <tt>true</tt>
+ then the next two arguments are used and the
+ polygons are darkened proportionaly to their
+ distance from <tt>f</tt>.</item>
+ <item><tt>colour</tt> Colour of faces.</item>
+ <item><tt>colour</tt> Colour of the edges.</item>
+ </enum>
+ </item>
+ <item>global <bf>getready()</bf> When you don't want to
+ edit the source of the MetaPost program, to resort the
+ objects so they'll be drawn correctly, use this macro
+ and the next.
+ <enum>
+ <item><tt>string</tt> Command line that would draw
+ some object. For instance:
+ <tt>"rigorousfearpath(black,1);"</tt>.</item>
+ <item><tt>color</tt> Reference position of that
+ object.</item>
+ </enum>
+ </item>
+ <item>draw <bf>doitnow</bf> The reference positions
+ given as arguments of previous <tt>getready</tt> calls
+ are used to sort and draw the objects also given as
+ string arguments to previous <tt>getready</tt>
+ calls. Remember to initialize <tt>Nobjects:=0;</tt>
+ before a second figure.
+ </item>
+ </itemize>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Nematics (Direction Fields)</heading>
+ <p>
+ Nematics are the least ordered liquid crystals. Their
+ configurations can be described by direction fields
+ (vector fields without arrows). The two following routines
+ ease the task of representing their configurations.
+ </p>
+ <p>
+ <itemize>
+ <item>global <bf>generatedirline()</bf> Defines a single
+ straight line segment in a given position and with a
+ given orientation.
+ <enum>
+ <item><tt>numeric</tt> Line index number.</item>
+ <item><tt>numeric</tt> Angle beetween the <tt>X</tt>
+ axis and the projection of the line on the
+ <tt>XY</tt> plane.</item>
+ <item><tt>numeric</tt> Angle beetween the line
+ and the <tt>XY</tt> plane.</item>
+ <item><tt>numeric</tt> Line (arc)length.</item>
+ <item><tt>color</tt> Position of the line middle
+ point.</item>
+ </enum>
+ </item>
+ <item>draw <bf>director_invisible()</bf> This is a
+ direction field renderer that can sort direction
+ lines. This routine
+ draws straight lines of given "thickness" beetween the
+ first all the points
+ of all the <tt>L[]p[]</tt> lines. It is supposed to
+ help you draw vector fields
+ without arrows but taking care of invisibility.
+ The lines may be
+ generated by <tt>generatedirline</tt> or by other macros.
+ <enum>
+ <item><tt>boolean</tt> When there is no need to sort
+ lines you may use <tt>false</tt> here.
+ </item>
+ <item><tt>numeric</tt> "Thickness" of the
+ direction lines</item>
+ <item><tt>boolean</tt> Use <tt>true</tt> for cyclic
+ "direction" lines.</item>
+ </enum>
+ </item>
+ </itemize>
+ <figure>
+ <eps file="../allps/twistflat.1">
+ <img src="../allpng/twistflat.1.gs.png">
+ <caption>Figure that uses <tt>director_invisible</tt>
+ and <tt>generatedirline</tt>.</caption>
+ </figure>
+ </p>
+ </sect2>
+ <sect2>
+ <heading>Surface Plots</heading>
+ <p>
+ Many powerfull plotting packages like
+ <tt><url url="http://www.gnuplot.info/" name="gnuplot"></tt> and
+ <tt><url url="http://gri.sourceforge.net/" name="gri"></tt>
+ are freely available. Because of this, <tt>FEATPOST</tt>
+ surface plots are geared towards unusual features like
+ equilateral triangular grid, hexagonal domain and merging
+ together functional and parametric surface descriptions.
+ </p>
+ <p>
+ <itemize>
+ <item>draw <bf>hexagonaltrimesh()</bf> Plots a
+ functional surface on a triangular or hexagonal
+ domain. Uses the <tt>LightSource</tt>.
+ <enum>
+ <item><tt>boolean</tt> Select the kind of
+ domain. <tt>true</tt> for hexagonal and
+ <tt>false</tt> for triangular. The domain is
+ centered on the origin (<tt>black</tt>). When the
+ domain is hexagonal two of its corners are on the
+ <tt>-YY</tt> axis. When the
+ domain is triangular one of its corners is on the
+ <tt>X</tt> axis. </item>
+ <item><tt>numeric</tt> Number of small triangles on
+ each side of the triangular domain or three times
+ the number of small triangles on
+ each side of the hexagonal domain.</item>
+ <item><tt>numeric</tt> Length of the triangular
+ domain side or three times the hexagonal domain
+ side.</item>
+ <item><tt>text</tt> Name of the function that
+ returns the <tt>Z</tt> coordinate of a surface
+ point of coordinates <tt>X</tt> and <tt>Y</tt>.</item>
+ </enum>
+ <figure>
+ <eps file="../allps/hexagonaltrimesh.1">
+ <img src="../allpng/hexagonaltrimesh.1.gs.png">
+ <caption>Figure that uses <tt>hexagonaltrimesh</tt>.
+ </caption>
+ </figure>
+ </item>
+ <item>global <bf>partrimesh()</bf> Defines a parametric
+ surface that can be drawn with
+ <tt>draw_invisible</tt>. In the following descriptions
+ <tt>S</tt> and <tt>T</tt> are the parameters. Remember
+ to initialize <tt>NF</tt>. The surface is defined so
+ that quadrangles are used whenever possible. If
+ impossible, two triangles are used but their
+ orientation is selected to maximize the surface
+ smoothness. Also note that, unlike
+ <tt>hexagonaltrimesh()</tt>, the spatial range you
+ require to be visible is always first reshaped into a
+ cube and second compressed or extended vertically. How
+ much the cube is compressed or extended depends on the
+ last <tt>numeric</tt> argument, the compression factor
+ for <tt>Z</tt>, meaning that the final height of the
+ cube is 2/(compression factor). Thanks to Sebastian
+ Sturm for pointing the need to explain this.
+ <enum>
+ <item><tt>numeric</tt> Number of <tt>T</tt> steps.</item>
+ <item><tt>numeric</tt> Number of <tt>S</tt> steps.</item>
+ <item><tt>numeric</tt> Minimal <tt>T</tt> value.</item>
+ <item><tt>numeric</tt> Maximal <tt>T</tt> value.</item>
+ <item><tt>numeric</tt> Minimal <tt>S</tt> value.</item>
+ <item><tt>numeric</tt> Maximal <tt>S</tt> value.</item>
+ <item><tt>numeric</tt> Minimal <tt>X</tt> value.</item>
+ <item><tt>numeric</tt> Maximal <tt>X</tt> value.</item>
+ <item><tt>numeric</tt> Minimal <tt>Y</tt> value.</item>
+ <item><tt>numeric</tt> Maximal <tt>Y</tt> value.</item>
+ <item><tt>numeric</tt> Minimal <tt>Z</tt> value.</item>
+ <item><tt>numeric</tt> Maximal <tt>Z</tt> value.</item>
+ <item><tt>numeric</tt> Compression factor for <tt>Z</tt>
+ values.</item>
+ <item><tt>text</tt> Name of the function that
+ returns a surface point (of <tt>color</tt> type)
+ for each pair (<tt>S</tt>,<tt>T</tt>).</item>
+ </enum>
+ </item>
+ </itemize>
+ </p>
+ </sect2>
+ </sect1>
+ </sect>
+ </article>
+</linuxdoc>
diff --git a/Master/texmf-dist/doc/metapost/featpost/doc/tug2004.pdf b/Master/texmf-dist/doc/metapost/featpost/doc/tug2004.pdf
new file mode 100644
index 00000000000..078fe7ef720
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/doc/tug2004.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/bugtrack/bughunt.mp b/Master/texmf-dist/doc/metapost/featpost/example/bugtrack/bughunt.mp
new file mode 100644
index 00000000000..2afa2bcd62d
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/bugtrack/bughunt.mp
@@ -0,0 +1,57 @@
+% bughunt.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+%SphericalDistortion := true;
+%f := 0.3*(5,4,2);
+%Spread := 40;
+%ShiftV := (200,200);
+
+SphericalDistortion := false;
+f := 3.3*(5,4,2);
+Spread := 70;
+ShiftV := (250,250);
+
+beginfig(1);
+ color nalfa, gammacnt, vertex;
+ numeric altura, grids, radius, aux, i, numc, slope;
+
+ altura = 1;
+ radius = 0.3;
+ grids = 1;
+ numc = 8;
+ slope = 15;
+
+ for i=1 upto numc:
+ aux := (i-1-0.5*(numc-1))*grids;
+ gammacnt := (0,aux,0);
+ vertex := gammacnt+0.1*(f-gammacnt)+(0,0,aux/slope);
+ nalfa := vertex - gammacnt;
+ rigorousdisc( 0, true, gammacnt, radius, nalfa );
+ endfor;
+endfig;
+
+beginfig(2);
+ path cpath;
+ color vert;
+ numeric i;
+ f := (4,0,0.5);
+ vert = 0.5*(0,1,1);
+ cpath = rigorouscone(true, black, blue, 1, vert);
+% draw rp(vert);
+ draw cpath; show length cpath;
+ for i=0 upto length cpath:
+ dotlabel.top( decimal(i),point i of cpath);
+ endfor;
+% cpath := rigorouscircle( black, blue, 1);
+% draw cpath;
+% for i=0 upto length cpath:
+% dotlabel.bot( decimal(i),point i of cpath);
+% endfor;
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/bugtrack/gstr.mp b/Master/texmf-dist/doc/metapost/featpost/example/bugtrack/gstr.mp
new file mode 100644
index 00000000000..b0cf81a4674
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/bugtrack/gstr.mp
@@ -0,0 +1,9 @@
+
+beginfig(1);
+ boolean tb;
+ tb = true;
+ draw origin;
+ show bstr( tb );
+endfig;
+end.
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/highmemory/hiddenlinegraph.mp b/Master/texmf-dist/doc/metapost/featpost/example/highmemory/hiddenlinegraph.mp
new file mode 100644
index 00000000000..efa5cea3727
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/highmemory/hiddenlinegraph.mp
@@ -0,0 +1,72 @@
+% hiddenlinegraph.mp
+% L. Nobre G.
+% 2003
+% The application of the big nice trick to draw 3D hidden line surfaces
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+def zsurfaci( expr xc, yc ) =
+ begingroup
+ numeric zout;
+ zout = yc**4-xc*yc*(1-yc**2);
+ ( ( xc, yc, zout ) )
+ endgroup
+enddef;
+
+def zsurface( expr xc, yc ) =
+ ( xc, yc, cosd(xc*57)*cosd(yc*57)+4*mexp(-(xc**2+yc**2)*6.4) )
+enddef;
+
+def zsurfaca( expr xc, yc ) =
+ ( xc, yc, 1.5-0.2*xc )
+enddef;
+
+%f := (6,1,0);
+f := (5,1.5,3);
+Spread := 147;
+NF := 0;
+LightSource := (1,-1,2);
+
+beginfig(1);
+ numeric nx, ny, lowx, higx, lowy, higy,
+ facz, lowz, higz, base, topo;
+ path chair;
+ nx = 22;
+ ny = 22;
+ lowy = -7;
+ higy = 7;
+ lowx = -7;
+ higx = 7;
+ facz = 2;
+ lowz = -1;
+ higz = 5;
+% lowy = -2.5;
+% higy = 1;
+% lowx = 1.5;
+% higx = 3;
+% facz = 3;
+% lowz = -1.5;
+% higz = 1.5;
+ partrimesh( nx,ny,lowx,higx,lowy,higy,
+ lowx,higx,lowy,higy,lowz,higz,facz,zsurface);
+ partrimesh( nx,ny,lowx,higx,lowy,higy,
+ lowx,higx,lowy,higy,lowz,higz,facz,zsurfaca);
+ base = -1/facz;
+ topo = 1/facz;
+ chair = rp((-1,-1,base))--rp((1,-1,base))--rp((1,1,base))
+ --rp((-1,1,base))--rp((-1,-1,base))--rp((-1,-1,topo))
+ --rp((-1,1,topo))--rp((-1,1,base))--cycle;
+ draw chair;
+% fill_faces( withcolor blue );
+ draw_invisible( false, false, green, blue );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/highmemory/mainmemtest.mp b/Master/texmf-dist/doc/metapost/featpost/example/highmemory/mainmemtest.mp
new file mode 100644
index 00000000000..d4ab2a9e4cf
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/highmemory/mainmemtest.mp
@@ -0,0 +1,54 @@
+% mainmemtest.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3D;
+
+beginfig(1);
+
+ f := (2,1,1);
+
+ Spread := 500;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, thetamin,
+ thetamax, thetastp, long, base;
+% It works with sizevec := (8,6,1);
+% with (9,6,1) and sharpraytrace it says
+% ! MetaPost capacity exceeded, sorry [main memory size=2199001].
+ sizevec := (7,6,1);
+ gridvec := (0.05,0.1,0.1);
+ thetamin := 55;
+ thetamax := 125;
+ long := 0.08;
+ base := 0.01;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -0.5*X(gridvec)*(X(sizevec)-1) ,
+ -0.5*Y(gridvec)*(Y(sizevec)-1) ,
+ -0.5*Z(gridvec)*(Z(sizevec)-1) );
+ bordpos := starpos - 0.5*gridvec;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ counter := 2;
+ for i=1 upto X(sizevec):
+ for j=1 upto Y(sizevec):
+ for k=1 upto Z(sizevec):
+ phi := 90;
+ theta := thetamin+(i-1)*thetastp;
+ currpos := starpos+( (i-1)*X(gridvec) ,
+ (j-1)*Y(gridvec) ,
+ (k-1)*Z(gridvec) );
+ generatedirface( counter, phi, theta, long, base, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NF := decr(counter);
+ sharpraytrace;
+endfig;
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/highmemory/par3Dplotexamples.mp b/Master/texmf-dist/doc/metapost/featpost/example/highmemory/par3Dplotexamples.mp
new file mode 100644
index 00000000000..6b05682918a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/highmemory/par3Dplotexamples.mp
@@ -0,0 +1,149 @@
+% J. Schwaiger with help of
+% FEATPOST and the macropackages
+% la3Dmacros.mp and hlr3Dmacros.mp
+% by L. Nobre G.
+% 2003
+
+% Figure (2) retouched in 2004 by L. Nobre G.
+
+verbatimtex
+\documentclass[a4paper,12pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage[latin1]{inputenc}
+\usepackage{euler}
+\usepackage{graphicx}
+\begin{document}
+etex
+
+% for trigonometric functions when angles are measured in rad
+%
+ def sinrad( expr t)=sind(t/3.145*180) enddef;
+ def cosrad( expr t)=cosd(t/3.145*180) enddef;
+
+ def parsurface( expr tc,sc )=
+ (%
+ (4 cosrad(tc) - sinrad(sc)*cosrad(tc),%
+ 4 sinrad(tc) - sinrad(sc)*sinrad(tc),%
+ cosrad(sc))%
+ )% A torus
+ enddef;
+
+ def parsurfacetwo( expr tc,sc )=
+ (%
+ (4+4cosrad(tc) - sinrad(sc)*cosrad(tc),%
+ cosrad(sc),
+ 4sinrad(tc) - sinrad(sc)*sinrad(tc)%
+ )%
+ )% Another torus
+ enddef;
+
+ def parsurfacethree( expr tc,sc )=
+% 0<=sc<=2pi,-2<=tc<=2
+%xmin=-1.4, xmax=1.4
+%ymin=-0.7, ymax=2
+%zmin=-2.5,zmax=2.5
+ (%
+ (1.414213562*cosrad(sc)*cosrad(tc)
+ -2*sinrad(sc)*sinrad(tc))/(2*(abs(tc) + 1)) + sinrad(tc),%
+ cosrad(tc) - (1.414213562*cosrad(sc)*sinrad(tc)
+ + 2*sinrad(sc)*cosrad(tc))/(2*(abs(tc) + 1)),%
+ tc - 2*cosrad(sc)/(2*(abs(tc) + 1))
+ )%
+% A space tube governed by a helix
+ enddef;
+
+def zsurface( expr xc, yc ) =
+ ( xc, yc, cosd(xc*57)*cosd(yc*57)+4*mexp(-(xc**2+yc**2)*6.4) )
+enddef;
+
+f:=(8,1.5,1.5);
+Spread := 127;
+
+
+beginfig(1);
+ numeric Ns, Nt, lows, higs, lowt, higt, lowx, highx, lowy, highy,
+ facz, lowz, higz, base, topo;
+ path chair;
+ % for torus
+ f:=(4,1.5,1.5);
+ Spread:=150;
+ Ns = 16;
+ Nt= 16;
+ lows := 3.145*0.25;
+ higs := 3.145*1.75;
+ lowt = -3.145;
+ higt = 3.145;
+ facz=1;
+ lowz = -5;
+ higz = 5;
+ lowx:=-5;
+ lowy:=-5;
+ higx:=10;
+ higy:=7;
+%
+ NF:=0; %Initialize number of faces;
+%
+ partrimesh( Ns,Nt,lowt,higt,lows,higs,
+ lowx,higx,lowy,higy,lowz,higz,facz,parsurfacetwo );
+ lows := 3.145*0.5;
+ higs := 2.25*3.145; % new parameters and new surface
+ partrimesh( Ns,Nt,lowt,higt,lows,higs,
+ lowx,higx,lowy,higy,lowz,higz,facz,parsurface );
+ base = -1/facz;
+ topo = 1/facz;
+ chair = rp((-1,-1,base))--rp((1,-1,base))--rp((1,1,base))
+ --rp((-1,1,base))--rp((-1,-1,base))--rp((-1,-1,topo))
+ --rp((-1,1,topo))--rp((-1,1,base))--cycle;
+ draw_invisible( false,true,(blue+0.5green),0.6white);
+ draw bbox currentpicture;
+endfig;
+
+beginfig(2);
+ numeric Ns, Nt, lows, higs, lowt, higt, lowx, highx, lowy, highy,
+ facz, lowz, higz, base, topo;
+ path chair;
+
+ f := (6,0.5,3);
+ Spread:=150;
+
+ Ns = 19;
+ Nt= 19;
+ lows := -3.145;
+ higs := 3.145;
+ lowt = -3.145;
+ higt = 3.145;
+ facz = 2;
+ lowz = -2;
+ higz = 2;
+ lowx:=-5;
+ lowy:=-5;
+ higx:=5;
+ higy:=5;
+ NF:=0; %Initialize number of faces;
+%
+ partrimesh( Ns,Nt,lowt,higt,lows,higs,
+ lowx,higx,lowy,higy,lowz,higz,facz,parsurface );
+
+ nx := 27;
+ lowy := -7;
+ higy := 7;
+ lowx := -7;
+ higx := 7;
+ facz := 2;
+ lowz := -1;
+ higz := 5;
+ partrimesh( nx,nx,lowx,higx,lowy,higy,
+ lowx,higx,lowy,higy,lowz,higz,facz,zsurface);
+ base = -1/facz;
+ topo = 1/facz;
+ chair = rp((-1,-1,base))--rp((1,-1,base))--rp((1,1,base))
+ --rp((-1,1,base))--rp((-1,-1,base))--rp((-1,-1,topo))
+ --rp((-1,1,topo))--rp((-1,1,base))--cycle;
+ fill chair withcolor 0.9 blue+0.6white;
+ draw chair withcolor 0.1white ;
+ draw_invisible( false,false,(red+0.32blue),0.6white);
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/borderframetest.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/borderframetest.mp
new file mode 100644
index 00000000000..1c2331bdc17
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/borderframetest.mp
@@ -0,0 +1,28 @@
+% borderframetest.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+beginfig(0);
+ Spread := 45;
+
+ numeric theframefrach, theframefracw, Shifts;
+ path theframebord;
+ Shifts := 105mm;
+ theframefrach = 0.2927;
+ theframefracw = 0.39;
+ z1 = Shifts*(1-theframefracw,1-theframefrach);
+ z2 = Shifts*(1+theframefracw,1-theframefrach);
+ z3 = Shifts*(1+theframefracw,1+theframefrach);
+ z4 = Shifts*(1-theframefracw,1+theframefrach);
+ theframebord = z1--z2--z3--z4--cycle;
+ show z1;
+ show z2;
+ show z3;
+ show z4;
+ draw theframebord withcolor background withpen pencircle scaled 0;
+ clip currentpicture to theframebord;
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/conegetready.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/conegetready.mp
new file mode 100644
index 00000000000..17e7fea51b3
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/conegetready.mp
@@ -0,0 +1,36 @@
+% conegetready.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ numeric radiusin, fac, i, xcoor, ycoor, radc, numc, baz;
+ color refvec;
+ string rv, mrv, vgc, stra, strb, lrv;
+
+ f := (5,0.3,1.5);
+ Spread := 70;
+ radiusin = 0.3;
+ baz = 0.08;
+ fac = 3;
+ numc = 9;
+ radc = (fac-1)*radiusin*sind(180/numc);
+
+ i = 155;
+ xcoor := -radiusin*cosd(i);
+ ycoor := radiusin*sind(i);
+ refvec := (xcoor,-ycoor,baz);
+ rv := cstr( refvec );
+ mrv := cstr( -refvec );
+ lrv := cstr( (2*fac-1)*refvec );
+ vgc :="verygoodcone(true,fac*";
+ stra := vgc & rv & "," & mrv & "," & decimal(radc) & "," & rv & ")";
+ getready( stra, 0.5*(fac+1)*refvec );
+ strb := vgc & rv & "," & rv & "," & decimal(radc) & "," & lrv & ")";
+ getready( strb, 0.5*(3*fac-1)*refvec );
+ doitnow;
+ produce_vga_border;
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/doitnow.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/doitnow.mp
new file mode 100644
index 00000000000..7cfec23a39d
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/doitnow.mp
@@ -0,0 +1,33 @@
+% doitnow.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+f := 1.5*(1.5,0,1);
+Spread := 100;
+
+beginfig(1);
+ numeric stagelevel, holediam, outerdiam, stagemargin;
+ numeric numberofstagesidesquares, stagesidesize;
+ numeric centercoord;
+ color centerposdisc, centerpostorus, centerstage;
+ pickup pencircle scaled 3pt;
+ stagelevel = 0.2;
+ holediam = 0.6;
+ stagemargin = 0.2;
+ numberofstagesidesquares = 10;
+ centerstage = (-X(f),-Y(f),-stagelevel);
+ outerdiam = holediam+4*stagelevel;
+ stagesidesize = 2*( outerdiam + stagemargin );
+ centercoord = 0.3535*outerdiam;
+ HoriZon := -stagelevel;
+ centerpostorus = ( centercoord, -centercoord, 0 );
+ centerposdisc = ( -centercoord, centercoord, HoriZon );
+ getready("setthestage( numberofstagesidesquares, stagesidesize );",
+ centerstage);
+ getready("smoothtorus( centerpostorus, blue,0.5*holediam+stagelevel, stagelevel );",centerpostorus);
+ getready("rigorousdisc( 0.5*holediam, true, centerposdisc,0.5*outerdiam, 1.5*stagelevel*blue );",centerposdisc);
+ doitnow;
+endfig;
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/electricpotential.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/electricpotential.mp
new file mode 100644
index 00000000000..01caaab0c5e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/electricpotential.mp
@@ -0,0 +1,151 @@
+% electricpotential.mp
+% L. Nobre G.
+% 2004
+% PAY ATTENTION: THESE FIGURES ARE INDEPENDANT. CONDUCTOR SURFACE POTENTIAL
+% CHANGES UNDER THE INFLUENCE OF EXTERNAL CHARGES.
+
+%input featpost3Dplus2D;
+
+f := 16*(4,1,1);
+Spread := 35;
+LightSource := 10*(4,-3,4);
+ActuC := 2;
+
+numeric potlim, cac, cbc, ccc, cdc;
+potlim = 2;
+cac = 2;
+cbc = -2;
+ccc = 4;
+cdc = 1.5;
+pair cap, cbp, ccp;
+cap = (-2,-4);
+ccp = (-2,4);
+cbp = (2,0);
+numeric np, ssize;
+np = 56;
+ssize = 18;
+
+def zi( expr xc, yc ) =
+ 0
+enddef;
+
+def za( expr xc, yc ) =
+ begingroup
+ save out;
+ numeric dist, out;
+ dist = abs( (xc,yc)-cap );
+ if abs(dist) < 0.005:
+ if cac<0:
+ out = -potlim;
+ else:
+ out = potlim;
+ fi;
+ else:
+ out = cac/dist;
+ fi;
+ if out > potlim:
+ out := potlim;
+ elseif out < -potlim:
+ out := -potlim;
+ fi;
+ (out)
+ endgroup
+enddef;
+
+def zb( expr xc, yc ) =
+ begingroup
+ save out;
+ numeric dist, out;
+ dist = abs( (xc,yc)-cbp );
+ if abs(dist) < 0.005:
+ if cbc<0:
+ out = -potlim;
+ else:
+ out = potlim;
+ fi;
+ else:
+ out = cbc/dist + za( xc, yc );
+ fi;
+ if out > potlim:
+ out := potlim;
+ elseif out < -potlim:
+ out := -potlim;
+ fi;
+ (out)
+ endgroup
+enddef;
+
+def zc( expr xc, yc ) =
+ begingroup
+ save out;
+ numeric dist, out;
+ dist = abs( (xc,yc)-ccp );
+ if abs(dist) < 0.005:
+ if ccc<0:
+ out = -potlim;
+ else:
+ out = potlim;
+ fi;
+ else:
+ out = ccc/dist + zb( xc, yc );
+ fi;
+ if out > potlim:
+ out := potlim;
+ elseif out < -potlim:
+ out := -potlim;
+ fi;
+ (out)
+ endgroup
+enddef;
+
+def zd( expr xc, yc ) =
+ begingroup
+ save out;
+ numeric dist, out, i, tmp;
+ pair poi;
+ tmp = 0;
+ for i=0 upto np:
+ poi := (i/np)[cap,ccp];
+ dist := abs( (xc,yc)-poi );
+ if abs(dist) < 0.005:
+ if cdc<0:
+ out := -potlim;
+ else:
+ out := potlim;
+ fi;
+ else:
+ out := cdc/dist/np;
+ fi;
+ tmp := tmp+out;
+ endfor;
+ tmp := tmp + zc( xc, yc );
+ if tmp > potlim:
+ tmp := potlim;
+ elseif tmp < -potlim:
+ tmp := -potlim;
+ fi;
+ (tmp)
+ endgroup
+enddef;
+
+beginfig(0);
+ hexagonaltrimesh( false, np, ssize, zi );
+endfig;
+
+beginfig(1);
+ hexagonaltrimesh( false, np, ssize, za );
+endfig;
+
+beginfig(2);
+ hexagonaltrimesh( false, np, ssize, zb );
+endfig;
+
+beginfig(3);
+ hexagonaltrimesh( false, np, ssize, zc );
+endfig;
+
+beginfig(4);
+ hexagonaltrimesh( false, np, ssize, zd );
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/emptylines.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/emptylines.mp
new file mode 100644
index 00000000000..df8e02695dd
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/emptylines.mp
@@ -0,0 +1,28 @@
+% emptylines.mp
+% L. Nobre G.
+% 2001
+
+%input featpost3Dplus2D;
+
+
+def closec( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cblu, param;
+ par1 = 360;
+ par2 = 0.3;
+ param = 360*TheVal;
+ cred = par2*cosd( param );
+ cblu = par2*sind( param );
+ ( (cred,cblu,1) )
+ endgroup
+enddef;
+
+f := (4,3,2);
+Spread := 170;
+ShadowOn := true;
+
+beginfig(1);
+ emptyline( true, 1, black, 0.5background, 360, 0.88, 2, closec );
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/experimental.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/experimental.mp
new file mode 100644
index 00000000000..106e7574f2a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/experimental.mp
@@ -0,0 +1,177 @@
+% experimental.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+%verbatimtex
+%\documentclass{article}
+%\usepackage{beton}
+%\usepackage{concmath}
+%\usepackage{ccfonts}
+%\begin{document}
+%etex
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+f := (4.5,-6,5);
+
+beginfig(1);
+ numeric len[], ray[];
+ color axe[], pos[], fix[], lab[];
+ color reflabpos, reflabpoi, lincolor;
+ picture txt[], dashpatt;
+ numeric inclang, aberang, sampang, stepang;
+ numeric squside, sqlevel, ul, outermagpos;
+ numeric innerray, polesep, fracone, fracsam;
+ numeric labelscale;
+ path tmpath, aupath, copath;
+
+ pickup pencircle scaled 1.2pt;
+ dashpatt = evenly scaled 3;
+ inclang = 150;
+ aberang = 17;
+ sampang = 30;
+ stepang = 20;
+ ul = 0.1;
+ labelscale = 5;
+ outermagpos = 30ul;
+ squside = outermagpos;
+ sqlevel = -20ul;
+ polesep = 15ul;
+ fracone = 0.33;
+ fracsam = 0.86;
+ ray1 = 10ul;
+ ray2 = 6ul;
+ ray3 = 8ul;
+ ray4 = 1.5ul;
+ ray5 = 4ul;
+ ray6 = 3ul;
+ ray7 = 3.5ul;
+ ray8 = 2ul;
+ len3 = 7ul;
+ len4 = 20ul;
+ len5 = 3ul;
+ len7 = 3.5ul;
+ len8 = 7ul;
+ lincolor = 0.5background;
+
+ reflabpos = ( -squside, 0, -sqlevel );
+ reflabpoi = ( -squside, squside, -sqlevel );
+ V1 := (squside,squside,sqlevel);
+ V2 := (-squside,squside,sqlevel);
+ V3 := (-squside,-squside,sqlevel);
+ V4 := (squside,-squside,sqlevel);
+% makeface1(1,2,3,4);
+
+ len1 = (1-fracone)*(outermagpos-ray5-polesep);
+ pos1 = (-outermagpos,0,0);
+ rigorousdisc( 0, true, pos1, ray1, len1*(1,0,0) );
+
+ len2 = fracone*(outermagpos-ray5-polesep);
+ pos2 = (len1-outermagpos,0,0);
+ tmpath := goodcirclepath( pos2, (1,0,0), ray1 );
+ aupath := goodcirclepath( (-ray5-polesep,0,0), (1,0,0), ray2 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+ lab2 = reflabpos;
+ txt2 = thelabel.top( btex magneto etex scaled labelscale, rp( lab2 ) );
+ draw txt2;
+ fix2 = (-outermagpos+0.5len1,0,ray1);
+ draw llcorner txt2--lrcorner txt2--rp(fix2) withcolor lincolor;
+
+ axe3 = ( 0, cosd( inclang ), sind( inclang ) );
+ pos3 = -( len3 + len4 + len5 )*axe3;
+ rigorousdisc( 0, true, pos3, ray3, len3*axe3 );
+ lab3 = (1-fracone)*reflabpoi+fracone*V1;
+ txt3 = thelabel.rt( btex rotor etex scaled labelscale, rp( lab3 ) );
+ draw txt3;
+
+ axe4 = axe3;
+ pos4 = -( len4 + len5 )*axe4;
+ rigorousdisc( 0, true, pos4, ray4, len4*axe4 );
+
+ fix3 = pos4+fracsam*ray3*(0,cosd( inclang -90 ),sind( inclang -90 ));
+ draw lrcorner txt3--llcorner txt3--rp(fix3) withcolor lincolor;
+
+ axe5 = axe3;
+ pos5 = -( len5 )*axe5;
+ rigorousdisc( 0, true, pos5, ray5, len5*axe5 );
+ lab5 = (1-fracone)*reflabpoi+fracone*V2;
+ txt5 = thelabel.rt( btex porta-amostras etex scaled labelscale, rp( lab5 ) );
+ draw txt5;
+ fix5 = fracsam*ray5*(0,cosd( inclang -90 ),sind( inclang -90 ));
+ draw lrcorner txt5--llcorner txt5--rp(fix5) withcolor lincolor;
+
+ V5 := fracsam*ray5*( sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ V6 := fracsam*ray5*( -sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ V8 := fracsam*ray5*( sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ V7 := fracsam*ray5*( -sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ draw rp(V5)--rp(V6)--rp(V7)--rp(V8)--cycle;
+
+ axe6 = ( 0, cosd( inclang+aberang ), sind( inclang+aberang ) );
+ pos6 = ray1*axe6;
+ len6 = len4;
+ axe7 = ( 0, cosd( inclang-aberang ), sind( inclang-aberang ) );
+ pos7 = ( ray1 + 0.5len6 )*axe7;
+ draw rp(pos6)--rp((0,0,0))--rp(pos7) dashed dashpatt;
+ rigorousdisc( 0, true, pos6, ray6, len6*axe6 );
+ lab6 = fracone*reflabpos+(1-fracone)*V3;
+ txt6 = thelabel.lft( btex telemicrosc\'{o}pio etex scaled labelscale, rp( lab6 ) );
+ draw txt6;
+ fix6 = pos6+len6*axe6;
+ draw llcorner txt6--lrcorner txt6--rp(fix6) withcolor lincolor;
+
+ pos8 = pos7+len7*axe7;
+ tmpath := goodcirclepath( pos7, axe7, ray7 );
+ aupath := goodcirclepath( pos8, axe7, ray8 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ axe8 = axe7;
+ rigorousdisc( 0, true, pos8, ray8, len8*axe8 );
+ lab8 = (1-fracone)*reflabpos+fracone*V3;
+ txt8 = thelabel.lft( btex l\^{a}mpada etex scaled labelscale, rp( lab8 ) );
+ draw txt8;
+ fix8 = pos8+len8*axe8;
+ draw llcorner txt8--lrcorner txt8--rp(fix8) withcolor lincolor;
+
+ len9 = len2;
+ pos9 = (ray5+polesep,0,0);
+ ray9 = ray2;
+ ray10 = ray1;
+ tmpath := goodcirclepath( pos9, (1,0,0), ray9 );
+ pos10 = pos9+len9*(1,0,0);
+ aupath := goodcirclepath( pos10, (1,0,0), ray10 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ len10 = len1;
+ rigorousdisc( 0, true, pos10, ray10, len10*(1,0,0) );
+
+ produce_auto_scale;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/fieldlines.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/fieldlines.mp
new file mode 100644
index 00000000000..bcb018a0f7f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/fieldlines.mp
@@ -0,0 +1,59 @@
+% fieldlines.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+Spread := 30;
+f := (10,0,0);
+
+color posa, posb;
+numeric kfac;
+posa = -5*green;
+posb = 5*green;
+kfac = 2.5;
+
+def vecfunc( expr posit )=
+ begingroup
+ save modula, modulb, field;
+ color field;
+ numeric modula, modulb;
+ modula = conorm( posit-posa );
+ modulb = conorm( posit-posb );
+ field = ( posit-posa )/(modula**3)+kfac*( posit-posb )/(modulb**3);
+ ( field )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, lena, lenb, numa, numb, sa, sb, diffstep, ray;
+ color stp;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 105;
+ lenb = 145;
+ numa = 72;
+ numb = 30;
+ diffstep = 1;
+ ray = 0.5;
+ sa = 36;
+ sb = 75;
+ for i=sa step numa until (360+sa):
+ stp := posa+( 0, ray*cosd(i), ray*sind(i) );
+ oneline := fieldlinepath( lena, stp, diffstep, vecfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ for i=sb step numb until (360+sb):
+ stp := posb+( 0, ray*cosd(i), ray*sind(i) );
+ oneline := fieldlinepath( lenb, stp, diffstep, vecfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(posa) withpen grossa;
+ draw rp(posb) withpen grossa;
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/fis3prey.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/fis3prey.mp
new file mode 100644
index 00000000000..c1b32219687
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/fis3prey.mp
@@ -0,0 +1,128 @@
+% fis3prey.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ Spread := 50;
+ f := (4,6,3.5);
+ path malhacub, rama, ramb, ramc, malhatet;
+ pen grossa, nuclear, negat;
+ color p[];
+ numeric lengax, lscal, arrowmarg, arrowshift;
+ pair tx, ty, tz;
+ lengax = 0.7;
+ lscal = 2;
+ arrowshift = 0.85;
+ arrowmarg = 0.13;
+ grossa = pencircle scaled 2.7pt;
+ nuclear = pencircle scaled 2.1pt;
+ negat = pencircle scaled 1.8pt;
+ p1 = (1,1,-1);
+ p2 = (-1,1,-1);
+ p3 = (-1,-1,-1);
+ p4 = (1,-1,-1);
+ p5 = (1,1,1);
+ p6 = (-1,1,1);
+ p7 = (-1,-1,1);
+ p8 = (1,-1,1);
+
+ p0 = p2 + arrowshift*N((1,0,1)) + arrowmarg*N((-1,0,1));
+ p9 = p5 - arrowshift*N((1,0,1)) + arrowmarg*N((-1,0,1));
+
+ z1 = rp(p1);
+ z2 = rp(p2);
+ z3 = rp(p3);
+ z4 = rp(p4);
+ z5 = rp(p5);
+ z6 = rp(p6);
+ z7 = rp(p7);
+ z8 = rp(p8);
+
+ z0 = rp(p0);
+ z9 = rp(p9);
+
+ tx = rp( p1 - (lengax,0,0) );
+ ty = rp( p1 - (0,lengax,0) );
+ tz = rp( p1 + (0,0,lengax) );
+
+ malhacub = z1--z2--z3--z4--z1--z5--z6--z7--z8--z5;
+ malhatet = z2--z7--z4--z5--cycle;
+ rama = z2--z6;
+ ramb = z3--z7;
+ ramc = z4--z8;
+ drawoptions( dashed evenly );
+ draw malhacub;
+ draw rama;
+ draw ramb;
+ draw ramc;
+ drawoptions( withpen grossa );
+ draw malhatet;
+
+ drawarrow z1--tx withpen negat;
+ drawarrow z1--ty withpen negat;
+ drawarrow z1--tz withpen negat;
+ label.lrt(btex $x$ etex scaled lscal, tx);
+ label.llft(btex $y$ etex scaled lscal, ty);
+ label.lft(btex $z$ etex scaled lscal, tz);
+ drawarrow z0--z9 withpen negat;
+endfig;
+
+beginfig(2);
+ Spread := 50;
+ f := 2.3*(6,2,3.5);
+ numeric lang, cray, lpos, llen, smar;
+ path circ, rigcirc, lone, ltwo, carrpath;
+ pen pena, penb, penc;
+ pena = pencircle scaled 1.3mm;
+ penb = pencircle scaled 0.95mm;
+ penc = pencircle scaled 0.4mm;
+ color outcol, incol;
+ outcol = black;
+ incol = 0.876white;
+ lang = 30;
+ cray = 1;
+ lpos = 0.57;
+ llen = 2.2;
+ smar = 0.15;
+ circ = goodcirclepath( black, green, cray );
+ rigcirc = rigorouscircle( black, green, cray+smar );
+ carrpath = subpath (3.2,4.5) of rigcirc;
+ lone = rp((-lpos,llen*cosd(lang),llen*sind(lang)))
+ --rp(-(lpos,llen*cosd(lang),llen*sind(lang)));
+ ltwo = rp((lpos,-llen*cosd(lang),llen*sind(lang)))
+ --rp((lpos,llen*cosd(lang),-llen*sind(lang)));
+ drawarrow carrpath withpen penc withcolor outcol;
+ draw circ withpen pena withcolor outcol;
+ draw circ withpen penb withcolor incol;
+ draw rp((-cray,0,0))--rp((-lpos,0,0)) dashed evenly;
+ draw lone withpen pena withcolor outcol;
+ draw lone withpen penb withcolor incol;
+ draw rp((lpos,0,0))--rp((-lpos,0,0)) dashed evenly;
+ draw rp((0,0,-cray))--rp((0,0,cray)) dashed evenly;
+ draw ltwo withpen pena withcolor outcol;
+ draw ltwo withpen penb withcolor incol;
+ draw rp((cray,0,0))--rp((lpos,0,0)) dashed evenly;
+ draw subpath (1,15) of circ withpen pena withcolor outcol;
+ draw subpath (0,16) of circ withpen penb withcolor incol;
+
+
+
+% label.top( btex $+$ etex, point 3 of rigcirc );
+
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/frustum.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/frustum.mp
new file mode 100644
index 00000000000..90da3d74440
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/frustum.mp
@@ -0,0 +1,46 @@
+% frustum.mp
+% L. Nobre G.
+% IYP (2005)
+
+verbatimtex
+\documentclass{article}
+\begin{document}
+{\sffamily
+etex
+
+beginfig(1);
+% f := (5,3,4);
+ f := (5,3,0.4);
+% f := (5,3,-0.4);
+ numeric labscal;
+ picture labsa, labba, labsb, labd, labc;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ labsa = btex $\vec{S}_1$ etex scaled labscal;
+ labsb = btex $\vec{S}_2$ etex scaled labscal;
+ labba = btex $\vec{B}_1$ etex scaled labscal;
+ labd= btex $D$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ whatisthis( black, 0.5red, green, 0.85, 0.8 );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(0.85blue);
+ label.rt( labd, rp(0.4blue) );
+ drawarrow rp(black)--rp(0.5red);
+ label.ulft( labsa, rp(0.25red) );
+ drawarrow rp(black)--rp(green);
+ label.top( labba, rp((0,0.5,0)) );
+ drawarrow rp(0.85blue)--rp(0.8*0.5*red+0.85blue);
+ label.ulft( labsb, rp(0.2red+0.85blue) );
+ dotlabel.bot( labc, rp(black) );
+endfig;
+
+verbatimtex
+}
+\end{document}
+etex
+
+end.
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/geom_casq.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/geom_casq.mp
new file mode 100644
index 00000000000..bdc52c58d89
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/geom_casq.mp
@@ -0,0 +1,84 @@
+% geom_casq.mp
+% L. Nobre G.
+% 1999
+
+%input featpost3Dplus2D;
+
+%input la3Dmacros;
+%input hlr3Dmacros;
+%input plan2Dmacros;
+%
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+
+ f := (1.7,1.2,1);
+
+ Spread := 150;
+
+ color gridvec, sizevec, currpos, starpos, bordpos, orig, axxc, ayyc, azzc;
+ numeric alphamax, long, base, thetamax;
+ axxc = (0.8,0,0);
+ ayyc = (0,0.7,0);
+ azzc = (0,0,0.4);
+ sizevec := (11,9,9);
+ gridvec := (0.1,0.1,0.1);
+ thetamax := 50;
+ alphamax := 70;
+ long := 0.65;
+ base := 0.3;
+ starpos := ( -0.5*X(gridvec)*(X(sizevec)-1) ,
+ -0.5*Y(gridvec)*(Y(sizevec)-1) ,
+ -0.5*Z(gridvec)*(Z(sizevec)-1) );
+ bordpos := starpos - 0.5*gridvec;
+ orig := starpos + 0.5*gridvec + (0.05,0,-0.1);
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ npf2 := 4;
+ F2p1 := (X(bordpos),Y(bordpos), -Z(bordpos));
+ F2p2 := (X(bordpos),-Y(bordpos), -Z(bordpos));
+ F2p3 := (-X(bordpos),-Y(bordpos), -Z(bordpos));
+ F2p4 := (-X(bordpos),Y(bordpos), -Z(bordpos));
+ NF := 2;
+
+ pickup pencircle scaled 1pt;
+ drawarrow rp(orig)..rp(orig+axxc);
+ drawarrow rp(orig)..rp(orig+ayyc);
+ drawarrow rp(orig)..rp(orig+azzc);
+ label.bot(btex z etex,rp(orig+axxc));
+ label.bot(btex x etex,rp(orig+ayyc));
+ label.lft(btex y etex,rp(orig+azzc));
+ pickup pencircle scaled 1.5pt;
+
+ starpos := (base,0,0)+orig;
+ drawarrow rp(orig)..rp(starpos);
+ label.bot(btex $\vec{n}_0$ etex,rp(starpos));
+
+ currpos := starpos;
+ starpos := long*(cosd(alphamax),sind(alphamax),0)+orig;
+ drawarrow rp(orig)..rp(starpos);
+ label.bot(btex $\vec{H}$ etex,rp(starpos));
+ angline(starpos,currpos,orig,0.55,btex $\alpha$ etex,bot);
+
+ starpos := base*(cosd(thetamax),sind(thetamax),0)+orig;
+ drawarrow rp(orig)..rp(starpos);
+ label.bot(btex $\vec{n}$ etex,rp(starpos));
+ angline(starpos,currpos,orig,0.2,btex $\theta$ etex,bot);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/geom_freder.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/geom_freder.mp
new file mode 100644
index 00000000000..9a834001aab
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/geom_freder.mp
@@ -0,0 +1,94 @@
+% geom_freder.mp
+% L. Nobre G.
+% 2000
+
+%input featpost3Dplus2D;
+
+verbatimtex \documentclass{article} \usepackage{beton} \usepackage{concmath} \usepackage{ccfonts} \begin{document} etex
+
+beginfig(1);
+
+ f := (1.7,1.2,1);
+
+ Spread := 250;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, long, base, thetamax;
+ path closingface;
+ sizevec := (11,9,7);
+ gridvec := (0.1,0.1,0.1);
+ thetamax := 50;
+ long := 0.08;
+ base := 0.1;
+ starpos := ( -0.5*X(gridvec)*(X(sizevec)-1) ,
+ -0.5*Y(gridvec)*(Y(sizevec)-1) ,
+ -0.5*Z(gridvec)*(Z(sizevec)-1) );
+ bordpos := starpos - 0.5*gridvec;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ npf2 := 4;
+ F2p1 := (X(bordpos),Y(bordpos), -Z(bordpos));
+ F2p2 := (X(bordpos),-Y(bordpos), -Z(bordpos));
+ F2p3 := (-X(bordpos),-Y(bordpos), -Z(bordpos));
+ F2p4 := (-X(bordpos),Y(bordpos), -Z(bordpos));
+ NF := 2;
+ draw facepath(1);
+ counter := 1;
+ for i= X(sizevec) upto X(sizevec):
+ for j=1 upto Y(sizevec):
+ for k=1 upto Z(sizevec):
+ phi := 0;
+ theta := 0;
+ currpos := starpos+( (i-1)*X(gridvec) ,
+ (j-1)*Y(gridvec) ,
+ (k-1)*Z(gridvec) );
+ phi := thetamax*cosd(90*Z(currpos)/abs(Z(starpos)));
+ theta := 90+thetamax*cosd(90*Z(currpos)/abs(Z(starpos)));
+ generatedirline( counter, phi, theta, long, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ for i=1 upto X(sizevec)-1:
+ for j=Y(sizevec) upto Y(sizevec):
+ for k=1 upto Z(sizevec):
+ phi := 0;
+ theta := 0;
+ currpos := starpos+( (i-1)*X(gridvec) ,
+ (j-1)*Y(gridvec) ,
+ (k-1)*Z(gridvec) );
+ phi := thetamax*cosd(90*Z(currpos)/abs(Z(starpos)));
+ theta := 90+thetamax*cosd(90*Z(currpos)/abs(Z(starpos)));
+ generatedirline( counter, phi, theta, long, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NL := decr(counter);
+ director_invisible( true, base, false );
+ closingface = facepath(2);
+ fill closingface withcolor background;
+ draw closingface;
+ pickup pencircle scaled 1pt;
+ currpos := (-X(bordpos)+X(gridvec),Y(bordpos), Z(bordpos));
+ starpos := (-X(bordpos)+X(gridvec),Y(bordpos)+4*Y(gridvec), Z(bordpos));
+ drawarrow rp(currpos)..rp(starpos);
+ label.bot(btex $y$ etex,rp(starpos));
+ currpos := (-X(bordpos)+X(gridvec),Y(bordpos), Z(bordpos));
+ starpos := (-X(bordpos)+X(gridvec),Y(bordpos), Z(bordpos)+4*Z(gridvec));
+ drawarrow rp(currpos)..rp(starpos);
+ label.lft(btex $z$ etex,rp(starpos));
+ currpos := (X(bordpos),-Y(bordpos)+Y(gridvec), Z(bordpos));
+ starpos := (X(bordpos)+4*X(gridvec),-Y(bordpos)+Y(gridvec), Z(bordpos));
+ drawarrow rp(currpos)..rp(starpos);
+ label.bot(btex $x$ etex,rp(starpos));
+
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/graphexample.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/graphexample.mp
new file mode 100644
index 00000000000..6591ed5d0f9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/graphexample.mp
@@ -0,0 +1,16 @@
+% graphexample.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+input mp-tool;
+
+beginfig(1);
+ path thezigzag;
+ thezigzag = zigzagfrontier( origin, (200,200), 17,
+ 4, 20, 16, 12, blue, background );
+ draw thezigzag;
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/lcurvature.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/lcurvature.mp
new file mode 100644
index 00000000000..ca6d5670457
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/lcurvature.mp
@@ -0,0 +1,114 @@
+% lcurvature.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ f := (5,3,4);
+ Spread := 70;
+ numeric gridstep, anglstep, cylength, cyradius, numcylis;
+ numeric i, j, curcoord, vcx, vcy, vcz, curangle, curnorma;
+ numeric major, othcoord, othangle;
+ color base, lenvec;
+ cylength := 0.1;
+ cyradius := 0.3;
+ gridstep := cyradius*2.2;
+ anglstep := 10;
+ numcylis := 5;
+ major := 0.35*gridstep*numcylis;
+ for i=1 upto numcylis: % bend
+ curnorma := i-0.5*(numcylis+1);
+ curangle := curnorma*anglstep;
+ vcx := cylength*cosd(curangle);
+ vcy := 0;
+ vcz := cylength*sind(curangle);
+ base := major*(sind(curangle),-1,-cosd(curangle));
+ lenvec := (vcx,vcy,vcz);
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ for i=1 upto numcylis: % twist
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := curnorma*anglstep;
+ vcx := 0;
+ vcy := cylength*sind(curangle);
+ vcz := cylength*cosd(curangle);
+ base := (curcoord,-vcy/2-major,-vcz/2+major);
+ lenvec := (vcx,vcy,vcz);
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ for i=1 upto numcylis: % splay
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := curnorma*anglstep;
+ vcx := cylength*sind(curangle);
+ vcy := 0;
+ vcz := -cylength*cosd(curangle);
+ lenvec := (vcx,vcy,vcz);
+ for j=1 upto numcylis:
+ othcoord := (j-0.5*(numcylis+1))*gridstep;
+ base := major*(0,1,-cosd(curangle));
+ base := base +(curcoord,othcoord,0);
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ endfor;
+ for i=1 upto numcylis: % saddle
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := curnorma*anglstep;
+ vcx := cylength*sind(curangle);
+ for j=1 upto numcylis:
+ othcoord := (j-0.5*(numcylis+1))*gridstep;
+ othangle := (j-0.5*(numcylis+1))*anglstep;
+ vcy := -cylength*sind(othangle);
+ vcz := -cylength*cosd(curangle)*cosd(othangle);
+ base := major*(0,1,1-cosd(curangle)+cosd(othangle));
+ base := base + (curcoord,othcoord,0);
+ lenvec := (vcx,vcy,vcz);
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ endfor;
+endfig;
+
+beginfig(2);
+ f := (5,3,4);
+ Spread := 70;
+ numeric gridstep, cylength, cyradius, numcylis;
+ numeric i, j, curcoord, curangle, curnorma;
+ numeric othcoord, othangle, zcoord, coef, othnorma;
+ color base, lenvec;
+ cylength := 0.1;
+ cyradius := 0.3;
+ gridstep := cyradius*2.2;
+ numcylis := 5;
+ coef := 0.32;
+ for i=1 upto numcylis: % splay
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := -curcoord*2*coef;
+ for j=1 upto numcylis:
+ othnorma := j-0.5*(numcylis+1);
+ othcoord := othnorma*gridstep;
+ othangle := -othcoord*2*coef;
+ zcoord := -coef*(othcoord**2+curcoord**2);
+ base := (curcoord,othcoord,zcoord);
+ lenvec := cylength*N((-curangle,-othangle,1));
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ endfor;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/mptoolcone.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/mptoolcone.mp
new file mode 100644
index 00000000000..4053632efb5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/mptoolcone.mp
@@ -0,0 +1,49 @@
+% mptoolcone.mp
+% L. Nobre G.
+% Y2K
+
+%input featpost3Dplus2D;
+
+input mp-tool;
+
+ defaultscale := 1.1;
+% defaultfont := "putr8r";
+ defaultfont := "bchr8r";
+
+beginfig(0);
+ color orig, axxc, ayyc, azzc;
+ color nalfa, gammacnt;
+ path gamma, cone, mybox;
+ numeric theta, radius, xxsize, yysize, zzsize;
+ picture mypict;
+
+ f := (3,4,2);
+ Spread := 100;
+ xxsize = 0.8;
+ yysize = 0.8;
+ zzsize = 1.0;
+ theta = 25;
+
+ orig = (0,0,0);
+ mypict = thelabel("Texto com acentuaçăo.",rp(orig));
+ mybox = bbox mypict;
+ draw mypict;
+ draw mybox;
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+ nalfa = (0,sind(theta),cosd(theta));
+ gammacnt = cosd(theta)*cosd(theta)*nalfa;
+ radius := cosd(theta)*sind(theta);
+ gamma = rigorouscircle( gammacnt, nalfa, radius );
+ cone = rigorouscone(true, gammacnt, nalfa, radius, (xxsize,yysize,0) );
+ draw gamma dashed evenly;
+ draw cone;
+ drawarrow rp(orig)..rp(axxc);
+ drawarrow rp(orig)..rp(ayyc);
+ drawarrow rp(orig)..rp(azzc);
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/nembends.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nembends.mp
new file mode 100644
index 00000000000..5900e88d187
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nembends.mp
@@ -0,0 +1,48 @@
+% nembends.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+%input mp-tool;
+
+beginfig(1);
+ f := 2*(5,3,4);
+ Spread := 70;
+
+ numeric hsdev, basestep, basxstep, basesdev;
+ numeric i, j, k, coesdev, cylength, cyradius, basen;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, aone;
+ numeric atwo, zcurr, coestep, angsdev, basxsdev;
+ color lenvec, currpos;
+
+
+ coestep := -0.15;
+ cylength := 0.6;
+ cyradius := 0.1;
+ basen := 3;
+ basestep := cylength*1.6;
+ basxstep := cyradius*4;
+ basesdev := basestep*0.001;
+ basxsdev := basxstep*0.001;
+ hsdev := 0.005;
+ coesdev := 0.001;
+ angsdev := 0.02;
+ for i=-basen upto basen:
+ for j=-basen upto basen:
+ xcurr := i*basxstep + basxsdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ zcurr := ycurr**2*coestep + coesdev*normaldeviate;
+ aone := angsdev*normaldeviate;
+ atwo :=angle(1,ycurr*2*coestep)+angsdev*normaldeviate;
+ vcz := cosd( aone )*sind( atwo );
+ vcy := cosd( aone )*cosd( atwo );
+ vcx := sind( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ rigorousdisc(0,true,currpos-0.5*lenvec,cyradius,lenvec);
+ endfor;
+ endfor;
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemdirector.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemdirector.mp
new file mode 100644
index 00000000000..4c1d88fe095
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemdirector.mp
@@ -0,0 +1,82 @@
+% nemdirector.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+%\usepackage{mathpazo}
+\begin{document}
+etex
+
+beginfig(1);
+ f := 2*(5,3,4);
+ Spread := 70;
+
+ numeric cylength, cyradius, zoneradi, zoneleng;
+ numeric i, angsdev, halfnum, directlen, arrthick;
+ numeric vcx, vcy, vcz, xcurr, ycurr, thickfact;
+ numeric atwo, zcurr, aone, apos;
+ color lenvec, currpos, tippos;
+ path arrpath;
+ picture tmppict;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Nu
+ cylength := 0.45;
+ cyradius := 0.1;
+ zoneradi := 2;
+ zoneleng := 4;
+ directlen := 5.6;
+ angsdev := 12;
+ halfnum := 130;
+ thickfact := 5;
+ arrthick := Spread*ps( (0,0,0), thickfact );
+ tippos := (0,0,0.5*directlen);
+ arrpath := rp(-tippos)--rp(tippos);
+ ahlength := 3*arrthick;
+ ahangle := 40;
+ for i=1 upto halfnum:
+ zcurr := -0.5*zoneleng+uniformdeviate( zoneleng );
+ apos := uniformdeviate( 180 );
+ xcurr := -zoneradi*cosd( apos )*uniformdeviate( 1 );
+ ycurr := zoneradi*sind( apos )*uniformdeviate( 1 );
+ aone := uniformdeviate( 360 );
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ generatedirline( i, aone, 90-atwo, cylength, currpos );
+ endfor;
+ NL:= halfnum;
+ director_invisible( true, thickfact, false );
+ drawarrow arrpath withpen pencircle scaled arrthick;
+ for i=1 upto halfnum:
+ zcurr := -0.5*zoneleng+uniformdeviate( zoneleng );
+ apos := uniformdeviate( 180 );
+ xcurr := zoneradi*cosd( apos )*uniformdeviate( 1 );
+ ycurr := zoneradi*sind( apos )*uniformdeviate( 1 );
+ aone := uniformdeviate( 360 );
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ generatedirline( i, aone, 90-atwo, cylength, currpos );
+ endfor;
+ NL:= halfnum;
+ director_invisible( true, thickfact, false );
+ label.ulft(btex $\vec{n}$ etex scaled 8.5 rotated 90, rp(tippos) );
+ tmppict := currentpicture rotated -90;
+ currentpicture := nullpicture;
+ draw tmppict;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemquira.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemquira.mp
new file mode 100644
index 00000000000..41caf4578a6
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemquira.mp
@@ -0,0 +1,60 @@
+% nemquira.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+
+
+beginfig(1);
+ f := 7*(1,2,1);
+ Spread := 70;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, angstep, counter;
+ color lenvec, currpos;
+
+ angstep := 20;
+ cylength := 0.45;
+ cyradius := 0.1;
+ basen := 4.5;
+ hn := 1;
+ basestep := cylength*1.37;
+ hstep := basestep;
+ basesdev := basestep*0.05;
+ hsdev := basesdev;
+ hbase := -0.8;
+ angsdev := 4;
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ counter := 0;
+ for i=-basen upto basen:
+ for j=-basen upto basen:
+ hcurr := hbase;
+ forever:
+ exitunless hcurr < hmax+hbase;
+ hcurr := hcurr + hstep;
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := angsdev*normaldeviate;
+ atwo := j*angstep + angsdev*normaldeviate;
+ vcz := sind( atwo+90 );
+ vcy := cosd( atwo+90 )*sind( aone );
+ vcx := cosd( atwo+90 )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ counter := incr(counter);
+ generatedirline( counter, aone, 90+atwo, cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, 5, false );
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemquirapitch.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemquirapitch.mp
new file mode 100644
index 00000000000..d29f0ffeb10
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemquirapitch.mp
@@ -0,0 +1,69 @@
+% nemquirapitch.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ f := 7*(1,2,1);
+ Spread := 70;
+ ahlength := 3mm;
+ ahangle := 48;
+
+ numeric hsdev, basestep, basemax, basesdev, xpos;
+ numeric i, j, angsdev, cylength, cyradius, basen;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, aone;
+ numeric atwo, zcurr, angstep, counter, linelen;
+ color lenvec, currpos;
+
+ angstep := 20;
+ cylength := 0.45;
+ cyradius := 0.1;
+ basen := 4.5;
+ basestep := cylength*1.37;
+ basesdev := basestep*0.05;
+ hsdev := basesdev;
+ angsdev := 4;
+ linelen := cylength;
+
+ basemax := basen*basestep;
+ xpos := -(basen+1)*basestep;
+ draw rp((-xpos-0.5*cylength,-basemax,0))--rp((-xpos+0.5*cylength,-basemax,0));
+ draw rp((-xpos-0.5*cylength,basemax,0))--rp((-xpos+0.5*cylength,basemax,0));
+ drawdblarrow rp((-xpos,-basemax,0))--rp((-xpos,basemax,0));
+ label.urt( btex $\frac{p}{2}$ etex scaled 2.5, rp((-xpos,0,0)) );
+ counter := 0;
+ for i=-basen upto basen:
+ for j=-basen upto basen:
+ zcurr := hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := angsdev*normaldeviate;
+ atwo := j*angstep + angsdev*normaldeviate;
+ vcz := sind( atwo+90 );
+ vcy := cosd( atwo+90 )*sind( aone );
+ vcx := cosd( atwo+90 )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ counter := incr(counter);
+ generatedirline( counter, aone, 90+atwo, cylength, currpos );
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, 5, false );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemuniax.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemuniax.mp
new file mode 100644
index 00000000000..b2ebec11c8f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/nemuniax.mp
@@ -0,0 +1,61 @@
+% nemuniax.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ f := 2*(5,3,4);
+ Spread := 70;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, counter;
+ color lenvec, currpos;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Nu
+ cylength := 0.6;
+ cyradius := 0.1;
+ basen := 12;
+ hn := 5;
+ basestep := cyradius*3.1;
+ hstep := cylength*1.5;
+ basesdev := cyradius*0.1;
+ hsdev := hstep*0.2;
+ hbase := -0.8;
+ angsdev := 12;
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ hcurr := hbase;
+ forever:
+ exitunless hcurr < hmax+hbase;
+ hcurr := hcurr + hstep;
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := uniformdeviate( 360 );
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+% generateonebiax( counter, aone, 90-atwo, cylength,
+% -60, 0.25*cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, 5, false );
+% director_invisible( false, 5, true );
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/pathernon.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/pathernon.mp
new file mode 100644
index 00000000000..8b3d8b56140
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/pathernon.mp
@@ -0,0 +1,65 @@
+% pathernon.mp
+% L. Nobre G.
+% 2004
+
+beginfig(0);
+ f := (4.8,3,3.65);
+ viewcentr := black;
+ Spread := 50;
+ horiZon := 0;
+ ShadowOn := false;
+ LightSource := (1,-1,7);
+ SphericalDistortion := true;
+ OverRidePolyhedricColor := true;
+ numeric side, coluheight, blocheight, roofheight, coluray, fact;
+ numeric acroside, acronum, auxa, raya, rayb , poshemi, lena, lenb;
+ color roofcenter, ba, bb, bc, bd, coluvec, colucen, auxb, auxc, auxd;
+ side = 1;
+ roofheight = 0.1;
+ coluheight = 0.7;
+ acroside = 4;
+ acronum = 20;
+ coluray = 0.06;
+ blocheight = 0.1;
+ poshemi = 0.25*side;
+ raya = 0.08;
+ rayb = 0.12;
+ lena = 0.13;
+ lenb = 0.26;
+ fact = 1.3;
+ auxa = 0.5*side-coluray;
+ coluvec = blue*coluheight;
+ colucen = 0.5*coluvec;
+ auxc = (0,-poshemi,0);
+ auxd = (0,-poshemi,raya+rayb);
+ setthestage( acronum, acroside );
+ V1 := (0.5*side,-0.5*side,coluheight+blocheight);
+ V2 := (0.5*side,0.5*side,coluheight+blocheight);
+ V3 := (-0.5*side,0.5*side,coluheight+blocheight);
+ V4 := (-0.5*side,-0.5*side,coluheight+blocheight);
+ V5 := (0,-0.5*side,coluheight+roofheight+blocheight);
+ V6 := (0,0.5*side,coluheight+roofheight+blocheight);
+ makeface1(1,4,5);
+ makeface2(1,2,6,5);
+ makeface3(2,3,6);
+ makeface4(3,4,5,6);
+ ba = (auxa,-auxa,0);
+ bb = (auxa,auxa,0);
+ bc = (-auxa,auxa,0);
+ bd = (-auxa,-auxa,0);
+ roofcenter = (V1+V2+V3+V4+V5+V6)/6;
+ auxb = roofcenter-blue*blocheight;
+ V7 := (-0.5*side,-0.5*side,coluheight);
+ getready( "draw_invisible( false, false, white, black )", roofcenter );
+ getready( "rigorousdisc( 0, true, ba, coluray, coluvec )", ba+colucen);
+ getready( "rigorousdisc( 0, true, bb, coluray, coluvec )", bb+colucen);
+ getready( "rigorousdisc( 0, true, bc, coluray, coluvec )", bc+colucen);
+ getready( "rigorousdisc( 0, true, bd, coluray, coluvec )", bd+colucen);
+ getready("kindofcube(false,true,V7,0,0,0,side,side,blocheight)",auxb);
+ getready( "whatisthis(auxc,lenb*red,lena*green,raya,fact)", auxc );
+ getready( "spatialhalfsfear( auxd, blue, rayb )", auxd );
+ doitnow;
+ produce_vga_border;
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/planpht.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/planpht.mp
new file mode 100644
index 00000000000..dac34577eff
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/planpht.mp
@@ -0,0 +1,291 @@
+% planpht.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+% Planification wise 3D figures
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1); % phtpbq
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Definition of the 3D-figure
+ V1 := (1,0,0);
+ V2 := (0,1,0);
+ V5 := (0,0,1);
+ V3 := (-1,0,0);
+ V4 := (0,-1,0);
+ makeface1(1,2,3,4);
+ makeface2(1,2,5);
+ makeface3(2,3,5);
+ makeface4(3,4,5);
+ makeface5(4,1,5);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := (3,5,4);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+endfig;
+
+beginfig(2); % phtdpbp
+ numeric altura, raio, xp, xs, yp, ys;
+ altura = 0.5257311;
+ raio = 0.8506508;
+ yp = 0.80901699;
+ ys = 0.5;
+ xp = 0.2628655;
+ xs = -0.6881909;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Definition of the 3D-figure
+ V1 := (raio,0,0);
+ V2 := (xp,yp,0);
+ V3 := (xs,ys,0);
+ V4 := (xs,-ys,0);
+ V5 := (xp,-yp,0);
+ V6 := (0,0,altura);
+ V7 := (0,0,-altura);
+ makeface1(1,2,6);
+ makeface2(5,1,6);
+ makeface3(2,3,6);
+ makeface4(3,4,6);
+ makeface5(4,5,6);
+ makeface6(1,2,7);
+ makeface7(5,1,7);
+ makeface8(2,3,7);
+ makeface9(3,4,7);
+ makeface10(4,5,7);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := (3,5,1.8);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+endfig;
+
+beginfig(3); % phtcubo eps
+ defaultscale := 1;
+ defaultfont := "ccr10";
+ V1 := (1,1,1);
+ V2 := (-1,1,1);
+ V3 := (-1,-1,1);
+ V4 := (1,-1,1);
+ V5 := (1,1,-1);
+ V6 := (-1,1,-1);
+ V7 := (-1,-1,-1);
+ V8 := (1,-1,-1);
+ makeface1(1,2,3,4);
+ makeface2(5,6,7,8);
+ makeface3(1,2,6,5);
+ makeface4(2,3,7,6);
+ makeface5(3,4,8,7);
+ makeface6(4,1,5,8);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := (3,5,3);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+ label.lft("A", rp(V8) );
+ label.top("B", rp(V1) );
+ label.top("C", rp(V3) );
+ label.lft("D", rp(V4) );
+ label.rt("E", rp(V2) );
+ label.rt("F", rp(V6) );
+endfig;
+
+beginfig(4); % phtptq
+ numeric high, low;
+ high = sqrt(2);
+ low = sqrt(2)-1.6818;
+ V1 := (1,1,high);
+ V2 := (-1,1,high);
+ V3 := (-1,-1,high);
+ V4 := (1,-1,high);
+ V5 := (high,0,low);
+ V6 := (0,high,low);
+ V7 := (-high,0,low);
+ V8 := (0,-high,low);
+ V9 := (0,0,0);
+ makeface1(5,6,7,8);
+ makeface2(6,1,2);
+ makeface3(7,2,3);
+ makeface4(8,3,4);
+ makeface5(5,4,1);
+ makeface6(5,6,1);
+ makeface7(6,7,2);
+ makeface8(7,8,3);
+ makeface9(8,5,4);
+ makeface10(9,1,2);
+ makeface11(9,2,3);
+ makeface12(9,3,4);
+ makeface13(9,4,1);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := (2,6,5);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+endfig;
+
+beginfig(5); % phtnonrec
+ numeric tro;
+ tro = 2;
+ V1 := (tro,0,0);
+ V2 := (0,tro,0);
+ V3 := (-tro,0,0);
+ V4 := (0,-tro,0);
+ V5 := (1,1,1);
+ V6 := (-1,1,1);
+ V7 := (-1,-1,1);
+ V8 := (1,-1,1);
+ V9 := (1,1,-1);
+ V10 := (-1,1,-1);
+ V11 := (-1,-1,-1);
+ V12 := (1,-1,-1);
+ V13 := (0,0,tro);
+ V14 := (0,0,-tro);
+ makeface1(1,5,13,8);
+ makeface2(2,6,13,5);
+ makeface3(3,7,13,6);
+ makeface4(4,8,13,7);
+ makeface5(1,5,2,9);
+ makeface6(2,6,3,10);
+ makeface7(3,7,4,11);
+ makeface8(4,8,1,12);
+ makeface9(1,9,14,12);
+ makeface10(2,10,14,9);
+ makeface11(3,11,14,10);
+ makeface12(4,12,14,11);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := 2*(5,3,1.5);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+endfig;
+
+beginfig(6); % pauphtflex eps
+ defaultscale := 1;
+ defaultfont := "ccr10";
+ color A, B, C, D, E, F, G;
+ numeric tro, Adist;
+ tro = sqrt(3)/2;
+ Adist = 0.88854;
+ V1 := (-1.8,0,0);
+ V2 := (-1.8,0.6,1.2*tro);
+ V3 := (1,0.6,1.2*tro);
+ V4 := (1,0,0);
+ V5 := (1,2.5,0);
+ V6 := (-1.8,2.5,0);
+ V7 := (0,0,0);
+ V8 := (0,0.707,0);
+ V9 := (0,0.707/4,0.707*tro/2);
+ V10:= (0.21928,Adist/2,tro*Adist);
+ V11:= (-0.37392,0.39638,0);
+ V12:= (-1.2125,Adist,0);
+ makeface1(1,2,3,4);
+ makeface2(4,5,6,1);
+ makeface3(7,8,9);
+ makeface4(8,9,10);
+ makeface5(8,10,11);
+ makeface6(10,11,12);
+ A = (0,1.3,0);
+ B = (0,1.3+sqrt(0.75),0);
+ C = (-0.5,1.3+sqrt(0.75),0);
+ D = (E+B)/2;
+ E = (sqrt(0.75),1.3,0);
+ F = ((1+sqrt(3))/4,1.3+(1+sqrt(3))/4,0);
+ G = (-1.5,1.3+sqrt(0.75),0);
+ f := 3*(2,5,2);
+ Spread := 100;
+ draw rp(A)--rp(B)--rp(E)--cycle;
+ draw rp(F)--rp(B)--rp(E)--cycle;
+ draw rp(A)--rp(B)--rp(C)--cycle;
+ draw rp(A)--rp(C)--rp(G)--cycle;
+ draw rp(A)--rp(F) dashed evenly;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+ draw rp(V7)--rp(V9);
+ draw rp(V10)--rp(V9);
+ draw rp(V12)--rp((-1.2125,0,0)) dashed evenly;
+ label.urt("Adist", rp((V12+(-1.2125,0,0))/2) );
+ label.lft("A", rp(V10) );
+ label.bot("B", rp(V8) );
+ label.bot("B", rp(B) );
+ label.lrt("C", rp(V11) );
+ label.lft("D", rp(V9) );
+ label.bot("D", rp(D) );
+ label.llft("F", rp(V7) );
+ label.bot("F", rp(F) );
+ label.rt("G", rp(V12) );
+ angline(V6, V2, V1, 0.6, btex $\alpha$ etex, rt);
+ angline(V10, 2*V9, V9, 0.7, btex $\theta$ etex, bot);
+ draw rp(V9+N(V10-V9)*0.65)--rp(V9+N(V10-V9)*0.8);
+ draw rp(V9+N(V9)*0.5)--rp(V9+N(V9)*0.8);
+ label.bot(btex $p$ etex, rp((F+B)/2) );
+ label.ulft(btex $q$ etex, rp((D+B)/2) );
+ label.lft(btex $r$ etex, rp((D+A)/2) );
+ label.llft(btex $s$ etex, rp((A+B)/2) );
+ label.llft(btex $t$ etex, rp((A+C)/2) );
+ label.bot(btex $t$ etex, rp((G+C)/2) );
+ label.bot(btex $u$ etex, rp((C+B)/2) );
+ label.top(btex $v$ etex, rp((A+G)/2) );
+endfig;
+
+beginfig(7); % pauphttoro eps
+ defaultscale := 1;
+ defaultfont := "ccr10";
+ numeric sinthe, costhe, ux, uz, lx, lz, co;
+ costhe = (4*sqrt(5)-sqrt(3))/11;
+ sinthe = sqrt(1-costhe**2);
+ ux = costhe*sqrt(2)/2;
+ uz = sinthe/2;
+ lx = sqrt(4/3)*sinthe;
+ lz = -sqrt(2/3)*costhe;
+ co = sqrt(2)*(2*sqrt(5)+5*sqrt(3))/22;
+ V1 := (ux,0,-uz);
+ V2 := (lx,0,-lz);
+ V3 := (0,ux,uz);
+ V4 := (0,lx,lz);
+ V5 := (co,co,0);
+ V6 := (-ux,0,-uz);
+ V7 := (-lx,0,-lz);
+ V8 := (-co,co,0);
+ makeface1(1,2,3);
+ makeface2(1,2,5);
+ makeface3(2,3,5);
+ makeface4(3,4,5);
+ makeface5(3,4,1);
+ makeface6(1,4,5);
+ makeface7(3,6,7);
+ makeface8(3,7,8);
+ makeface9(6,7,8);
+ makeface10(3,8,4);
+ makeface11(4,6,8);
+ makeface12(3,4,6);
+ Spread := 100;
+% f := (1,-0.4,3);
+ f := 2*(2,1,2.8);
+ draw_invisible( false, false, TableC6, black );
+% cartaxes(0.2,0.2,0.2);
+ draw rp(V2)--rp(V1)--rp(V4) dashed evenly;
+ draw rp(V3)--rp(V1)--rp(V5) dashed evenly;
+ draw rp(V6)--rp(V4) dashed evenly;
+ draw rp(V6)--rp(V8) dashed evenly;
+% pickup pencircle scaled 1pt;
+% sharpraytrace;
+ label.rt("A", rp(V5) );
+ label.rt("C", rp(V3+(0,0.05,0)) );
+ label.rt("B", rp(V4) );
+ label.rt("D", rp(V8) );
+ label.lft("E", rp(V2) );
+ label.llft("F", rp(V1) );
+ label.lft("G", rp(V7) );
+ label.lft("H", rp(V6) );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/rigorcubo.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/rigorcubo.mp
new file mode 100644
index 00000000000..831861fc9b6
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/rigorcubo.mp
@@ -0,0 +1,36 @@
+% rigorcubo.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+beginfig(0);
+ defaultscale := 3;
+ defaultfont := "ccr10";
+ Spread := 50;
+ V1 := (1,1,1);
+ V2 := (-1,1,1);
+ V3 := (-1,-1,1);
+ V4 := (1,-1,1);
+ V5 := (1,1,-1);
+ V6 := (-1,1,-1);
+ V7 := (-1,-1,-1);
+ V8 := (1,-1,-1);
+ makeface1(1,2,3,4);
+ makeface2(5,6,7,8);
+ makeface3(1,2,6,5);
+ makeface4(2,3,7,6);
+ makeface5(3,4,8,7);
+ makeface6(4,1,5,8);
+ f := (3,5,3);
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+ label.lft("A", rp(V8) );
+ label.top("B", rp(V1) );
+ label.top("C", rp(V3) );
+ label.lft("D", rp(V4) );
+ label.rt("E", rp(V2) );
+ label.rt("F", rp(V6) );
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/rmnbob.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/rmnbob.mp
new file mode 100644
index 00000000000..54d568c1e49
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/rmnbob.mp
@@ -0,0 +1,45 @@
+
+Spread := 70;
+f := (5,7,10);
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ numeric i, r[], stepr, len, Numr, Minn, Maxn;
+ numeric fws, NumLines, linex;
+ path aro[], oneline;
+ color centre, axe, baseone, basetwo;
+
+ stepr := 0.1;
+ len := 3;
+ Numr := 5;
+ Minn := 5;
+ centre := (0,0,0);
+ axe := (1,0,0);
+ fws := 2;
+ NumLines := 30;
+ for i=0 upto NumLines:
+ linex := fws*(i/NumLines-0.5);
+ oneline := rp((linex,0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,0.5*fws));
+ draw oneline withcolor (0.7*background);
+ endfor;
+ baseone := centre+0.5*len*axe;
+ basetwo := centre-0.5*len*axe;
+ Maxn := Minn+Numr;
+ for i=Minn upto Maxn:
+ r[i] := i*stepr;
+ aro[i] := rigorouscircle(baseone,axe,r[i]);
+ endfor;
+ rigorousdisc( 0, true, baseone, r[Maxn], -len*axe );
+ drawoptions( dashed evenly );
+ rigorousdisc( 0, true, baseone, r[Minn], -len*axe );
+ for i=Maxn downto Minn:
+ filldraw aro[i] withcolor ((0.5+0.3*normaldeviate)*background);
+ endfor;
+ drawoptions( );
+ draw aro[Maxn];
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/sal.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/sal.mp
new file mode 100644
index 00000000000..e2c447a27a9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/sal.mp
@@ -0,0 +1,104 @@
+% Cesium Cloride Crystal Structure and EBG fields together
+% L. Nobre G.
+% 2002
+
+verbatimtex
+\documentclass{article}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric sfr, radfac, ind;
+ color xv, yv, zv;
+ path p[];
+ f := 3*(5,2,3);
+ Spread := 50;
+ sfr := 0.2;
+ radfac := 2.0;
+ xv := (sfr,0,0);
+ yv := (0,sfr,0);
+ zv := (0,0,sfr);
+ V1 := (-1,-1,-1);
+ V2 := (-1,1,-1);
+ V3 := (1,-1,-1);
+ V4 := (1,1,-1);
+ V5 := (-1,-1,1);
+ V6 := (-1,1,1);
+ V7 := (1,-1,1);
+ V8 := (1,1,1);
+ V9 := (0,0,0);
+ for ind=1 upto 8:
+ p[ind] := rigorousfearpath( V[ind], sfr );
+ endfor;
+ p9 := rigorousfearpath( V9, sfr*radfac );
+ unfill p1;
+ draw p1;
+ draw rp(V1+yv)--rp(V2-yv);
+ draw rp(V1+xv)--rp(V3-xv);
+ unfill p2;
+ draw p2;
+ unfill p3;
+ draw p3;
+ draw rp(V4-yv)--rp(V3+yv);
+ draw rp(V4-xv)--rp(V2+xv);
+ unfill p4;
+ draw p4;
+ draw rp(V1+zv)--rp(V5-zv);
+ draw rp(V2+zv)--rp(V6-zv);
+ unfill p9;
+ draw p9;
+ draw rp(V3+zv)--rp(V7-zv);
+ draw rp(V4+zv)--rp(V8-zv);
+ unfill p5;
+ draw p5;
+ draw rp(V5+yv)--rp(V6-yv);
+ draw rp(V5+xv)--rp(V7-xv);
+ unfill p6;
+ draw p6;
+ unfill p7;
+ draw p7;
+ draw rp(V8-yv)--rp(V7+yv);
+ draw rp(V8-xv)--rp(V6+xv);
+ unfill p8;
+ draw p8;
+ label( btex Cs${}^{+}$ etex, rp( V8 ) );
+ label( btex Cl${}^{-}$ etex, rp( V9 ) );
+endfig;
+
+beginfig(2);
+ numeric inc, ind, tep, larg, altr, lene;
+ path efld, velv, arch, auxi;
+ picture bfld;
+ pair vpos, cent;
+ tep = 1cm;
+ larg = 4;
+ altr = 3;
+ lene = larg*tep;
+ bfld = btex $\times$ etex;
+% bfld := bfld shifted -(center bfld);
+ efld = origin--(lene,0);
+ for ind = 0 upto altr:
+ drawarrow efld shifted (0,ind*tep);
+ endfor;
+ auxi = efld shifted (0,tep);
+ for ind = 1 upto altr:
+ for inc = 1 step 2 until 2*larg:
+ label( bfld, (0.5*inc*tep,(ind-0.5)*tep) );
+ endfor;
+ endfor;
+ vpos = (tep,0.5tep);
+ label.lft( btex $\vec{B}$ etex, (0.5tep,(altr-0.5)*tep) );
+ label.lft( btex $\vec{E}$ etex, origin );
+ label.top( btex $\vec{v}$ etex, vpos );
+ velv = vpos--((larg-1)*tep,(altr-0.5)*tep);
+ drawarrow velv;
+ cent = auxi intersectionpoint velv;
+ arch = ((fullcircle scaled (altr*tep*0.87)) shifted cent) cutafter velv;
+ draw arch;
+ label.rt( btex $\theta$ etex, point 0.5*length arch of arch );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/sfearschem.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/sfearschem.mp
new file mode 100644
index 00000000000..a9f2ea6a344
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/sfearschem.mp
@@ -0,0 +1,34 @@
+% sfearchem.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+defaultfont:="cmssu30";
+
+beginfig(1);
+ f := (4,2,1.5);
+ cartaxes( 1.5,1.5,0.75 );
+ drawoptions( withcolor red withpen pencircle scaled 1.3pt );
+ draw goodcirclepath( (0,0,0), (0,0,1), 1 );
+ drawoptions();
+ draw rigorouscircle( (0,0,0), (0,0,1), 1 );
+ draw spatialhalfcircle( (0,0,0), (0,0,1), 0.5, true );
+ draw spatialhalfcircle( (0,0,0), (0,0,1), 0.5, false ) dashed evenly;
+ draw rigorousfearpath( (0,0,0), 0.5 );
+ draw rp((0,0,0.5)) withpen pencircle scaled 1.3pt;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/signalvertexSD.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/signalvertexSD.mp
new file mode 100644
index 00000000000..dfc5eb3f501
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/signalvertexSD.mp
@@ -0,0 +1,40 @@
+% signalvertexSD.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+% Draw a torus with NP dots, a section of 3.14*RS^2
+% and a total diameter of 2*(RB+RS). The dots are placed
+% on a single closed line that turns around the $z$ axis
+% NB times and around the section NS times.
+
+f := 0.45f;
+
+%SphericalDistortion := true; Spread := 11;
+
+beginfig(1);
+ NP:=2000;
+ RB:=1;
+ RS:=0.2;
+ R3:=0.0;
+ NB:=8;
+ NS:=5;
+ jB:=360*NB/NP;
+ jS:=360*NS/NP;
+ for i=1 upto NP:
+ phi :=i*jS;
+ theta :=i*jB;
+ first :=(RB+(RS+R3*sind(4*theta))*cosd(phi))*cosd(theta);
+ second:=(RB+(RS+R3*sind(4*theta))*cosd(phi))*sind(theta);
+ third := (RS+R3*sind(4*theta))*sind(phi);
+ signalvertex( (first,second,third), 1, black );
+ endfor;
+endfig;
+
+end;
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/spherample.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/spherample.mp
new file mode 100644
index 00000000000..39352e6ba02
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/spherample.mp
@@ -0,0 +1,49 @@
+% spherample.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+SphericalDistortion := true;
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc;
+ color nalfa, gammacnt, vertex;
+ numeric altura, grids, radius, xxsize, aux,
+ yysize, zzsize, i, numc, slope;
+ path sfear;
+
+ f := (5,4,2);
+ Spread := 120;
+ ShiftV := (200,200);
+ altura = 1;
+ radius = 0.3;
+ grids = 1;
+ numc = 9;
+ slope = 3;
+
+ for i=1 upto numc:
+ aux := (i-1-0.5*(numc-1))*grids;
+ gammacnt := (0,aux,0);
+ vertex := (aux/slope,aux,altura);
+ nalfa := vertex - gammacnt;
+ sfear := rigorousfearpath(gammacnt,radius);
+ unfill sfear;
+ draw sfear;
+ draw spatialhalfcircle(gammacnt,nalfa,radius,true);
+ endfor;
+ xxsize = radius;
+ yysize = 0.5*(numc-1)*grids;
+ zzsize = altura;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+% drawarrow rp(orig)..rp(axxc);
+% drawarrow rp(orig)..rp(ayyc);
+% drawarrow rp(orig)..rp(azzc);
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/squareanglines.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/squareanglines.mp
new file mode 100644
index 00000000000..769f2af8721
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/squareanglines.mp
@@ -0,0 +1,14 @@
+% squareanglines.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ cartaxes(1,1,1);
+ squareangline( red, green, black, 0.4);
+ squareangline( green, blue, black, 0.6);
+ squareangline( blue, red, black, 0.8);
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/troncoconedef.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/troncoconedef.mp
new file mode 100644
index 00000000000..0429ac4533f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/troncoconedef.mp
@@ -0,0 +1,54 @@
+% troncoconedef.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+f := (5,0,3);
+
+def twoclicpathesinapen( expr CycleA, CycleB )=
+ begingroup
+ numeric TheLengthOfA, TheLengthOfB, TheMargin;
+ path SubPathA, SubPathB;
+ TheMargin = 0.02;
+ TheLengthOfA = ( length CycleA ) - TheMargin;
+ TheLengthOfB = ( length CycleB ) - TheMargin;
+ SubPathA = subpath ( 0, TheLengthOfA ) of CycleA;
+ SubPathB = subpath ( 0, TheLengthOfB ) of CycleB;
+ ( makepath makepen ( SubPathA--SubPathB--cycle ) )
+ endgroup
+enddef;
+
+beginfig(0);
+ numeric rayo, rayt;
+ path onec, twoc, botc;
+ color axec, baso, bast;
+ rayo = 1;
+ rayt = 0.7;
+ axec = red;
+ baso = black;
+ bast = (1,1,1);
+ onec = goodcirclepath( baso, axec, rayo );
+ twoc = goodcirclepath( bast, axec, rayt );
+ botc = twoclicpathesinapen( onec, twoc );
+ fill botc withcolor green;
+ draw onec;
+ draw twoc;
+ draw botc;
+ dotlabel.bot( btex onec0 etex, point 0 of onec );
+ dotlabel.bot( btex twoc0 etex, point 0 of twoc );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/twistnlc.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/twistnlc.mp
new file mode 100644
index 00000000000..b3611cfbb14
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/twistnlc.mp
@@ -0,0 +1,54 @@
+% explvis2
+% L. Nobre G.
+% 1999
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+
+ f := (2,1,1);
+
+ Spread := 250;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, thetamin,
+ thetamax, thetastp, long, base, radius, polar;
+ sizevec := (4,36,1);
+ gridvec := (0.14,0.1,0.3);
+ thetamin := 90;
+ thetamax := 150;
+ long := 0.08;
+ base := 0.02;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -X(gridvec)*X(sizevec) ,
+ -X(gridvec)*X(sizevec) ,
+ 0 );
+ bordpos := starpos;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ counter := 2;
+ for i=1 upto X(sizevec):
+ radius := (i-1)*X(gridvec);
+ polar := i*floor(Y(sizevec)/X(sizevec));
+ for j=1 upto polar:
+ for k=1 upto Z(sizevec):
+ phi := 360*(j-1)/polar;
+ theta := thetamin+(i-1)*thetastp;
+ currpos := radius*(cosd(phi-90),sind(phi-90),0)
+ +(k-1)*(0,0,Z(gridvec));
+ generatedirface( counter, phi, theta, long, base, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NF := decr(counter);
+ draw_all_test(false);
+% sharpraytrace;
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/twistroundbiax.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/twistroundbiax.mp
new file mode 100644
index 00000000000..59a47907a88
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/twistroundbiax.mp
@@ -0,0 +1,62 @@
+% twistroundbiax.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+
+
+beginfig(1);
+
+ f := (2,1,1);
+
+ Spread := 250;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, gamma, thetamin, innercircle,
+ thetamax, thetastp, long, base, radius, polar, larg;
+ sizevec := (4,36,1);
+ gridvec := (0.143,0.1,0.1);
+ thetamin := 90;
+ thetamax := 150;
+ long := 0.08;
+ larg := 0.02;
+ base := 0.2;
+ gamma := -30;
+ innercircle := 0.5;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -X(gridvec)*X(sizevec) ,
+ -X(gridvec)*X(sizevec) ,
+ 0 );
+ bordpos := starpos;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ NF := 1;
+ draw facepath(1);
+ counter := 0;
+ for i=1 upto X(sizevec):
+ radius := (i-innercircle)*X(gridvec);
+ polar := i*floor(Y(sizevec)/X(sizevec));
+ for j=1 upto polar:
+ for k=1 upto Z(sizevec):
+ phi := 360*(j-1)/polar;
+ theta := thetamin+(i-innercircle)*thetastp;
+ currpos := radius*(cosd(phi-90),sind(phi-90),0)
+ +(k-1)*(0,0,Z(gridvec));
+ counter := incr(counter);
+% generateonebiax( counter, phi, theta, long,
+% gamma, larg, currpos );
+ generatedirline( counter, phi, theta, long, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, base, false );
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/twocyclestogether.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/twocyclestogether.mp
new file mode 100644
index 00000000000..ca94e87dc2e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/twocyclestogether.mp
@@ -0,0 +1,113 @@
+% twocyclestogether.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+f := (4.5,-6,5);
+
+beginfig(1);
+ numeric len[], ray[];
+ color axe[], pos[], fix[], lab[], Ve[];
+ color reflabpos, reflabpoi;
+ picture txt[], dashpatt;
+ numeric inclang, aberang, sampang;
+ numeric squside, sqlevel, ul, outermagpos;
+ numeric innerray, polesep, fracone, fracsam;
+ numeric labelscale;
+ path tmpath, aupath, copath;
+
+ pickup pencircle scaled 1.2pt;
+ dashpatt = evenly scaled 3;
+ ul = 0.1;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Change one of these at a time. %%%%%%%%
+ inclang = 129;
+ aberang = 19;
+ outermagpos = 22ul;
+ polesep = 1.7ul;
+ len4 = 30ul;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ sampang = 30;
+ fracone = 0.33;
+ fracsam = 0.86;
+ ray1 = 10ul;
+ ray2 = 6ul;
+ ray3 = 8ul;
+ ray4 = 1.5ul;
+ ray5 = 4ul;
+ ray6 = 3ul;
+ ray7 = 3.5ul;
+ ray8 = 2ul;
+ len3 = 7ul;
+ len5 = 3ul;
+ len7 = 3.5ul;
+ len8 = 7ul;
+
+ len1 = (1-fracone)*(outermagpos-ray5-polesep);
+ pos1 = (-outermagpos,0,0);
+ rigorousdisc( 0, true, pos1, ray1, len1*(1,0,0) );
+
+ len2 = fracone*(outermagpos-ray5-polesep);
+ pos2 = (len1-outermagpos,0,0);
+ tmpath := goodcirclepath( pos2, (1,0,0), ray1 );
+ aupath := goodcirclepath( (-ray5-polesep,0,0), (1,0,0), ray2 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ Ve5 := fracsam*ray5*( sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ Ve6 := fracsam*ray5*( -sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ Ve8 := fracsam*ray5*( sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ Ve7 := fracsam*ray5*( -sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ tmpath := rp(Ve5)--rp(Ve6)--rp(Ve7)--rp(Ve8)--cycle;
+ unfill tmpath;
+ draw tmpath;
+
+ axe6 = ( 0, cosd( inclang+aberang ), sind( inclang+aberang ) );
+ pos6 = ray1*axe6;
+ len6 = len4;
+ axe7 = ( 0, cosd( inclang-aberang ), sind( inclang-aberang ) );
+ pos7 = ( ray1 + 0.5len6 )*axe7;
+ draw rp(pos6)--rp((0,0,0))--rp(pos7) dashed dashpatt;
+
+ pos8 = pos7+len7*axe7;
+ tmpath := goodcirclepath( pos7, axe7, ray7 );
+ aupath := goodcirclepath( pos8, axe7, ray8 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ axe8 = axe7;
+ rigorousdisc( 0, true, pos8, ray8, len8*axe8 );
+
+ len9 = len2;
+ pos9 = (ray5+polesep,0,0);
+ ray9 = ray2;
+ ray10 = ray1;
+ tmpath := goodcirclepath( pos9, (1,0,0), ray9 );
+ pos10 = pos9+len9*(1,0,0);
+ aupath := goodcirclepath( pos10, (1,0,0), ray10 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ len10 = len1;
+ rigorousdisc( 0, true, pos10, ray10, len10*(1,0,0) );
+
+ produce_auto_scale;
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/repeated/twoupcones.mp b/Master/texmf-dist/doc/metapost/featpost/example/repeated/twoupcones.mp
new file mode 100644
index 00000000000..cc9b697dd37
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/repeated/twoupcones.mp
@@ -0,0 +1,51 @@
+% twoupcones.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+f := 3*(2,1,0.5);
+
+beginfig(1);
+ numeric raya, rayb, heia, heib, rang, marg, u;
+ color cena, cenb, vera, verb, auxa, auxb, pora, porb, poha, pohb;
+ u = 0.38;
+ raya = 1u;
+ rayb = 2u;
+ heia = 0.65u;
+ marg = 0.2u;
+ rang = 60;
+ heib = heia*rayb/raya;
+ cena = (raya*(1+marg),0,0);
+ cenb = (-rayb*(1+marg),0,0);
+ auxa = cena + raya*(cosd(rang),sind(rang),0);
+ auxb = cenb + rayb*(cosd(rang),sind(rang),0);
+ pora = 0.5[auxa,cena];
+ porb = 0.5[auxb,cenb];
+ vera = cena+heia*blue;
+ verb = cenb+heib*blue;
+ poha = 0.5[cena,vera];
+ pohb = 0.5[cenb,verb];
+ verygoodcone(true,cenb,blue,rayb,verb);
+ draw rp(verb)--rp(cenb)--rp(auxb) dashed evenly;
+ label.urt(btex $h_1$ etex, rp(pohb));
+ label.urt(btex $R_1$ etex, rp(porb));
+ verygoodcone(true,cena,blue,raya,vera);
+ draw rp(vera)--rp(cena)--rp(auxa) dashed evenly;
+ label.urt(btex $h_2$ etex, rp(poha));
+ label.urt(btex $R_2$ etex, rp(pora));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/anglinerigorouscircle.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/anglinerigorouscircle.mp
new file mode 100644
index 00000000000..57548730161
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/anglinerigorouscircle.mp
@@ -0,0 +1,108 @@
+% angline_rigorouscircle.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc;
+ color field, nalfa, ngamma, alfacnt, gammacnt, nazy, nax;
+ path alfa, gamma;
+ numeric nalfad, theta, radius, gammang, xxsize, yysize, zzsize;
+ numeric xxpos, yypos, zzpos, fieldpos, deltarad, deltapos;
+ numeric thetarad, thetapos, nalfapos, ngammapos;
+ numeric etalpharad, etalphapos, alphapos, gammapos;
+ picture xxlabel, yylabel, zzlabel, fieldlabel, deltalabel;
+ picture nalfalabel, ngammalabel, etalphalabel, alphalabel;
+ picture gammalabel, thetalabel;
+
+ f := (3,4,2);
+ Spread := 100;
+ xxsize = 0.8;
+ xxpos = 6;
+ yysize = 0.8;
+ yypos = 6;
+ zzsize = 1.3;
+ zzpos = 4;
+ field = (0.7,0,0.3);
+ fieldpos = 2;
+ deltarad = 0.45;
+ deltapos = 3;
+ nalfad = 1.0;
+ theta = 25;
+ thetarad = 0.3;
+ thetapos = 2;
+ nalfapos = 7;
+ gammang = 65;
+ ngammapos = 7;
+ etalpharad = 0.4;
+ etalphapos = 2;
+ alphapos = 6;
+ gammapos = 0;
+
+ xxlabel = btex $x_c$ etex;
+ yylabel = btex $y_c$ etex;
+ zzlabel = btex $z_c$ etex;
+ deltalabel = btex $\Delta$ etex;
+ fieldlabel = btex $\mathbf{B}$ etex;
+ thetalabel = btex $\theta$ etex;
+ nalfalabel = btex $\vec{n}_\alpha$ etex;
+ ngammalabel = btex $\vec{n}_\gamma$ etex;
+ etalphalabel= btex $\eta_\alpha$ etex;
+ alphalabel = btex $\alpha$ etex;
+ gammalabel = btex $\gamma$ etex;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+ nalfa = (0,sind(theta),cosd(theta));
+ alfacnt = (0,0,nalfad*cosd(theta));
+ radius = nalfad*sind(theta);
+ alfa = rigorouscircle( alfacnt, (0,0,1), radius );
+ gammacnt = cosd(theta)*cosd(theta)*nalfa;
+ radius := cosd(theta)*sind(theta);
+ gamma = rigorouscircle( gammacnt, nalfa, radius );
+ nazy = radius*sind(gammang)*ncrossprod( nalfa, axxc );
+ nax = radius*cosd(gammang)*ncrossprod( ayyc, nalfa );
+ ngamma = gammacnt+nax+nazy;
+ draw alfa dashed evenly;
+ draw gamma dashed evenly;
+ drawarrow rp(orig)..rp(axxc);
+ drawarrow rp(orig)..rp(ayyc);
+ drawarrow rp(orig)..rp(azzc);
+ drawarrow rp(orig)..rp(field);
+ drawarrow rp(orig)..rp(nalfa);
+ drawarrow rp(orig)..rp(ngamma);
+ drawarrow subpath (4,3) of alfa;
+ drawarrow subpath (8,7) of gamma;
+ anglinen( field, azzc, orig, deltarad, deltalabel, deltapos );
+ anglinen( azzc, nalfa, orig, thetarad, thetalabel, thetapos );
+ anglinen( ngamma, field, orig, etalpharad, etalphalabel, etalphapos );
+ labeln( xxlabel, rp(axxc), xxpos );
+ labeln( yylabel, rp(ayyc), yypos );
+ labeln( zzlabel, rp(azzc), zzpos );
+ labeln( fieldlabel, rp(field), fieldpos );
+ labeln( nalfalabel, rp(nalfa), nalfapos );
+ labeln( ngammalabel, rp(ngamma), ngammapos );
+ labeln( alphalabel, point 3 of alfa, alphapos );
+ labeln( gammalabel, point 7 of gamma, gammapos );
+ pickup pencircle scaled 1.5;
+ draw rp(alfacnt);
+ draw rp(gammacnt);
+% produce_auto_scale;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/cartaxes.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/cartaxes.mp
new file mode 100644
index 00000000000..af8576e06c2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/cartaxes.mp
@@ -0,0 +1,28 @@
+verbatimtex
+\documentclass{article}
+\begin{document}
+
+%input featpost3Dplus2D;
+etex
+beginfig(1);
+ cartaxes(1,1,1);
+endfig;
+f := (5,3.5,1);
+beginfig(2);
+ cartaxes(1,1,1);
+ color va, vb, vc, vd;
+ va = (0.29,0.7,1.0);
+ vb = (X(va),Y(va),0);
+ vc = N((-Y(va),X(va),0));
+ vd = (0,Y(vc),0);
+ drawarrow rp(black)--rp(va);
+ draw rp(black)--rp(vb)--rp(va) dashed evenly;
+ draw rp(vc)--rp(vd) dashed evenly;
+ drawarrow rp(black)--rp(vc);
+ squareangline( va, vc, black, 0.15 );
+ angline( va, red, black, 0.75, decimal getangle( va, red ), lft );
+endfig;
+verbatimtex
+\end{document}
+etex
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/conicurv.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/conicurv.mp
new file mode 100644
index 00000000000..15aea824d14
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/conicurv.mp
@@ -0,0 +1,94 @@
+% conicurv.mp
+% L. Nobre G.
+% Y2K
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ f := (10,-5,5.44);
+ Spread := 30;
+ numeric shortradius, longradius, theta, width, height;
+ numeric updiff, refsize, vecsize, anglar, bord, totup;
+ color rn, fa, fc, pg, centre, speed, refx, refy;
+ color iplow, iphig, oplow,ophig, anglebase, central, refo;
+ color eplow, ephig, aplow,aphig, anglebase, central, refo;
+ theta = 30;
+ width = 3;
+ shortradius = 2;
+ bord = 2;
+ refsize = 1;
+ vecsize = 2;
+ height = 0.3;
+ anglar = 1.75;
+ totup = 3;
+ longradius = shortradius + width*cosd(theta);
+ updiff = width*sind(theta);
+ iplow = (0,shortradius,0);
+ iphig = (0,longradius,updiff);
+ oplow = (-shortradius,0,0);
+ ophig = (-longradius,0,updiff);
+ aplow = -iplow;
+ aphig = (0,-longradius,updiff);
+ eplow = -oplow;
+ ephig = (longradius,0,updiff);
+ anglebase = (0,longradius,0);
+ centre = 0.5[iplow,iphig]+(0,0,height);
+ central = (0,0,Z(centre));
+% refo = (0,0,-shortradius*sind(theta)/cosd(theta));
+ refo = (0,0.5*Y(centre),Z(centre));
+ refx = refsize*(0,cosd(theta),sind(theta));
+ refy = refsize*(0,-sind(theta),cosd(theta));
+% anglinen( iplow, oplow, (0,0,0), shortradius, "", 0 );
+% anglinen( iphig, ophig, (0,0,updiff), longradius, "", 0 );
+ angline(iphig,anglebase,iplow,width/anglar,btex $\theta$ etex,rt);
+ draw rp(central) withpen pencircle scaled 2pt;
+ draw rp(iplow)--rp(iphig);
+ draw rp(oplow)--rp(ophig);
+ draw rp(aplow)--rp(aphig);
+ draw rp(eplow)--rp(ephig);
+ draw rp(iphig)--rp(anglebase)--rp(aplow) dashed evenly;
+ draw rp(oplow)--rp(eplow) dashed evenly;
+ draw rp(central)--rp(centre) dashed evenly;
+% draw rp((0,-bord,-bord))--rp((0,longradius+bord,-bord))
+% --rp((0,longradius+bord,totup))--rp((0,-bord,totup))--cycle
+% withpen pencircle scaled 2pt;
+ draw rp((0,0,-bord))--rp((0,longradius+bord,-bord))
+ --rp((0,longradius+bord,totup))--rp((0,0,totup))--cycle;
+ drawarrow rp(refo)..rp(refo+refy);
+ drawarrow rp(refo)..rp(refo+refx);
+ label.llft(btex $y$ etex, rp(refo+refy));
+ label.lrt(btex $x$ etex, rp(refo+refx));
+ rn = centre+vecsize*refy;
+ fa = centre+vecsize*refx;
+ fc = centre+vecsize*(0,1,0);
+ pg = centre+vecsize*(0,0,-1);
+ speed = centre+vecsize*(1,0,0);
+ drawarrow rp(centre)..rp(rn);
+ drawarrow rp(centre)..rp(fa);
+ drawarrow rp(centre)..rp(fc);
+ drawarrow rp(centre)..rp(pg);
+ drawarrow rp(centre)..rp(speed);
+ label.rt(btex $\vec{R}_N$ etex, rp(rn));
+ label.top(btex $\vec{F}_a$ etex, rp(fa));
+ label.urt(btex $\vec{F}_c$ etex, rp(fc));
+ label.rt(btex $\vec{P}$ etex, rp(pg));
+ label.rt(btex $\vec{v}$ etex, rp(speed));
+ draw rp(centre) withpen pencircle scaled 10pt withcolor blue;
+ pickup pencircle scaled 2pt;
+ draw rigorouscircle( (0,0,updiff), (0,0,1), longradius );
+ draw rigorouscircle( (0,0,0), (0,0,1), shortradius );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/cubicfacecentered.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/cubicfacecentered.mp
new file mode 100644
index 00000000000..ac359c3ddf2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/cubicfacecentered.mp
@@ -0,0 +1,112 @@
+% cubicfacecentered.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+% verbatimtex
+% \documentclass{article}
+% \usepackage{beton}
+% \usepackage{concmath}
+% \usepackage{ccfonts}
+% \begin{document}
+% etex
+
+beginfig(1);
+ numeric tro;
+ pen fina, media, grossa;
+ color mygray;
+ tro = 2;
+ V1 := (tro,0,0);
+ V2 := (0,tro,0);
+ V3 := (-tro,0,0);
+ V4 := (0,-tro,0);
+ V5 := (1,1,1);
+ V6 := (-1,1,1);
+ V7 := (-1,-1,1);
+ V8 := (1,-1,1);
+ V9 := (1,1,-1);
+ V10 := (-1,1,-1);
+ V11 := (-1,-1,-1);
+ V12 := (1,-1,-1);
+ V13 := (0,0,tro);
+ V14 := (0,0,-tro);
+ V15 := (tro,0,tro);
+ V16 := (0,tro,tro);
+ V17 := (tro,tro,0);
+ V18 := (tro,0,-tro);
+ V19 := (tro,-tro,0);
+ V20 := (0,-tro,tro);
+ V21 := (-tro,0,tro);
+ V22 := (-tro,tro,0);
+ V23 := (0,tro,-tro);
+ V24 := (-tro,0,-tro);
+ V25 := (0,-tro,-tro);
+ V26 := (-tro,-tro,0);
+ V27 := (-2*tro,-tro,-tro);
+ V28 := (-2*tro,-tro,tro);
+ V29 := (-2*tro,tro,tro);
+ V30 := (-2*tro,tro,-tro);
+ makeface1(1,5,13,8);
+ makeface2(2,6,13,5);
+ makeface3(3,7,13,6);
+ makeface4(4,8,13,7);
+ makeface5(1,5,2,9);
+ makeface6(2,6,3,10);
+ makeface7(3,7,4,11);
+ makeface8(4,8,1,12);
+ makeface9(1,9,14,12);
+ makeface10(2,10,14,9);
+ makeface11(3,11,14,10);
+ makeface12(4,12,14,11);
+
+ makeface13(27,28,29,30);
+ makeface14(20,21,16,29,28);
+ makeface15(23,24,25,27,30);
+ makeface16(16,22,23,30,29);
+ makeface17(25,27,28,20,26);
+ makeface18(21,22,24,26);
+ makeface19(20,21,26);
+ makeface20(16,21,22);
+ makeface21(22,23,24);
+ makeface22(24,25,26);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% f := 2*(5,3,1.5);
+% f := 2*(5,3,4);
+ f := 2.34*(15,2.4,5.05);
+ Spread := 50;
+ fina = pencircle scaled 1pt;
+ media = pencircle scaled 1.2pt;
+ grossa= pencircle scaled 3pt;
+ mygray = 0.3background;
+% pickup fina;
+% draw rp(V25)--rp(V27)--rp(V28)--rp(V20)--
+% rp(V25)--rp(V23)--rp(V30)--rp(V27);
+ pickup media;
+ draw rp(V24)--rp(V25)--rp(V19)--rp(V20)--
+ rp(V26)--rp(V25)--rp(V18)--rp(V23)--
+ rp(V24)--rp(V26)--rp(V21)--rp(V22)--cycle withcolor mygray;
+ drawoptions( withpen grossa );
+ draw_invisible( false, false, TableC3, black );
+ fillfacewithlight( 14 );
+ fillfacewithlight( 16 );
+ drawoptions();
+ pickup media;
+ draw rp(V15)--rp(V16)--rp(V22)--rp(V23)--
+ rp(V17)--rp(V16)--rp(V21)--rp(V20)--
+ rp(V15)--rp(V17)--rp(V18)--rp(V19)--cycle withcolor mygray;
+% pickup fina;
+% draw rp(V28)--rp(V29)--rp(V30);
+% draw rp(V20)--rp(V16)--rp(V23);
+% draw rp(V16)--rp(V29);
+
+endfig;
+
+% verbatimtex \end{document} etex
+
+end;
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/cubicfigures.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/cubicfigures.mp
new file mode 100644
index 00000000000..93aebeb28a0
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/cubicfigures.mp
@@ -0,0 +1,44 @@
+% cubicfigures.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+f := ( 1.2 , 2.0 , 1.6 );
+Spread := 75;
+
+V1 := (1,1,1);
+V2 := (-1,1,1);
+V3 := (-1,-1,1);
+V4 := (1,-1,1);
+V5 := (1,1,-1);
+V6 := (-1,1,-1);
+V7 := (-1,-1,-1);
+V8 := (1,-1,-1);
+makeface1(1,2,3,4);makeface2(5,6,7,8);
+makeface3(1,2,6,5);makeface4(2,3,7,6);
+makeface5(3,4,8,7);makeface6(4,1,5,8);
+makeline1(1,7);makeline2(2,8);
+makeline3(3,5);makeline4(4,6);
+
+beginfig(1);
+ ParallelProj := true;
+ SphericalDistortion := false;
+ pickup pencircle scaled 1pt;
+ draw_all_test(true);
+endfig;
+
+beginfig(2);
+ ParallelProj := false;
+ SphericalDistortion := false;
+ draw_all_test(true);
+endfig;
+
+beginfig(3);
+ ParallelProj := false;
+ SphericalDistortion := true;
+ PrintStep := 5;
+ draw_all_test(true);
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/cylimple.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/cylimple.mp
new file mode 100644
index 00000000000..bef31891c97
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/cylimple.mp
@@ -0,0 +1,50 @@
+% cylimple.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+SphericalDistortion := true;
+f := 0.3*(5,4,2);
+Spread := 40;
+ShiftV := (200,200);
+
+%SphericalDistortion := false;
+%f := 3.3*(5,4,2);
+%Spread := 70;
+%Shifts := (250,250);
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc;
+ color nalfa, gammacnt, vertex;
+ numeric altura, grids, radius, xxsize, aux,
+ yysize, zzsize, i, numc, slope;
+
+ altura = 1;
+ radius = 0.3;
+ grids = 1;
+ numc = 9;
+ slope = 3;
+
+ for i=1 upto numc:
+ aux := (i-1-0.5*(numc-1))*grids;
+ gammacnt := (0,aux,0);
+ vertex := (aux/slope,aux,altura);
+ nalfa := vertex - gammacnt;
+ rigorousdisc( 0, true, gammacnt, radius, nalfa );
+ endfor;
+ xxsize = radius;
+ yysize = 0.5*(numc-1)*grids;
+ zzsize = altura;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+% drawarrow rp(orig)..rp(axxc);
+% drawarrow rp(orig)..rp(ayyc);
+% drawarrow rp(orig)..rp(azzc);
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/downloadicon.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/downloadicon.mp
new file mode 100644
index 00000000000..78b9be800e7
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/downloadicon.mp
@@ -0,0 +1,66 @@
+% downloadicon.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+f := 0.4[(12,3,2),(2,5,6)]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Max: 0.8
+Spread := 30;
+TDAtiplen := 0.65;
+TDAhalftipbase := 0.35;
+TDAhalfthick := 0.15;
+
+beginfig(1);
+ color tracecol, lockcol, arrowcol;
+ numeric altura, compri, radius, altfrac, comfrac, radang;
+ path theside, thefront, thelocka, thelockb, thelock;
+ color poi[], startarrow, endarrow;
+ numeric numpl, aux, i;
+ altura = 1;
+ compri = 2;
+ radius = 0.8;
+ altfrac = 0.2;
+ comfrac = 0.15;
+ radang = 37;
+ numpl = 9;
+ tracecol = blue;
+ lockcol = black;
+ arrowcol = (0.7,0.2,0.1);
+ startarrow = (0,-radius,2);
+ endarrow = (0,0,radius);
+ currentpen := pencircle scaled 2.4mm;
+ drawoptions( withcolor tracecol );
+ rigorousdisc( 0, true, (-0.5compri,0,0), radius, (compri,0,0) );
+ poi1 = (0.5compri,-radius,0);
+ poi2 = (0.5compri,radius,0);
+ poi3 = (-0.5compri,radius,0);
+ poi4 = (0.5compri,-radius,-altura);
+ poi5 = (0.5compri,radius,-altura);
+ poi6 = (-0.5compri,radius,-altura);
+ theside = rp(poi1)--rp(poi2)--rp(poi5)--rp(poi4)--cycle;
+ thefront= rp(poi2)--rp(poi3)--rp(poi6)--rp(poi5)--cycle;
+ drawoptions( withcolor white );
+ fill theside;
+ fill thefront;
+ thelocka = rp((comfrac*compri,radius,-altfrac*altura))
+ --rp((comfrac*compri,radius,0));
+ thelockb = rp((-comfrac*compri,radius,-altfrac*altura))
+ --rp((-comfrac*compri,radius,0));
+ for i=1 upto numpl:
+ aux := i*radang/numpl;
+ poi7 := (comfrac*compri,radius*cosd(aux),radius*sind(aux));
+ poi8 := (-comfrac*compri,radius*cosd(aux),radius*sind(aux));
+ thelocka := thelocka...rp(poi7);
+ thelockb := thelockb...rp(poi8);
+ endfor;
+ thelock = thelocka--reverse thelockb--cycle;
+ drawoptions( withcolor lockcol );
+ filldraw thelock;
+ drawoptions( withcolor tracecol );
+ draw theside;
+ draw thefront;
+ drawoptions( withcolor arrowcol );
+ tdarrow( startarrow, endarrow );
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/eemcsblabla.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/eemcsblabla.mp
new file mode 100644
index 00000000000..cb35011cc44
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/eemcsblabla.mp
@@ -0,0 +1,292 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2003 Wolfgang Glunz <wglunz@pstoedit.net>
+
+% eemcsblabla.mp %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Hacked by L. Nobre G.
+% 2004
+
+numeric zmax, rmax;
+zmax = 1;
+rmax = 1;
+
+def converterfunc( expr Pair ) =
+ begingroup
+ save xucf, yucf, astart, rr, xaux, yaux, raux, aaux, zaux;
+ numeric xucf, yucf, astart, rr, xaux, yaux, raux, aaux, zaux;
+ xucf = 0.21;
+ yucf = 0.002;
+ astart = 120;
+ rr = 0.0004;
+ aaux = astart + xucf*( ypart Pair );
+ raux = rr*aaux + yucf*( xpart Pair );
+ xaux = raux*cosd( aaux );
+ yaux = raux*sind( aaux );
+ zaux = zmax*(1-raux/rmax);
+ ( rp( ( xaux, yaux, zaux ) ) )
+ endgroup
+enddef;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end of first featpost part
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+defaultscale := 0.16;
+beginfig(1);
+ path PreeditedPath[];
+linecap := butt;
+linejoin := mitered;
+PreeditedPath1 = hide(z1=(309,-996.562))z1--hide(z2=(309,-984.905))z2..controls hide(z3=(309,-982.215))z3 and hide(z4=(309.097,-979.126))z4..hide(z5=(309.292,-974.344))z5
+ --hide(z6=(309.392,-971.754))z6--hide(z7=(304.908,-969.861))z7--hide(z8=(304.211,-970.259))z8
+ ..controls hide(z9=(304.609,-978.329))z9 and hide(z10=(305,-984.307))z10..hide(z11=(305,-992.078))z11
+ --hide(z12=(305,-995.764))z12--hide(z13=(281.097,-991.58))z13..controls hide(z14=(279.503,-991.281))z14 and hide(z15=(278.706,-991.082))z15..hide(z16=(277.908,-990.683))z16
+ --hide(z17=(277.709,-986.001))z17..controls hide(z18=(277.61,-982.812))z18 and hide(z19=(277,-979.624))z19..hide(z20=(277,-977.432))z20
+ ..controls hide(z21=(277,-971.255))z21 and hide(z22=(278.088,-967.171))z22..hide(z23=(279.901,-967.071))z23
+ --hide(z24=(288.768,-966.274))z24--hide(z25=(288.768,-963.883))z25..controls hide(z26=(282.392,-963.584))z26 and hide(z27=(277.41,-962.886))z27..hide(z28=(273.625,-961.791))z28
+ ..controls hide(z29=(273.425,-963.883))z29 and hide(z30=(273,-966.872))z30..hide(z31=(273,-968.665))z31
+ ..controls hide(z32=(273,-968.964))z32 and hide(z33=(273,-970.06))z33..hide(z34=(273.1,-972.451))z34
+ --hide(z35=(273.199,-984.407))z35..controls hide(z36=(273.625,-985.303))z36 and hide(z37=(273.299,-991.182))z37..hide(z38=(273.299,-992.178))z38
+ ..controls hide(z39=(273.299,-995.864))z39 and hide(z40=(273.299,-998.554))z40..hide(z41=(273.1,-1003.64))z41
+ --hide(z42=(273,-1008.12))z42--hide(z43=(276.115,-1008.42))z43--hide(z44=(276.314,-1003.04))z44
+ ..controls hide(z45=(276.414,-1000.65))z45 and hide(z46=(277.211,-999.55))z46..hide(z47=(279.005,-999.55))z47
+ ..controls hide(z48=(280.399,-999.55))z48 and hide(z49=(283.588,-999.949))z49..hide(z50=(286.577,-1000.45))z50
+ --hide(z51=(336.79,-1009.11))z51..controls hide(z52=(338.583,-1009.51))z52 and hide(z53=(339.281,-1010.71))z53..hide(z54=(339.979,-1015.09))z54
+ --hide(z55=(342,-1015.59))z55--hide(z56=(341.901,-1011.51))z56..controls hide(z57=(342.085,-1008.42))z57 and hide(z58=(341.701,-1002.24))z58..hide(z59=(341.701,-1000.25))z59
+ --hide(z60=(342,-978.827))z60--hide(z61=(342,-977.831))z61..controls hide(z62=(342,-976.436))z62 and hide(z63=(341.616,-973.945))z63..hide(z64=(341.801,-970.657))z64
+ --hide(z65=(341.701,-967.369))z65--hide(z66=(338.683,-966.971))z66..controls hide(z67=(336.691,-966.772))z67 and hide(z68=(333.702,-966.274))z68..hide(z69=(328.82,-965.377))z69
+ --hide(z70=(326.229,-964.879))z70--hide(z71=(326.229,-967.569))z71--hide(z72=(332.207,-969.163))z72
+ ..controls hide(z73=(335.794,-970.159))z73 and hide(z74=(336.99,-971.056))z74..hide(z75=(337.488,-973.248))z75
+ ..controls hide(z76=(337.886,-975.24))z76 and hide(z77=(338.384,-982.513))z77..hide(z78=(338.384,-987.894))z78
+ ..controls hide(z79=(338.384,-991.978))z79 and hide(z80=(338.284,-994.17))z80..hide(z81=(337.687,-1001.04))z81
+ --hide(z82=(337.288,-1001.04))z82..controls hide(z83=(335.893,-1001.04))z83 and hide(z84=(335.096,-1000.95))z84..cycle;
+ %draw PreeditedPath1;
+%drawoptions( withcolor black );
+ %dotlabels.rt(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,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);
+PreeditedPath2 = hide(z85=(310,-859.104))z85..controls hide(z86=(310,-857.61))z86 and hide(z87=(309.691,-856))z87..hide(z88=(307.698,-856))z88
+ ..controls hide(z89=(305.706,-856))z89 and hide(z90=(306,-857.73))z90..hide(z91=(306,-859.005))z91
+ --hide(z92=(306,-918.683))z92..controls hide(z93=(306,-920.078))z93 and hide(z94=(305.706,-922))z94..hide(z95=(307.698,-922))z95
+ ..controls hide(z96=(309.691,-922))z96 and hide(z97=(310,-920.09))z97..cycle;
+ %draw PreeditedPath2;
+%drawoptions( withcolor black );
+ %dotlabels.rt(85,86,87,88,89,90,91,92,93,94,95,96,97);
+PreeditedPath3 = hide(z98=(329,-859.005))z98..controls hide(z99=(329,-857.61))z99 and hide(z100=(329.019,-856))z100..hide(z101=(327.026,-856))z101
+ ..controls hide(z102=(325.034,-856))z102 and hide(z103=(325,-857.735))z103..hide(z104=(325,-859.104))z104
+ --hide(z105=(325,-918.583))z105..controls hide(z106=(325,-920.078))z106 and hide(z107=(325.034,-922))z107..hide(z108=(327.026,-922))z108
+ ..controls hide(z109=(329.019,-922))z109 and hide(z110=(329,-920.09))z110..cycle;
+ %draw PreeditedPath3;
+%drawoptions( withcolor black );
+ %dotlabels.rt(98,99,100,101,102,103,104,105,106,107,108,109,110);
+PreeditedPath4 = hide(z111=(332.008,-747.24))z111--hide(z112=(333.701,-749.831))z112..controls hide(z113=(335.594,-752.72))z113 and hide(z114=(336.69,-754.912))z114..hide(z115=(336.69,-755.908))z115
+ ..controls hide(z116=(336.69,-756.605))z116 and hide(z117=(335.794,-757.203))z117..hide(z118=(334.698,-757.203))z118
+ ..controls hide(z119=(333.701,-757.203))z119 and hide(z120=(332.805,-757.004))z120..hide(z121=(330.712,-756.506))z121
+ --hide(z122=(301.122,-749.034))z122..controls hide(z123=(299.429,-748.635))z123 and hide(z124=(297.835,-748.337))z124..hide(z125=(297.038,-748.337))z125
+ ..controls hide(z126=(295.344,-748.337))z126 and hide(z127=(293.904,-749.333))z127..hide(z128=(293.904,-750.927))z128
+ ..controls hide(z129=(293.904,-753.816))z129 and hide(z130=(295.799,-757.602))z130..hide(z131=(300.326,-763.679))z131
+ ..controls hide(z132=(304.809,-769.956))z132 and hide(z133=(308.296,-773.443))z133..hide(z134=(315.171,-778.325))z134
+ --hide(z135=(301.521,-775.336))z135..controls hide(z136=(299.529,-774.938))z136 and hide(z137=(298.034,-774.639))z137..hide(z138=(297.337,-774.639))z138
+ ..controls hide(z139=(295.444,-774.639))z139 and hide(z140=(293.904,-775.635))z140..hide(z141=(293.904,-777.229))z141
+ ..controls hide(z142=(293.904,-780.218))z142 and hide(z143=(296.214,-784.801))z143..hide(z144=(300.625,-790.281))z144
+ ..controls hide(z145=(304.012,-794.665))z145 and hide(z146=(306.104,-796.657))z146..hide(z147=(314.872,-803.133))z147
+ --hide(z148=(301.621,-799.845))z148..controls hide(z149=(300.027,-799.447))z149 and hide(z150=(298.532,-799.248))z150..hide(z151=(297.337,-799.248))z151
+ ..controls hide(z152=(295.444,-799.248))z152 and hide(z153=(293.904,-800.144))z153..hide(z154=(293.904,-801.539))z154
+ ..controls hide(z155=(293.904,-803.631))z155 and hide(z156=(296.094,-807.417))z156..hide(z157=(301.621,-814.79))z157
+ --hide(z158=(303.614,-817.579))z158--hide(z159=(305.606,-816.882))z159--hide(z160=(303.514,-813.694))z160
+ ..controls hide(z161=(301.222,-810.007))z161 and hide(z162=(301.023,-809.708))z162..hide(z163=(301.023,-809.011))z163
+ ..controls hide(z164=(301.023,-807.915))z164 and hide(z165=(302.02,-807.218))z165..hide(z166=(303.514,-807.218))z166
+ ..controls hide(z167=(308.595,-807.218))z167 and hide(z168=(327.823,-811.302))z168..hide(z169=(342.071,-815.387))z169
+ --hide(z170=(343.167,-815.088))z170--hide(z171=(341.672,-808.313))z171--hide(z172=(331.51,-806.121))z172
+ ..controls hide(z173=(320.451,-803.73))z173 and hide(z174=(314.573,-801.04))z174..hide(z175=(308.595,-795.561))z175
+ ..controls hide(z176=(304.012,-791.376))z176 and hide(z177=(301.023,-786.893))z177..hide(z178=(301.023,-784.103))z178
+ ..controls hide(z179=(301.023,-783.406))z179 and hide(z180=(301.82,-783.007))z180..hide(z181=(303.115,-783.007))z181
+ ..controls hide(z182=(306.602,-783.007))z182 and hide(z183=(317.96,-785.199))z183..hide(z184=(335.396,-789.284))z184
+ --hide(z185=(342.071,-790.878))z185--hide(z186=(343.167,-790.38))z186--hide(z187=(341.672,-783.505))z187
+ --hide(z188=(331.012,-781.413))z188..controls hide(z189=(322.942,-779.819))z189 and hide(z190=(315.47,-776.431))z190..hide(z191=(310.588,-772.048))z191
+ ..controls hide(z192=(304.51,-766.568))z192 and hide(z193=(301.023,-761.586))z193..hide(z194=(301.023,-758.398))z194
+ ..controls hide(z195=(301.023,-757.601))z195 and hide(z196=(301.92,-757.103))z196..hide(z197=(303.514,-757.103))z197
+ ..controls hide(z198=(305.905,-757.103))z198 and hide(z199=(307.3,-757.402))z199..hide(z200=(315.968,-759.594))z200
+ ..controls hide(z201=(322.244,-761.188))z201 and hide(z202=(328.222,-762.881))z202..hide(z203=(331.61,-763.878))z203
+ ..controls hide(z204=(334.399,-764.774))z204 and hide(z205=(336.99,-765.173))z205..hide(z206=(339.181,-765.173))z206
+ ..controls hide(z207=(341.672,-765.173))z207 and hide(z208=(343,-764.077))z208..hide(z209=(343,-762.184))z209
+ ..controls hide(z210=(343,-759.594))z210 and hide(z211=(340.945,-756.007))z211..cycle;
+ %draw PreeditedPath4;
+%drawoptions( withcolor black );
+ %dotlabels.rt(111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211);
+PreeditedPath5 = hide(z212=(309.392,-705.894))z212--hide(z213=(309.392,-703.602))z213..controls hide(z214=(302.916,-702.805))z214 and hide(z215=(299.23,-702.107))z215..hide(z216=(296.639,-701.211))z216
+ ..controls hide(z217=(295.145,-703.602))z217 and hide(z218=(293.904,-707.089))z218..hide(z219=(293.904,-710.775))z219
+ ..controls hide(z220=(293.904,-715.259))z220 and hide(z221=(297.633,-722.631))z221..hide(z222=(302.916,-728.21))z222
+ ..controls hide(z223=(307.798,-733.69))z223 and hide(z224=(318.259,-738))z224..hide(z225=(328.72,-738))z225
+ ..controls hide(z226=(338.285,-738))z226 and hide(z227=(343.096,-733.635))z227..hide(z228=(343.096,-725.321))z228
+ ..controls hide(z229=(343.096,-719.941))z229 and hide(z230=(341.186,-715.159))z230..hide(z231=(336.89,-709.679))z231
+ --hide(z232=(332.805,-704.698))z232--hide(z233=(330.812,-705.495))z233--hide(z234=(331.809,-706.989))z234
+ ..controls hide(z235=(336.591,-714.162))z235 and hide(z236=(338.096,-717.948))z236..hide(z237=(338.096,-721.435))z237
+ ..controls hide(z238=(338.096,-727.015))z238 and hide(z239=(334.174,-729.999))z239..hide(z240=(326.428,-729.999))z240
+ ..controls hide(z241=(315.668,-729.999))z241 and hide(z242=(305.307,-726.472))z242..hide(z243=(301.521,-721.535))z243
+ ..controls hide(z244=(299.927,-719.443))z244 and hide(z245=(298.904,-717.052))z245..hide(z246=(298.904,-713.963))z246
+ ..controls hide(z247=(298.904,-709.479))z247 and hide(z248=(300.897,-705.893))z248..cycle;
+ %draw PreeditedPath5;
+%drawoptions( withcolor black );
+ %dotlabels.rt(212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248);
+PreeditedPath6 = hide(z249=(304.359,-696.969))z249--hide(z250=(306.328,-696.969))z250..controls hide(z251=(306.101,-682.809))z251 and hide(z252=(306,-682.809))z252..hide(z253=(306,-680.083))z253
+ ..controls hide(z254=(306,-677.357))z254 and hide(z255=(305.773,-677.357))z255..hide(z256=(306,-662.743))z256
+ ..controls hide(z257=(304.563,-662.895))z257 and hide(z258=(303.878,-662.895))z258..hide(z259=(302.92,-662.895))z259
+ ..controls hide(z260=(301.936,-662.895))z260 and hide(z261=(301.179,-662.895))z261..hide(z262=(299.513,-662.743))z262
+ ..controls hide(z263=(299.892,-671.451))z263 and hide(z264=(299.968,-674.934))z264..hide(z265=(300.271,-688.942))z265
+ --hide(z266=(285.656,-675.161))z266..controls hide(z267=(277.857,-667.816))z267 and hide(z268=(273.693,-666))z268..hide(z269=(268.014,-666))z269
+ ..controls hide(z270=(259.306,-666))z270 and hide(z271=(254,-671.733))z271..hide(z272=(254,-681.068))z272
+ ..controls hide(z273=(254,-686.52))z273 and hide(z274=(255.495,-690.23))z274..hide(z275=(259.23,-693.94))z275
+ --hide(z276=(269.528,-695.227))z276--hide(z277=(269.528,-693.031))z277--hide(z278=(266.045,-692.047))z278
+ ..controls hide(z279=(261.653,-690.836))z279 and hide(z280=(260,-688.11))z280..hide(z281=(260,-683.037))z281
+ ..controls hide(z282=(260,-676.525))z282 and hide(z283=(263.996,-672))z283..hide(z284=(270.285,-672))z284
+ ..controls hide(z285=(275.964,-672))z285 and hide(z286=(281.567,-675.278))z286..cycle;
+ %draw PreeditedPath6;
+%drawoptions( withcolor black );
+ %dotlabels.rt(249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286);
+PreeditedPath7 = hide(z287=(330.015,-635.015))z287..controls hide(z288=(330.912,-637.705))z288 and hide(z289=(331.51,-639.499))z289..hide(z290=(333.004,-644.779))z290
+ ..controls hide(z291=(340.576,-645.477))z291 and hide(z292=(347.052,-647.967))z292..hide(z293=(356.616,-653.746))z293
+ --hide(z294=(357.712,-652.351))z294--hide(z295=(355.819,-648.266))z295..controls hide(z296=(345.358,-640.196))z296 and hide(z297=(339.082,-636.41))z297..cycle;
+ %draw PreeditedPath7;
+%drawoptions( withcolor black );
+ %dotlabels.rt(287,288,289,290,291,292,293,294,295,296,297);
+PreeditedPath8 = hide(z298=(270.736,-591))z298--hide(z299=(269.938,-591.477))z299..controls hide(z300=(271.632,-595.861))z300 and hide(z301=(272.429,-599.149))z301..hide(z302=(273.625,-607.02))z302
+ --hide(z303=(276.414,-607.02))z303--hide(z304=(276.414,-601.44))z304..controls hide(z305=(276.414,-599.647))z305 and hide(z306=(277.51,-599))z306..hide(z307=(280.499,-599))z307
+ --hide(z308=(327.026,-599))z308..controls hide(z309=(333.203,-599))z309 and hide(z310=(335.893,-599.093))z310..hide(z311=(342.867,-599.746))z311
+ --hide(z312=(343.465,-598.152))z312--hide(z313=(339.879,-594.167))z313..controls hide(z314=(342.469,-590.182))z314 and hide(z315=(343.196,-586.595))z315..hide(z316=(343.196,-581.315))z316
+ ..controls hide(z317=(343.196,-577.43))z317 and hide(z318=(342.584,-574.839))z318..hide(z319=(341.273,-572.747))z319
+ --hide(z320=(334.1,-562.784))z320..controls hide(z321=(330.912,-558.4))z321 and hide(z322=(322.643,-555))z322..hide(z323=(315.37,-555))z323
+ ..controls hide(z324=(303.812,-555))z324 and hide(z325=(296,-562.436))z325..hide(z326=(296,-572.946))z326
+ ..controls hide(z327=(296,-577.629))z327 and hide(z328=(297.606,-582.511))z328..hide(z329=(299.927,-585.101))z329
+ --hide(z330=(305.506,-591))z330--hide(z331=(306.602,-587.99))z331..controls hide(z332=(303.713,-585.201))z332 and hide(z333=(302,-581.315))z333..hide(z334=(302,-577.231))z334
+ ..controls hide(z335=(302,-568.862))z335 and hide(z336=(308.782,-563))z336..hide(z337=(319.455,-563))z337
+ ..controls hide(z338=(330.613,-563))z338 and hide(z339=(338.196,-569.219))z339..hide(z340=(338.196,-578.028))z340
+ ..controls hide(z341=(338.196,-583.208))z341 and hide(z342=(335.119,-591.001))z342..hide(z343=(333.004,-591.001))z343
+ --hide(z344=(311.584,-591))z344..controls hide(z345=(310.189,-591))z345 and hide(z346=(308.396,-589.843))z346..hide(z347=(306.602,-587.99))z347
+ --hide(z348=(305.506,-591))z348--cycle;
+PreeditedPath9 = hide(z349=(276.414,-548.138))z349--hide(z350=(276.414,-542.559))z350..controls hide(z351=(276.414,-540.765))z351 and hide(z352=(277.51,-540))z352..hide(z353=(280.499,-540))z353
+ --hide(z354=(332.108,-540))z354..controls hide(z355=(338.384,-540))z355 and hide(z356=(339.082,-540.304))z356..hide(z357=(339.281,-543.754))z357
+ --hide(z358=(339.58,-548.337))z358--hide(z359=(342.569,-548.337))z359..controls hide(z360=(342.27,-538.374))z360 and hide(z361=(342,-538.374))z361..hide(z362=(342,-535.884))z362
+ ..controls hide(z363=(342,-533.393))z363 and hide(z364=(341.701,-533.393))z364..hide(z365=(342,-523.43))z365
+ --hide(z366=(339.58,-523.43))z366--hide(z367=(339.281,-528.013))z367..controls hide(z368=(339.082,-531.4))z368 and hide(z369=(338.384,-532))z369..hide(z370=(332.108,-532))z370
+ --hide(z371=(270.736,-532))z371--hide(z372=(269.938,-532.596))z372..controls hide(z373=(271.632,-536.98))z373 and hide(z374=(272.429,-540.268))z374..cycle;
+ %draw PreeditedPath9;
+%drawoptions( withcolor black );
+ %dotlabels.rt(349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374);
+PreeditedPath10 = hide(z375=(291.607,-505.359))z375--hide(z376=(291.607,-501.374))z376--hide(z377=(282.641,-487.027))z377
+ ..controls hide(z378=(280.548,-483.739))z378 and hide(z379=(279.751,-483.042))z379..hide(z380=(277.958,-483.042))z380
+ ..controls hide(z381=(276.065,-483.042))z381 and hide(z382=(274.57,-484.436))z382..hide(z383=(274.57,-486.13))z383
+ ..controls hide(z384=(274.57,-487.624))z384 and hide(z385=(275.666,-489.418))z385..cycle;
+ %draw PreeditedPath10;
+%drawoptions( withcolor black );
+ %dotlabels.rt(375,376,377,378,379,380,381,382,383,384,385);
+PreeditedPath11 = hide(z386=(334.1,-489))z386--hide(z387=(342.569,-489.668))z387..controls hide(z388=(342.27,-483.192))z388 and hide(z389=(342,-483.192))z389..hide(z390=(342,-481.897))z390
+ ..controls hide(z391=(342,-481.399))z391 and hide(z392=(341.621,-478.908))z392..hide(z393=(342,-474.524))z393
+ --hide(z394=(339,-474.524))z394--hide(z395=(339.38,-478.41))z395..controls hide(z396=(339.281,-480.801))z396 and hide(z397=(338.484,-481))z397..hide(z398=(333.602,-481))z398
+ --hide(z399=(315.37,-481))z399..controls hide(z400=(300.824,-481))z400 and hide(z401=(296,-485.238))z401..hide(z402=(296,-496.941))z402
+ ..controls hide(z403=(296,-501.225))z403 and hide(z404=(296.948,-505.21))z404..hide(z405=(298.931,-508.996))z405
+ --hide(z406=(302.119,-514.015))z406--hide(z407=(308.595,-514.015))z407--hide(z408=(309.292,-511.686))z408
+ --hide(z409=(306.204,-510.391))z409..controls hide(z410=(301.521,-508.299))z410 and hide(z411=(301,-507.302))z411..hide(z412=(301,-502.719))z412
+ ..controls hide(z413=(301,-493.354))z413 and hide(z414=(304.635,-489.469))z414..hide(z415=(313.576,-489.17))z415
+ --hide(z416=(316.765,-488.999))z416--hide(z417=(329.916,-489))z417..controls hide(z418=(334.001,-491.926))z418 and hide(z419=(337.196,-498.285))z419..hide(z420=(337.196,-502.221))z420
+ ..controls hide(z421=(337.196,-506.206))z421 and hide(z422=(333.783,-510))z422..hide(z423=(329.816,-510))z423
+ ..controls hide(z424=(326.13,-510))z424 and hide(z425=(322.643,-507.884))z425..hide(z426=(320.75,-504.711))z426
+ ..controls hide(z427=(319.255,-502.193))z427 and hide(z428=(317.861,-496.654))z428..hide(z429=(316.765,-488.999))z429
+ --hide(z430=(313.576,-489.17))z430--hide(z431=(315.37,-499.033))z431..controls hide(z432=(317.861,-512.583))z432 and hide(z433=(322.543,-518))z433..hide(z434=(331.211,-518))z434
+ ..controls hide(z435=(338.982,-518))z435 and hide(z436=(343.196,-513.415))z436..hide(z437=(343.196,-505.708))z437
+ ..controls hide(z438=(343.196,-503.915))z438 and hide(z439=(342.998,-502.221))z439..cycle;
+ %draw PreeditedPath11;
+%drawoptions( withcolor black );
+ %dotlabels.rt(386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439);
+PreeditedPath12 = hide(z440=(321,-443.539))z440--hide(z441=(314.174,-440.55))z441--hide(z442=(314,-441.048))z442
+ --hide(z443=(314,-467.251))z443--hide(z444=(320.351,-469.941))z444--cycle;
+ %draw PreeditedPath12;
+%drawoptions( withcolor black );
+ %dotlabels.rt(440,441,442,443,444);
+PreeditedPath13 = hide(z445=(270.736,-424))z445--hide(z446=(269.938,-424.41))z446..controls hide(z447=(271.632,-428.794))z447 and hide(z448=(272.429,-432.082))z448..hide(z449=(273.625,-439.953))z449
+ --hide(z450=(276.414,-439.953))z450--hide(z451=(276.414,-434.374))z451..controls hide(z452=(276.414,-432.58))z452 and hide(z453=(277.51,-432))z453..hide(z454=(280.499,-432))z454
+ --hide(z455=(327.026,-432))z455..controls hide(z456=(333.203,-432))z456 and hide(z457=(335.893,-432.085))z457..hide(z458=(342.867,-432.68))z458
+ --hide(z459=(343.465,-431.086))z459--hide(z460=(339.879,-427.101))z460..controls hide(z461=(342.469,-423.115))z461 and hide(z462=(343.196,-419.529))z462..hide(z463=(343.196,-414.249))z463
+ ..controls hide(z464=(343.196,-410.363))z464 and hide(z465=(342.584,-407.773))z465..hide(z466=(341.273,-405.68))z466
+ --hide(z467=(334.1,-395.718))z467..controls hide(z468=(330.912,-391.334))z468 and hide(z469=(322.643,-388))z469..hide(z470=(315.37,-388))z470
+ ..controls hide(z471=(303.812,-388))z471 and hide(z472=(296,-395.409))z472..hide(z473=(296,-405.88))z473
+ ..controls hide(z474=(296,-410.562))z474 and hide(z475=(297.606,-415.444))z475..hide(z476=(299.927,-418.034))z476
+ --hide(z477=(305.506,-424))z477--hide(z478=(306.602,-420.924))z478..controls hide(z479=(303.713,-418.134))z479 and hide(z480=(302,-414.249))z480..hide(z481=(302,-410.164))z481
+ ..controls hide(z482=(302,-401.795))z482 and hide(z483=(308.782,-396))z483..hide(z484=(319.455,-396))z484
+ ..controls hide(z485=(330.613,-396))z485 and hide(z486=(338.196,-402.191))z486..hide(z487=(338.196,-410.961))z487
+ ..controls hide(z488=(338.196,-416.142))z488 and hide(z489=(335.119,-424.001))z489..hide(z490=(333.004,-424.001))z490
+ --hide(z491=(311.584,-424))z491..controls hide(z492=(310.189,-424))z492 and hide(z493=(308.396,-422.817))z493..hide(z494=(306.602,-420.924))z494
+ --hide(z495=(305.506,-424))z495--cycle;
+PreeditedPath14 = hide(z496=(276.414,-381.072))z496--hide(z497=(276.414,-375.492))z497..controls hide(z498=(276.414,-373.699))z498 and hide(z499=(277.51,-373))z499..hide(z500=(280.499,-373))z500
+ --hide(z501=(332.108,-373))z501..controls hide(z502=(338.384,-373))z502 and hide(z503=(339.082,-373.298))z503..hide(z504=(339.281,-376.688))z504
+ --hide(z505=(339.58,-381.271))z505--hide(z506=(342.569,-381.271))z506..controls hide(z507=(342.27,-371.308))z507 and hide(z508=(342,-371.308))z508..hide(z509=(342,-368.817))z509
+ ..controls hide(z510=(342,-366.326))z510 and hide(z511=(341.701,-366.326))z511..hide(z512=(342,-356.363))z512
+ --hide(z513=(339.58,-356.363))z513--hide(z514=(339.281,-360.946))z514..controls hide(z515=(339.082,-364.334))z515 and hide(z516=(338.384,-365))z516..hide(z517=(332.108,-365))z517
+ --hide(z518=(270.736,-365))z518--hide(z519=(269.938,-365.529))z519..controls hide(z520=(271.632,-369.913))z520 and hide(z521=(272.429,-373.201))z521..cycle;
+ %draw PreeditedPath14;
+%drawoptions( withcolor black );
+ %dotlabels.rt(496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521);
+PreeditedPath15 = hide(z522=(291.607,-338.289))z522--hide(z523=(291.607,-334.304))z523--hide(z524=(282.641,-319.957))z524
+ ..controls hide(z525=(280.548,-316.669))z525 and hide(z526=(279.751,-315.972))z526..hide(z527=(277.958,-315.972))z527
+ ..controls hide(z528=(276.065,-315.972))z528 and hide(z529=(274.57,-317.366))z529..hide(z530=(274.57,-319.06))z530
+ ..controls hide(z531=(274.57,-320.554))z531 and hide(z532=(275.666,-322.348))z532..cycle;
+ %draw PreeditedPath15;
+%drawoptions( withcolor black );
+ %dotlabels.rt(522,523,524,525,526,527,528,529,530,531,532);
+PreeditedPath16 = hide(z533=(334.1,-322))z533--hide(z534=(342.569,-322.598))z534..controls hide(z535=(342.27,-316.122))z535 and hide(z536=(342,-316.122))z536..hide(z537=(342,-314.827))z537
+ ..controls hide(z538=(342,-314.329))z538 and hide(z539=(341.621,-311.838))z539..hide(z540=(342,-307.454))z540
+ --hide(z541=(339,-307.454))z541--hide(z542=(339.38,-311.34))z542..controls hide(z543=(339.281,-313.731))z543 and hide(z544=(338.484,-314))z544..hide(z545=(333.602,-314))z545
+ --hide(z546=(315.37,-314))z546..controls hide(z547=(300.824,-314))z547 and hide(z548=(296,-318.219))z548..hide(z549=(296,-329.871))z549
+ ..controls hide(z550=(296,-334.155))z550 and hide(z551=(296.948,-338.14))z551..hide(z552=(298.931,-341.926))z552
+ --hide(z553=(302.119,-347.015))z553--hide(z554=(308.595,-347.015))z554--hide(z555=(309.292,-344.616))z555
+ --hide(z556=(306.204,-343.321))z556..controls hide(z557=(301.521,-341.229))z557 and hide(z558=(301,-340.232))z558..hide(z559=(301,-335.649))z559
+ ..controls hide(z560=(301,-326.284))z560 and hide(z561=(304.635,-322.399))z561..hide(z562=(313.576,-322.1))z562
+ --hide(z563=(316.765,-321.999))z563--hide(z564=(329.916,-322))z564..controls hide(z565=(334.001,-324.911))z565 and hide(z566=(337.196,-331.235))z566..hide(z567=(337.196,-335.151))z567
+ ..controls hide(z568=(337.196,-339.136))z568 and hide(z569=(333.783,-343))z569..hide(z570=(329.816,-343))z570
+ ..controls hide(z571=(326.13,-343))z571 and hide(z572=(322.643,-340.856))z572..hide(z573=(320.75,-337.641))z573
+ ..controls hide(z574=(319.255,-335.135))z574 and hide(z575=(317.861,-329.619))z575..hide(z576=(316.765,-321.999))z576
+ --hide(z577=(313.576,-322.1))z577--hide(z578=(315.37,-331.963))z578..controls hide(z579=(317.861,-345.513))z579 and hide(z580=(322.543,-351))z580..hide(z581=(331.211,-351))z581
+ ..controls hide(z582=(338.982,-351))z582 and hide(z583=(343.196,-346.389))z583..hide(z584=(343.196,-338.638))z584
+ ..controls hide(z585=(343.196,-336.845))z585 and hide(z586=(342.998,-335.151))z586..cycle;
+ %draw PreeditedPath16;
+%drawoptions( withcolor black );
+ %dotlabels.rt(533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586);
+PreeditedPath17 = hide(z587=(331.211,-292.211))z587..controls hide(z588=(331.211,-295.2))z588 and hide(z589=(334,-297.89))z589..hide(z590=(336.99,-297.89))z590
+ ..controls hide(z591=(339.979,-297.89))z591 and hide(z592=(342,-295.2))z592..hide(z593=(342,-292.311))z593
+ ..controls hide(z594=(342,-289.123))z594 and hide(z595=(339.668,-286.333))z595..hide(z596=(336.99,-286.333))z596
+ ..controls hide(z597=(334,-286.333))z597 and hide(z598=(331.211,-289.122))z598..cycle;
+ %draw PreeditedPath17;
+%drawoptions( withcolor black );
+ %dotlabels.rt(587,588,589,590,591,592,593,594,595,596,597,598);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% second featpost part
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ verygoodcone(true, black, blue, rmax, (0,0,zmax) );
+ numeric k;
+ drawoptions( withcolor blue );
+ for k = 1 upto 17:
+ fill closedpathinspace( PreeditedPath[k], converterfunc );
+ endfor;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% That's it!
+
+endfig;
+end
+
+
+
+
+
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/embroncordada.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/embroncordada.mp
new file mode 100644
index 00000000000..ccc08d09d80
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/embroncordada.mp
@@ -0,0 +1,57 @@
+% embroncordada.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+verbatimtex
+\documentclass{article}
+%\usepackage{pandora}
+\usepackage{palatino}
+\begin{document}
+etex
+
+beginfig(1);
+ picture embroncordada;
+ numeric u, v;
+ path pa;
+ u = 1mm;
+ v = 1.1mm;
+ z1 = (105u,250v);
+ z2 = (105u,220v);
+ z3 = (125u,200v);
+ z4 = (85u,180v);
+ z5 = (25u,150v);
+ z6 = (105u,120v);
+ z7 = (185u,150v);
+ z8 = (110u,170v);
+ z9 = (45u,150v);
+ z10= (100u,105v);
+ z11= (170u,150v);
+ z12= (90u,195v);
+ z13= (35u,150v);
+ z14= (120u,135v);
+ z15= (80u,100v);
+ z16= (115u,75v);
+ z17= (105u,50v);
+ pa = z1{down}..z2..z3..z4..z5..z6..z7..z8..z9..z10..
+ z11..z12..z13..z14..z15..z16..{down}z17;
+ ropepattern( pa, 8u, 35 );
+ embroncordada = thelabel( btex
+ \begin{tabular}{c}
+ \textsf{EMBRON} \\
+ \textsf{CORDADA}
+ \end{tabular}
+ etex scaled 8, (105u,150v) );
+ draw embroncordada;
+% dotlabels(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/fakehole.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/fakehole.mp
new file mode 100644
index 00000000000..c1d28ea33c1
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/fakehole.mp
@@ -0,0 +1,59 @@
+% fakehole.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input featpost3Dplus2D;
+
+Spread := 23;
+f := (13,6,4.5);
+ShadowOn := true;
+LightSource := 10*(4,-1.7,2);
+beginfig(1);
+ numeric bigray, smaray, posray, posang, disang, aresiz, dislen;
+ numeric numl, numr, holang, i;
+ color pos, disaxe, holaxe;
+ aresiz := 13;
+ bigray := 2;
+ smaray := 0.25;
+ posray := 4;
+ posang := -10;
+ disang := 15;
+ dislen := 0.4;
+ holang := 115;
+ numl := 45;
+ disaxe := dislen*(cosd(disang),sind(disang),0);
+ pos := posray*(cosd(posang),sind(posang),0);
+ holaxe := (cosd(disang+90)*cosd(holang),
+ sind(disang+90)*cosd(holang),
+ sind(holang));
+ HoriZon := -bigray;
+ setthestage( 0.5*numl, aresiz );
+ rigorousdisc( smaray, true, pos, bigray, disaxe );
+ numr := floor(bigray/smaray);
+ for i=2-numr step 3 until -3:
+ fakehole( pos+i*smaray*holaxe, disaxe, smaray );
+ fakehole( pos-i*smaray*holaxe, disaxe, smaray );
+ endfor;
+endfig;
+
+ShadowOn := false;
+Spread := 25;
+ShiftV := 105.00mm*(0.5,1);
+beginfig(2);
+ numeric len, ray;
+ len = 10;
+ ray = 0.9;
+ f := (5,2*ray,1+1.5*ray);
+ viewcentr := (0,2.5*ray,1+0.5*ray);
+ drawoptions( withpen pencircle scaled 2.3pt );
+ kindofcube(false,true,black,0,0,0,1,len*ray,2);
+ numeric i;
+ for i=2 step 2 until len-1:
+ fakehole( (0,i*ray,1), red, ray );
+ endfor;
+endfig;
+
+end.
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/featpostlogo.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/featpostlogo.mp
new file mode 100644
index 00000000000..9e68e9899e6
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/featpostlogo.mp
@@ -0,0 +1,29 @@
+% featpostlogo.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\newfont{\normald}{logod10 scaled 5000}
+\pagestyle{empty}
+\begin{document}
+etex
+
+input boxes;
+
+beginfig(1);
+ picture logo;
+ defaultdx := 3mm;
+ defaultdy := 2mm;
+ logo = thelabel.urt( btex {\normald FEATPOST} etex, origin );
+ boxit.thelogo( logo );
+ drawboxed( thelogo );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/ffcbob.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/ffcbob.mp
new file mode 100644
index 00000000000..3e4eff5a828
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/ffcbob.mp
@@ -0,0 +1,84 @@
+% ffcbob.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+f := 2*(15,0,2);
+Spread := 20;
+
+beginfig(1);
+ numeric phi, theta, back, numbacks, minnum, maxnum;
+ phi = 30;
+ theta = 80;
+ back = 7;
+ numbacks = 30;
+ minnum = 3;
+ maxnum = 15;
+ numeric upl[], dol[], pos[], len[], rai[] rao[];
+ upl1=1; dol1=17;pos1=-5.0; len1=2.0; rai1=1.5; rao1=6.5;
+ upl2=2; dol2=16;pos2=-3.0; len2=0.8; rai2=1.5; rao2=6.3;
+ upl3=3; dol3=15;pos3=-2.2; len3=0.4; rai3=1.5; rao3=4.8;
+ upl4=4; dol4=14;pos4=-1.8; len4=0.4; rai4=1.5; rao4=4.4;
+ upl5=5; dol5=13;pos5=-1.4; len5=0.4; rai5=1.5; rao5=4.2;
+ upl6=6; dol6=11;pos6=-1.0; len6=0.2; rai6=1.5; rao6=3.2;
+ upl7=7; dol7=12;pos7=-1.0; len7=0.2; rai7=4.0; rao7=4.6;
+ upl8=8; dol8=10;pos8=-0.8; len8=0.6; rai8=1.5; rao8=3.2;
+ upl9=9; dol9=7; pos9=-0.2; len9=0.4; rai9=1.5; rao9=3.2;
+ upl10=10;dol10=9;pos10=-0.2;len10=0.2;rai10=4.0;rao10=4.4;
+ upl11=11;dol11=8;pos11=0.0; len11=0.2;rai11=4.0;rao11=4.6;
+ upl12=12;dol12=6;pos12=0.2; len12=0.8;rai12=1.5;rao12=4.8;
+ upl13=13;dol13=5;pos13=1.0; len13=0.4;rai13=1.5;rao13=4.4;
+ upl14=14;dol14=3;pos14=1.4; len14=0.2;rai14=1.5;rao14=4.4;
+ upl15=15;dol15=4;pos15=1.4; len15=0.2;rai15=4.8;rao15=6.3;
+ upl16=16;dol16=2;pos16=1.6; len16=0.6;rai16=1.5;rao16=6.3;
+ upl17=17;dol17=1;pos17=2.2; len17=2.0;rai17=1.5;rao17=6.5;
+ color axe;
+ axe = (cosd(phi)*cosd(theta),sind(phi)*cosd(theta),sind(theta));
+ numeric i;
+ for i=0 upto numbacks:
+ draw rp(back*(1,2*i/numbacks-1,-1))--
+ rp(back*(-1,2*i/numbacks-1,-1))--
+ rp(back*(-1,2*i/numbacks-1,1)) withcolor 0.7background;
+ endfor;
+ numeric crux;
+ crux = cdotprod( f, axe );
+ numeric j, k;
+ if crux <= pos[minnum+1]:
+ for i=minnum upto maxnum:
+ j := maxnum;
+ forever:
+ exitunless dol[j] <> i;
+ j := decr( j );
+ endfor;
+% rigorousdisc(rai[j],true,axe*pos[j],rao[j],axe*len[j]);
+ rigorousdisc(0,true,axe*pos[j],rao[j],axe*len[j]);
+ endfor;
+ elseif crux > pos[maxnum]:
+ for i=minnum upto maxnum:
+% rigorousdisc(rai[i],true,axe*pos[i],rao[i],axe*len[i]);
+ rigorousdisc(0,true,axe*pos[i],rao[i],axe*len[i]);
+ endfor;
+ else:
+ k := minnum+2;
+ forever:
+ exitif crux <= pos[k];
+ k := incr( k );
+ endfor;
+ for i=minnum upto k-1:
+% rigorousdisc(rai[i],true,axe*pos[i],rao[i],axe*len[i]);
+ rigorousdisc(0,true,axe*pos[i],rao[i],axe*len[i]);
+ endfor;
+ for i=k upto maxnum:
+ j := maxnum;
+ forever:
+ exitunless dol[j] <> i;
+ j := decr( j );
+ endfor;
+% rigorousdisc(rai[j],true,axe*pos[j],rao[j],axe*len[j]);
+ rigorousdisc(0,true,axe*pos[j],rao[j],axe*len[j]);
+ endfor;
+ fi;
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/fieldlinesnorma.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/fieldlinesnorma.mp
new file mode 100644
index 00000000000..ca3e1edb9b6
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/fieldlinesnorma.mp
@@ -0,0 +1,104 @@
+% fieldlinesnorma.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+Spread := 25;
+f := (10,-2,7);
+
+color posa, posb, perpd;
+numeric kfac;
+posa = -5*green;
+posb = 5*green;
+perpd = (1,0,1);
+kfac = -10;
+
+def vecfunc( expr posit )=
+ begingroup
+ save modula, modulb, field;
+ color field;
+ numeric modula, modulb;
+ modula = conorm( posit-posa );
+ modulb = conorm( posit-posb );
+ field = ( posit-posa )/(modula**3)+kfac*( posit-posb )/(modulb**3);
+ ( N(field) )
+ endgroup
+enddef;
+
+def potfunc( expr posit )=
+ begingroup
+ save field;
+ color field;
+ field = vecfunc( posit );
+ ( ncrossprod( field, perpd ) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, lena, lenb, numa, numb, sa, sb, diffstep, ray;
+ color stp;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 85;
+ lenb = 20;
+ numa = 30;
+ numb = 18;
+ diffstep = 0.1;
+ ray = 0.5;
+ sa = 75;
+ sb = 90;
+ for i=sa step numa until (360+sa):
+ stp := posa+( ray*cosd(i), ray*sind(i), 0 );
+ oneline := fieldlinepath( lena, stp, diffstep, vecfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ for i=sb step numb until (360+sb):
+ stp := posb+( ray*cosd(i), ray*sind(i), 0 );
+ oneline := fieldlinepath( lenb, stp, -diffstep, vecfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(posa) withpen grossa;
+ draw rp(posb) withpen grossa;
+endfig;
+
+Spread := 17;
+f:= (10,-6,7);
+
+beginfig(2);
+ numeric i, lena, lenb, numa, numb, sa, sb, diffstep, ang;
+ color stp;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 85;
+ lenb = 125;
+ numa = 0.03;
+ numb = 0.30;
+ diffstep = 0.2;
+ ang = -90;
+ sa = 1.5;
+ sb = 4.5;
+ for i=sa step numa until (1.5+sa):
+ stp := posa+i*cosd(ang)*green+i*sind(ang)*ncrossprod(perpd,green);
+ oneline := fieldlinepath( lena, stp, diffstep, potfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ ang := 180;
+ for i=sb step numb until (3.7+sb):
+ stp := posb+i*cosd(ang)*green+i*sind(ang)*ncrossprod(perpd,green);
+ oneline := fieldlinepath( lenb, stp, diffstep, potfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(posa) withpen grossa;
+ draw rp(posb) withpen grossa;
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/fis1prex.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/fis1prex.mp
new file mode 100644
index 00000000000..cff9d672d88
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/fis1prex.mp
@@ -0,0 +1,131 @@
+% fis1prex.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric largtecto, molasfrac, altutecto, compcorda, espetecto;
+ numeric largmolas, largnum, cordafrac, espesfrac, largmolfr;
+ numeric u, alpha, i, numturns, alphafrac, alpharadi, rcf, rcd;
+ pen mainp, auxip;
+ path leftspr, rightsp, corda, boxtecto, traco, linhalpha, rcp;
+ pair esqutecto, diretecto, esquemola, direimola, espessvec;
+ largnum = 100;
+ u = 1mm;
+ molasfrac = 0.8;
+ espesfrac = 0.1;
+ cordafrac = 0.3;
+ alphafrac = 0.3;
+ largmolfr = 0.12;
+ rcf = 0.1;
+ numturns = 11;
+ alpha = 120;
+ mainp = pencircle scaled 0.4u;
+ auxip = pencircle scaled 0.2u;
+ largtecto = largnum*u;
+ rcd = rcf*largtecto;
+ largmolas = largmolfr*molasfrac*largtecto;
+ compcorda = cordafrac*largtecto;
+ espetecto = espesfrac*largtecto;
+ altutecto = 0.5*largtecto*molasfrac*cosd(alpha/2)/sind(alpha/2);
+ alpharadi = 2*alphafrac*altutecto;
+ esqutecto = (-largtecto/2,altutecto);
+ diretecto = (largtecto/2,altutecto);
+ esquemola = (-largtecto*molasfrac/2,altutecto);
+ direimola = (largtecto*molasfrac/2,altutecto);
+ espessvec = (0,espetecto);
+ boxtecto = esqutecto--
+ diretecto--
+ (diretecto+espessvec)--
+ (esqutecto+espessvec)--cycle;
+ traco = (origin--(dir(45))) scaled 6in;
+ for i=-largnum upto largnum:
+ draw traco shifted (2*i*u,0) withpen auxip;
+ endfor;
+ clip currentpicture to boxtecto;
+ pickup mainp;
+ draw esqutecto--diretecto;
+ leftspr = springpath(direimola,origin,numturns,largmolas,0.55);
+ rightsp = springpath(origin,esquemola,numturns,largmolas,0.55);
+ draw leftspr;
+ draw rightsp;
+ rcp = randomcirc( rcd, 0.1*rcd, 180 ) shifted (0,-compcorda);
+ draw rcp;
+ draw origin--(0,-compcorda) cutafter rcp;
+ linhalpha = fullcircle scaled alpharadi;
+ linhalpha := linhalpha cutafter rightsp;
+ linhalpha := linhalpha cutbefore leftspr;
+ draw linhalpha withpen auxip;
+ label(btex m etex scaled 3, (0,-compcorda) );
+ label.urt(btex $\alpha$ etex scaled 3, (0,alpharadi/2) );
+endfig;
+
+beginfig(2);
+ numeric u, basesize, baseheight, alphang, thetang, sfearsize;
+ numeric armsize, marginraise, totalraise, axeray, cardansize;
+ color basepos, tdorigin, oneaxe, otheraxe, rotaxbascenter, axedir;
+ color gluaxbascenter, rotrajcenter, cardanpos, refpoint, anotheraxe;
+ color armdir, armbasonepos, armbastwopos, sfearpos;
+ path glueaxebase, rotataxebase, rotrajector, axepath, sfearpath;
+ numeric armray;
+ u = 0.0125mm;
+ basesize = 30u;
+ baseheight = 3u;
+ alphang = 20;
+ thetang = -18;
+ armsize = 25u;
+ marginraise = 6u;
+ axeray = 3u;
+ cardansize = 3u;
+ sfearsize = 4u;
+ armray = 1.5u;
+ totalraise = armsize*sind(alphang)+marginraise+cardansize*cosd(alphang);
+ basepos = (0,0,-0.5baseheight);
+ f := -2*(-2basesize,-basesize,-5baseheight);
+ kindofcube(false, false, basepos, 0, 0, 0, 2basesize, 2basesize, baseheight );
+ tdorigin = (0,0,0);
+ oneaxe = (0,axeray/cosd(alphang),0);
+ otheraxe = (1,0,0);
+ anotheraxe = (0,cosd(alphang),-sind(alphang));
+ gluaxbascenter = tdorigin - (0,totalraise*sind(alphang),0);
+ glueaxebase = ellipticpath( gluaxbascenter, oneaxe, axeray*otheraxe );
+ axedir = (0,sind(alphang),cosd(alphang));
+ rotrajcenter = (0,0,totalraise);
+ rotaxbascenter = rotrajcenter-axedir*cardansize;
+ refpoint = rotrajcenter+axedir*cardansize;
+ rotataxebase = rigorouscircle( rotaxbascenter, axedir, axeray );
+ rotrajector = rigorouscircle( rotrajcenter, axedir, armsize );
+ axepath = twocyclestogether( glueaxebase, rotataxebase );
+ fill axepath withcolor background;
+ draw axepath;
+ draw rotataxebase;
+ drawarrow subpath (3,10.5) of rotrajector dashed evenly;
+% dotlabel.top( btex 1 etex, point 1 of rotrajector );
+% dotlabel.top( btex 5 etex, point 5 of rotrajector );
+% dotlabel.top( btex 3 etex, point 3 of rotrajector );
+ kindofcube(false,false,rotrajcenter,90,90-alphang,thetang,2cardansize,2cardansize,2cardansize);
+ draw rp(refpoint);
+ armdir := otheraxe*cosd(thetang)+anotheraxe*sind(thetang);
+ armbasonepos = rotrajcenter + cardansize*armdir;
+ armbastwopos = rotrajcenter + (armsize-sfearsize)*armdir; % NOT RIGOROUS
+ sfearpos = rotrajcenter + armsize*armdir;
+ rigorousdisc( 0, true, armbasonepos, armray, armbastwopos-armbasonepos );
+ sfearpath = rigorousfearpath( sfearpos, sfearsize );
+ fill sfearpath withcolor background;
+ draw sfearpath;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/fis3prex.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/fis3prex.mp
new file mode 100644
index 00000000000..0fbc862c3b2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/fis3prex.mp
@@ -0,0 +1,481 @@
+% fis3prex.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+def platecap( expr Xpos, Shade, Angle, Oray, Iray, NumPoints ) =
+ begingroup
+ path perim, op, ip;
+ numeric i;
+ color axey, axmz, tp;
+ axey = cosd( Angle )*green + sind( Angle )*blue;
+ axmz = -cosd( Angle )*blue + sind( Angle )*green;
+ tp = Xpos*red;
+ op = rp( tp+Oray*axey )
+ for i=1 upto NumPoints:
+ ..rp(tp+Oray*(cosd(i*180/NumPoints)*axey+sind(i*180/NumPoints)*axmz))
+ endfor;
+ ip = rp( tp+Iray*axey )
+ for i=1 upto NumPoints:
+ ..rp(tp+Iray*(cosd(i*180/NumPoints)*axey+sind(i*180/NumPoints)*axmz))
+ endfor;
+ perim = op--reverse ip--cycle;
+ fill perim withcolor Shade;
+ draw perim
+ endgroup
+enddef;
+
+beginfig(1);
+ f := ( 4, 1, 2 );
+ numeric i, j, xsiz, ysiz, gstep, angl, vlen, fact, xa, xb, yb;
+ color vdir, bpos, ap, bp, cp, dp;
+ path base;
+ xsiz = 2;
+ ysiz = 3;
+ gstep = 0.23;
+ angl = 33;
+ vlen = 0.45;
+ fact = 1.3;
+ vdir = vlen*( 0, cosd(angl), sind(angl) );
+ xa = 0.5*gstep;
+ xb = (xsiz+0.5)*gstep;
+ yb = (ysiz+0.5)*gstep;
+ ap = (-xa,-xa,0);
+ bp = (-xa,yb,0);
+ cp = (xb,yb,0);
+ dp = (xb,-xa,0);
+ for i=0 upto xsiz:
+ for j=0 upto ysiz:
+ bpos := gstep*(i,j,0);
+ draw rp(bpos-fact*vdir)--rp(bpos);
+ drawarrow rp(bpos-fact*vdir)--rp(bpos-vdir);
+ endfor;
+ endfor;
+ base = rp(ap)--rp(bp)--rp(cp)--rp(dp)--cycle;
+ fill base withcolor 0.7background;
+ draw base;
+ for i=0 upto xsiz:
+ for j=0 upto ysiz:
+ bpos := gstep*(i,j,0);
+ draw rp(bpos+fact*vdir)--rp(bpos);
+ drawarrow rp(bpos)--rp(bpos+vdir);
+ endfor;
+ endfor;
+ draw rp(black)--rp( (0,0,vlen) ) dashed evenly;
+ angline( fact*vdir, (0,0,vlen), black, 0.7*vlen, btex 57$^\circ$ etex, urt );
+ label.top( btex $\vec{B}$ etex, rp(vdir) );
+endfig;
+
+beginfig(2);
+ f := ( 4, 3, 2 );
+ numeric i, numplates, xdelta, iangle, ang, oray, iray, numpois;
+ numeric aang, imray, omray, mmray, axray, numouts;
+ color shade, shadea, shadeb, p[];
+ path fucir, outerarrow, theknob;
+ numplates = 11;
+ numouts = 2;
+ xdelta = 0.1;
+ iangle = 53;
+ oray = 0.5;
+ iray = 0.07;
+ imray = 0.52;
+ omray = 0.67;
+ mmray = 0.64;
+ axray = 0.04;
+ numpois = 10;
+ shadea = 0.8background;
+ shadeb = 0.6background;
+ fucir = rigorouscircle( (-(numplates-1)*xdelta,0,0), red, imray );
+ outerarrow = subpath (1.7,2.3) of fucir;
+ p1 = ( -(numplates-1)*xdelta, imray, 0 );
+ p2 = ( -(numplates-1)*xdelta, omray, 0 );
+ p3 = ( -(numplates-2)*xdelta, imray, 0 );
+ p4 = ( -(numplates-2)*xdelta, omray, 0 );
+ p5 = ( -(numplates-4)*xdelta, mmray, 0 );
+ p6 = ( -(numplates-2)*xdelta, mmray, 0 );
+ p7 = ( -(numplates+1)*xdelta, mmray, 0 );
+ p8 = ( -(numplates-1)*xdelta, mmray, 0 );
+ p9 = ( -xdelta, cosd( 0.5*iangle )*0.5*oray, sind( 0.5*iangle )*0.5*oray );
+ p0 = ( 0, cosd( 0.5*iangle )*0.5*oray, -sind( 0.5*iangle )*0.5*oray );
+ for i=1-numplates upto 0:
+ if odd(i):
+ shade := shadea;
+ ang := iangle;
+ else:
+ shade := shadeb;
+ ang := 0;
+ fi;
+ platecap( i*xdelta, shade, ang, oray, iray, numpois );
+ background := shadea;
+ rigorousdisc( 0, true, (i*xdelta,0,0), axray, xdelta*red );
+ background := shadeb;
+ rigorousdisc( 0, true, (i*xdelta,-oray,0), axray, xdelta*red );
+ background := background;
+ endfor;
+ for i=1 upto numouts:
+ background := shadea;
+ rigorousdisc( 0, true, (i*xdelta,0,0), axray, xdelta*red );
+% background := shadeb;
+% rigorousdisc( 0, true, (i*xdelta,-oray,0), axray, xdelta*red );
+ endfor;
+ theknob = rigorousfearpath( ((numouts+1)*xdelta,0,0), 2*axray );
+ fill theknob;
+ draw theknob;
+ background := background;
+ draw rp(p1)--rp(p2);
+ draw rp(p3)--rp(p4);
+ drawarrow rp(p5)--rp(p6);
+ drawarrow rp(p7)--rp(p8);
+ drawarrow outerarrow;
+ label.ulft( btex $d$ etex, rp(p7) );
+ label( btex $A$ etex, rp(p9) );
+ label( btex $A$ etex, rp(p0) );
+endfig;
+
+beginfig(3);
+ f := ( 3, 2, 1 );
+ numeric oray, iray;
+ path opath, ipath;
+ color lRpos, Rpos, Ppos, zpos, rpos, spos;
+ oray = 0.5;
+ iray = 0.2oray;
+ opath = rigorouscircle( black, blue, oray );
+ ipath = rigorouscircle( black, blue, 0.2oray );
+ fill opath withcolor 0.7background;
+ fill ipath withcolor background;
+ draw opath;
+ draw ipath;
+ lRpos = ( oray, 0, 0 );
+ Rpos = 0.5lRpos;
+ Ppos = ( 0, 0, 2oray );
+ zpos = 0.5Ppos;
+ rpos = ( 0, iray, 0 );
+ spos = -Rpos;
+ drawarrow rp(black)--rp(lRpos);
+ drawarrow rp(black)--rp(Ppos);
+ drawarrow rp(black)--rp(rpos);
+ dotlabel.lft( btex $P$ etex, rp(Ppos) );
+ label.rt( btex $z$ etex, rp(zpos) );
+ label.ulft( btex $R$ etex, rp(Rpos) );
+ label.lrt( btex $r$ etex, rp(rpos) );
+ label( btex $\sigma$ etex, rp(spos) );
+endfig;
+
+beginfig(4);
+ f := ( 3, 4, 2 );
+ numeric raya, rayb, rayc, lena, lenb;
+ color baseac, baseav, basebc, basebv, rayabbeg, rayabend, lambdapos;
+ raya = 0.017;
+ rayb = 0.1;
+ rayc = 0.2;
+ lena = 1.4;
+ lenb = 0.6;
+ baseac = 0.5*lena*red;
+ baseav = -lena*red;
+ basebc = 0.5*lenb*red;
+ basebv = -lenb*red;
+ rayabbeg = ( 0.5*lenb, raya, 0 );
+ rayabend = ( 0.5*lenb, rayc, 0 );
+ lambdapos = ( 0, rayc, 0 );
+ rigorousdisc( 0, true, basebc, rayc, basebv );
+ rigorousdisc( 0, true, baseac, raya, baseav );
+ rigorousdisc( 0, false, basebc, rayc, basebv );
+ drawarrow rp( rayabbeg )--rp( rayabend );
+ label.bot( btex $R$ etex, rp( 0.5[rayabbeg,rayabend] ) );
+ label( btex $\lambda_t$ etex, rp ( lambdapos ) );
+ label.lrt( btex $\lambda_f$ etex, rp( 0.3[baseac,basebc] ) );
+endfig;
+
+beginfig(5);
+ f := ( 5, 5, 3 );
+ numeric i, numpoints, ray, aux, blen, bang, fa, fb, fc, fd;
+ path wirea, wireb, wirec, wired, wirepath;
+ color wa[], wb[], btip, xpos;
+ pen bigpen, smallpen;
+ numpoints = 36;
+ ray = 0.5;
+ blen = 0.8;
+ fa = -1.1;
+ fb = -0.8;
+ fc = -fb;
+ fd = -fa;
+ bang = -45;
+ btip = blen*(0,cosd( bang ), sind( bang ) );
+ for i=1 upto numpoints:
+ aux := i*180/numpoints;
+ wa[i] = ray*(red*cosd(aux)+green*sind(aux));
+% drawarrow rp( wa[i] )--rp( wa[i]+btip );
+ wb[i] = ray*(-red*cosd(aux)-blue*sind(aux));
+% drawarrow rp( wb[i] )--rp( wb[i]+btip );
+ endfor;
+ wirepath = for i=1 upto numpoints:
+ rp( wa[i] )-- endfor for i=1 upto numpoints:
+ rp( wb[i] )-- endfor cycle;
+ bigpen = pencircle scaled 3pt;
+ smallpen = pencircle scaled 2.2pt;
+ draw wirepath withpen bigpen;
+ wirea = rp( wb[numpoints] ) for i=1 upto numpoints:
+ --rp( wa[i] ) endfor;
+ wireb = rp( wa[numpoints] ) for i=1 upto numpoints:
+ --rp( wb[i] ) endfor;
+ wirec = rp( wb[numpoints-1] )--wirea--rp( wb[1] );
+% wired = rp( wa[numpoints-1] )--wireb--rp( wa[1] );
+ draw wireb withpen smallpen withcolor background;
+% cartaxes( 2ray, 2ray, 1.2ray );
+ draw rp( 2*ray*red )--rp( -2*ray*red ) dashed evenly;
+ draw rp( black )--rp( -ray*blue );
+ draw rp( black )--rp( ray*green );
+ for i=-1 upto 1:
+ xpos := (i*ray,0,0);
+ drawarrow rp( xpos+fa*btip )--rp( xpos+fb*btip );
+ drawarrow rp( xpos+fb*btip )--rp( xpos+fc*btip );
+ draw rp( xpos+fc*btip )--rp( xpos+fd*btip );
+ endfor;
+ squareangline( -ray*blue, ray*green, black, 0.1*ray);
+ draw wirea withpen bigpen;
+ draw wirec withpen smallpen withcolor background;
+ label.urt( btex $\vec{B}$ etex, rp( btip ) );
+endfig;
+
+beginfig(6);
+ path baset, sphere;
+ color va, vb, vc, qpos;
+ va = (0,0,0);
+ vb = (0.5,0.5*sqrt(3),0);
+ vc = (-0.5,0.5*sqrt(3),0);
+ baset = rp( va )--rp( vb )--rp( vc )--cycle;
+ draw baset;
+ qpos = (0,0.333*sqrt(3),0.333*sqrt(1-0.333*sqrt(3)) );
+ sphere = rigorousfearpath( qpos, 0.1 );
+ fill sphere withcolor background;
+ draw sphere;
+ label( btex +$q$ etex, rp( qpos ) );
+endfig;
+
+beginfig(7);
+ Spread := 50;
+ f := (4,6,3.5);
+ path fiodecima, fioabaixo, malhacub, rama, ramb, ramc;
+ path malhatet, ramd, rame;
+ pen grossa, nuclear, negat;
+ color p[];
+ numeric altura, margem, largneg, largpos, afast, lengax, lscal;
+ pair topo, base, decima, abaixo, centerfont, centerneg, centerpos;
+ pair a, b, c, d, tx, ty, tz;
+ altura = 2cm;
+ margem = 3mm;
+ largneg = 9mm;
+ largpos = 18mm;
+ afast = 5cm;
+ lengax = 0.7;
+ lscal = 2;
+ grossa = pencircle scaled 2.7pt;
+ nuclear = pencircle scaled 2.1pt;
+ negat = pencircle scaled 1.8pt;
+ p1 = (1,1,-1);
+ p2 = (-1,1,-1);
+ p3 = (-1,-1,-1);
+ p4 = (1,-1,-1);
+ p5 = (1,1,1);
+ p6 = (-1,1,1);
+ p7 = (-1,-1,1);
+ p8 = (1,-1,1);
+ p0 = (0,0,1);
+ p9 = (0,0,-1);
+ z1 = rp(p1);
+ z2 = rp(p2);
+ z3 = rp(p3);
+ z4 = rp(p4);
+ z5 = rp(p5);
+ z6 = rp(p6);
+ z7 = rp(p7);
+ z8 = rp(p8);
+ z0 = rp(p0);
+ z9 = rp(p9);
+ tx = rp( p1 - (lengax,0,0) );
+ ty = rp( p1 - (0,lengax,0) );
+ tz = rp( p1 + (0,0,lengax) );
+ topo = (xpart z0, altura + ypart z0);
+ base = (xpart z9, -altura + ypart z9);
+ decima = (afast + xpart topo, ypart topo);
+ abaixo = (afast + xpart base, ypart base);
+ centerfont = 0.5*(decima+abaixo);
+ centerpos = (xpart centerfont, 0.5*margem + ypart centerfont);
+ centerneg = (xpart centerfont, -0.5*margem + ypart centerfont);
+ fiodecima = z0--topo--decima--centerpos;
+ fioabaixo = z9--base--abaixo--centerneg;
+ a = ( -0.5*largpos + xpart centerfont, ypart centerpos);
+ b = ( 0.5*largpos + xpart centerfont, ypart centerpos);
+ c = ( -0.5*largneg + xpart centerfont, ypart centerneg);
+ d = ( 0.5*largneg + xpart centerfont, ypart centerneg);
+ malhacub = z1--z2--z3--z4--z1--z5--z6--z7--z8--z5;
+ malhatet = z2--z7--z4--z5--cycle;
+ rama = z2--z6;
+ ramb = z3--z7;
+ ramc = z4--z8;
+ ramd = z5--z7;
+ rame = z2--z4;
+ drawoptions( dashed evenly );
+ draw malhacub;
+ draw rama;
+ draw ramb;
+ draw ramc;
+ drawoptions( withpen grossa );
+ draw malhatet;
+ draw ramd;
+ draw rame;
+% drawoptions( withpen nuclear withcolor background );
+% draw malhatet;
+% draw ramd;
+% draw rame;
+ drawoptions();
+ draw fiodecima;
+ draw fioabaixo;
+ draw a--b;
+ drawarrow z1--tx withpen negat;
+ drawarrow z1--ty withpen negat;
+ drawarrow z1--tz withpen negat;
+ label.lrt(btex $x$ etex scaled lscal, tx);
+ label.llft(btex $y$ etex scaled lscal, ty);
+ label.lft(btex $z$ etex scaled lscal, tz);
+ linecap := butt;
+ draw c--d withpen negat;
+endfig;
+
+beginfig(8);
+ Spread := 50;
+ f := (6,6,3.5);
+ numeric squareside, sray, cdiameter, cray, distmargin, linemargin, eloing;
+ squareside = 1;
+ cdiameter = squareside/0.88623;
+ cray = cdiameter/2.0;
+ sray = squareside/2.0;
+ distmargin = 0.5;
+ linemargin = 0.15;
+ eloing = 0.4;
+ pen pena, penb, penc;
+ pena = pencircle scaled 1.3mm;
+ penb = pencircle scaled 0.95mm;
+ penc = pencircle scaled 0.4mm;
+ color tracecol, outcol, incol;
+ tracecol = 0.5white;
+ outcol = black;
+ incol = 0.876white;
+ color va, vb, vc, vd, cen, bs, bc, fs, fc, ds, dc;
+ va = (0,-sray,-sray);
+ vb = (0,sray,-sray);
+ vc = (0,sray,sray);
+ vd = (0,-sray,sray);
+ cen = (-distmargin,0,0);
+ bs = (0,-sray-linemargin,0);
+ bc = bs+cen;
+ fs = (0,sray+eloing,0);
+ ds = (0,sray+eloing-linemargin,0);
+ fc = fs+cen;
+ dc = ds+cen;
+ path rigcirc, carrpath, square, circ, sline, cline, dline;
+ square = rp(va)--rp(vb)--rp(vc)--rp(vd)--cycle;
+ circ = goodcirclepath( cen, red, cray );
+ rigcirc = rigorouscircle( cen, red, cray+linemargin );
+ carrpath = subpath (1,2) of rigcirc;
+ sline = rp(bs)--rp(fs);
+ cline = rp(bc)--rp(fc);
+ dline = rp(ds)--rp(dc);
+
+ draw cline withpen penc withcolor tracecol;
+ draw circ withpen pena withcolor outcol;
+ draw circ withpen penb withcolor incol;
+ draw sline withpen penc withcolor tracecol;
+ draw square withpen pena withcolor outcol;
+ draw square withpen penb withcolor incol;
+ drawdblarrow dline withpen penc withcolor tracecol;
+
+ pair begsarr, endsarr;
+ begsarr = rp((0,-sray-linemargin,linemargin));
+ endsarr = rp((0,-sray-linemargin,sray));
+ drawarrow begsarr--endsarr withpen penc withcolor tracecol;
+ drawarrow carrpath withpen penc withcolor tracecol;
+
+ label.lft( btex $I$ etex, rp((0,-sray-linemargin,sray-linemargin)) );
+ label.top( btex $+$ etex, point 1.5 of rigcirc );
+ label.top( btex $d$ etex, rp(dc) );
+endfig;
+
+beginfig(9);
+ Spread := 50;
+ f := (6,6,3.5);
+ numeric squareside, sray, cdiameter, cray, distmargin, linemargin, eloing;
+ squareside = 1;
+ cdiameter = squareside/0.88623;
+ cray = cdiameter/2.0;
+ sray = squareside/2.0;
+ distmargin = 0.5;
+ linemargin = 0.15;
+ eloing = 0.4;
+ pen pena, penb, penc;
+ pena = pencircle scaled 1.3mm;
+ penb = pencircle scaled 0.95mm;
+ penc = pencircle scaled 0.4mm;
+ color tracecol, outcol, incol;
+ tracecol = 0.5white;
+ outcol = black;
+ incol = 0.876white;
+ color va, vb, vc, vd, cen, bs, bc, fs, fc, ds, dc, os, oc, ncc;
+ va = (0,-sray,-sray);
+ vb = (0,sray,-sray);
+ vc = (0,sray,sray);
+ vd = (0,-sray,sray);
+ cen = (-distmargin,0,0);
+ bs = (0,-sray-linemargin,0);
+ bc = bs+cen;
+ fs = (0,sray+eloing,0);
+ ds = (0,sray+eloing-linemargin,0);
+ fc = fs+cen;
+ dc = ds+cen;
+ os = (linemargin,sray,0);
+ oc = (-distmargin-cdiameter-linemargin,sray,0);
+ ncc = (-distmargin-cray,sray,0);
+ path rigcirc, carrpath, square, circ, sline, cline, dline, oline;
+ square = rp(va)--rp(vb)--rp(vc)--rp(vd)--cycle;
+ circ = goodcirclepath( ncc, green, cray );
+ rigcirc = rigorouscircle( ncc, green, cray+linemargin );
+ carrpath = subpath (3,4) of rigcirc;
+ sline = rp(bs)--rp(fs);
+ cline = rp(bc)--rp(fc);
+ dline = rp(ds)--rp(dc);
+ oline = rp(os)--rp(oc);
+
+ draw oline withpen penc withcolor tracecol;
+ draw cline withpen penc withcolor tracecol;
+ draw circ withpen pena withcolor outcol;
+ draw circ withpen penb withcolor incol;
+ draw sline withpen penc withcolor tracecol;
+ draw square withpen pena withcolor outcol;
+ draw square withpen penb withcolor incol;
+ drawdblarrow dline withpen penc withcolor tracecol;
+
+ pair begsarr, endsarr;
+ begsarr = rp((0,-sray-linemargin,linemargin));
+ endsarr = rp((0,-sray-linemargin,sray));
+ drawarrow begsarr--endsarr withpen penc withcolor tracecol;
+ drawarrow carrpath withpen penc withcolor tracecol;
+
+ label.lft( btex $I$ etex, rp((0,-sray-linemargin,sray-linemargin)) );
+ label.top( btex $+$ etex, point 3.5 of rigcirc );
+ label.bot( btex $d$ etex, rp(dc) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/geombasic.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/geombasic.mp
new file mode 100644
index 00000000000..168f1cc9fc5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/geombasic.mp
@@ -0,0 +1,82 @@
+% geombasic.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+% Kind of graph that physicists do a lot. Play with the angles
+% and h a little to see what happens. Change the point of view f.
+% Change the position of symbols using the last argument of angline.
+
+beginfig(1);
+
+ f := (3,5,2);
+
+ Spread := 155;
+
+ ShiftV := origin;
+
+ gamma := 30;
+ theta := 15;
+ phi := 40;
+ h := 1.2;
+
+ p := 0.75;
+ ppp := 0.8;
+
+ mythick := 0.9pt;
+
+ color c[], n[], H;
+ c0 := (0,0,0);
+ n0 := (cosd(gamma),0,sind(gamma));
+ n1 := (cosd(gamma+theta),0,sind(gamma+theta));
+ n2 := (cosd(gamma)*cosd(phi),cosd(gamma)*sind(phi),sind(gamma));
+ n3 := (cosd(gamma+theta)*cosd(phi),
+ cosd(gamma+theta)*sind(phi),sind(gamma+theta));
+ n4 := (cosd(phi),sind(phi),0);
+ H := h*(-sind(gamma),0,cosd(gamma));
+ c1 := (0,0,Z(p*n1));
+ c2 := (0,0,Z(p*n2));
+ c3 := (1,0,0);
+ c4 := (0,0,1);
+ c5 := (X(H),0,0);
+ pickup pencircle scaled 1.25pt;
+ drawarrow rp(c0)..rp(n0);
+ drawarrow rp(c0)..rp(n3);
+ drawarrow rp(c0)..rp(H);
+ label.urt(btex $\vec{n}_0$ etex,rp(n0));
+ label.urt(btex $\vec{n}$ etex,rp(n3));
+ label.lft(btex $\vec{H}$ etex,rp(H));
+ pickup pencircle scaled mythick;
+ cartaxes(1,1,1);
+% draw rp(c0)--rp(p*n1) dashed evenly scaled 2;
+% draw rp(c0)--rp(p*n2) dashed evenly scaled 2;
+ draw rp(c0)--rp(c5)--rp(H) dashed evenly scaled 1.5;
+% draw rp(c1)..rp(p*n1) dashed evenly scaled 2;
+ draw rp(c1)..rp(p*n3) dashed evenly scaled 1.5;
+% draw rp(c2)..rp(p*n0) dashed evenly scaled 2;
+% draw rp(c2)..rp(p*n2) dashed evenly scaled 2;
+ draw rp(c0)..rp(n4) dashed evenly scaled 1.5;
+ angline(c3,n0,c0,ppp,btex $\gamma$ etex,lft);
+% angline(n0,n1,c0,p,btex $\theta$ etex,rt);
+% angline(p*n0,p*n2,c2,X(p*n0),btex $\phi$ etex,lrt);
+% angline(p*n1,p*n3,c1,X(p*n1),btex $\phi$ etex,ulft);
+% angline(n2,n3,c0,p,btex $\theta $ etex,urt);
+ angline(c4,H,c0,ppp,btex $\gamma$ etex,top);
+ angline(n4,n3,c0,p,btex $\gamma+\theta$ etex,lft);
+ angline(n4,c3,c0,p,btex $\phi$ etex,llft);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/geomfiguei.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/geomfiguei.mp
new file mode 100644
index 00000000000..81abd780492
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/geomfiguei.mp
@@ -0,0 +1,71 @@
+% geomfiguei.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+
+ f := 3*(1.2,1.7,0.8);
+
+ Spread := 125;
+
+ color origr, nzero, nothr, ndxyl, vmagf, mfxzp, mfxyp, mfxxp;
+ numeric alphan, gamman, thetan, phiang, mfsize, axxc, ayyc, azzc;
+ numeric phiarmlen, alphafac;
+ axxc = 0.99;
+ ayyc = 0.87; % make this 1.28 when in twist-bend geometry
+ azzc = 0.82;
+ alphan = 170; % make this 90 to get the twist-bend geometry
+ gamman = 25;
+ thetan = 10;
+ phiang = 30;
+ mfsize = 1.25;
+ phiarmlen = 0.75;
+ alphafac = 1.4;
+ origr = (0,0,0);
+ nzero = (cosd(gamman),0,sind(gamman));
+ ndxyl = phiarmlen*(cosd(phiang),sind(phiang),0);
+ nothr = (cosd(phiang)*cosd(gamman+thetan),
+ sind(phiang)*cosd(gamman+thetan),sind(gamman+thetan));
+ vmagf = mfsize*(cosd(alphan)*sind(gamman),sind(alphan),
+ -cosd(alphan)*cosd(gamman));
+ mfxzp = (X(vmagf),0,Z(vmagf));
+ mfxyp = (X(vmagf),Y(vmagf),0);
+ mfxxp = (X(vmagf),0,0);
+ cartaxes( axxc, ayyc, azzc );
+ draw rp(origr)--rp(ndxyl) dashed evenly;
+ draw rp(origr)--rp(mfxzp)--rp(vmagf) dashed evenly;
+ draw rp(origr)--rp(mfxyp)--rp(vmagf) dashed evenly;
+ draw rp(origr)--rp(alphafac*mfxyp) dashed evenly;
+ draw rp(mfxzp)--rp(mfxxp)--rp(origr) dashed evenly;
+ draw rp(mfxyp)--rp(mfxxp) dashed evenly;
+ draw rp((0,0,Z(nothr)))--rp(nothr) dashed evenly;
+ angline(nzero,(1,0,0),origr,0.65,btex $\gamma$ etex,lft);
+ angline(ndxyl,(1,0,0),origr,0.5,btex $\phi$ etex,llft);
+ angline(ndxyl,nothr,origr,0.5,btex $\gamma+\theta$ etex,lft);
+ angline(vmagf,(0,0,1),origr,0.5,btex $\beta$ etex,top); % twist-bend
+ angline(mfxyp,(1,0,0),origr,0.8,btex $\alpha$ etex,bot);
+ pickup pencircle scaled 1.15pt;
+ drawarrow rp(origr)..rp(nzero);
+ drawarrow rp(origr)..rp(nothr);
+ drawarrow rp(origr)..rp(vmagf);
+ label.ulft(btex $\vec{n}_0$ etex,rp(nzero));
+ label.ulft(btex $\vec{n}$ etex,rp(nothr));
+ label.urt(btex $\vec{H}$ etex,rp(vmagf));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/geommine.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/geommine.mp
new file mode 100644
index 00000000000..939fc35ed94
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/geommine.mp
@@ -0,0 +1,104 @@
+% geommine.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\usepackage{bbold}
+\begin{document}
+etex
+
+beginfig(1);
+
+ beta := 15;
+ alpha := 40;
+ psi := 26;
+ theta := 32;
+ phi := -33;
+ h := 1.35;
+ v := 0.4;
+ xlen := 1.2;
+ ylen := 0.65;
+ phirad := 0.67;
+
+ f := (3,5,3);
+ Spread := 100;
+
+ color c[], n[], H, h[], Vel, xloc, yloc, vx, vy;
+ c0 := (0,0,0);
+ cartaxes(xlen,ylen,1.0);
+ n0 := (cosd(beta),0,sind(beta));
+ n3 := (0,sind(phi),0);
+ n2 := n0 + n3;
+ n5 := n3 + cosd(phi)*n0;
+ n4 := cosd(theta)*n5;
+ Fx:=sind(alpha)*cosd(beta)-cosd(alpha)*cosd(psi)*sind(beta);
+ Fy:=cosd(alpha)*sind(psi);
+ Fz:=sind(alpha)*sind(beta)+cosd(alpha)*cosd(psi)*cosd(beta);
+ nx:=cosd(theta)*cosd(phi)*cosd(beta)-sind(theta)*sind(beta);
+ ny:=cosd(theta)*sind(phi);
+ nz:=cosd(theta)*cosd(phi)*sind(beta)+sind(theta)*cosd(beta);
+ n1 := (nx,ny,nz);
+ xloc := xlen*n1;
+ yloc := ylen*(-greenpart n1,redpart n1,0);
+ H := h*(Fx,Fy,Fz);
+ Vel := v*(Fx,Fy,Fz);
+ vx := v*sind(phi)*n1;
+ vy := v*cosd(phi)*N(yloc);
+ h4 := h*sind(phi)*n1;
+ h5 := h*cosd(phi)*N(yloc);
+ h2 := (-h*sind(beta)*cosd(alpha)*cosd(psi),
+ 0,
+ h*cosd(beta)*cosd(alpha)*cosd(psi));
+ h3 := (0,h*cosd(alpha)*sind(psi),0);
+ h1 := h2 + h3;
+ draw rp(n0)--rp(n2)--rp(n3)--rp(c0);
+ draw rp(c0)--rp(n4)--rp(n1);
+ draw rp(n5)--rp(n4);
+ draw rp(c0)--rp(h2)--rp(h1)--rp(h3)--cycle;
+ draw rp(c0)--rp(h1)--rp(H);
+% draw rp(h4)--rp(H)--rp(h5);
+ label.llft(btex $\vec{n}_0$ etex,rp(n0));
+ label.urt(btex $\vec{n}$ etex,rp(n1));
+ label.llft(btex $\vec{H}$ etex,rp(H));
+% label.urt(btex $\vec{v}$ etex,rp(Vel));
+% label.bot(btex $\mathbb{x}$ etex,rp(xloc));
+% label.bot(btex $\mathbb{y}$ etex,rp(yloc));
+% label.lrt(btex $\vec{v}_\mathbb{x}$ etex,rp(vx));
+% label.urt(btex $\vec{v}_\mathbb{y}$ etex,rp(vy));
+% label.lft(btex $\vec{H}_\mathbb{x}$ etex,rp(h4));
+% label.urt(btex $\vec{H}_\mathbb{y}$ etex,rp(h5));
+% pickup pencircle scaled 1pt;
+ angline(n0,n5,c0,phirad,btex $\phi$ etex,lft);
+% angline((0,1,0),yloc,c0,phirad,btex $\phi$ etex,rt);
+ angline(h2,h1,c0,0.5,btex $\psi$ etex,urt);
+ angline(H,h1,c0,0.9,btex $\alpha$ etex,top);
+ angline(n5,n1,c0,0.6,btex $\theta$ etex,ulft);
+ angline((0,0,1),h2,c0,0.5,btex $\beta$ etex,top);
+ angline((1,0,0),n0,c0,0.6,btex $\beta$ etex,rt);
+% drawarrow rp(c0)..rp(xloc);
+% drawarrow rp(c0)..rp(yloc);
+ pickup pencircle scaled 1.3pt;
+ drawarrow rp(c0)..rp(n0);
+ drawarrow rp(c0)..rp(n1);
+ drawarrow rp(c0)..rp(H);
+% drawarrow rp(c0)..rp(Vel);
+% drawarrow rp(c0)..rp(vx);
+% drawarrow rp(c0)..rp(vy);
+% drawarrow rp(c0)..rp(h4);
+% drawarrow rp(c0)..rp(h5);
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/globe.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/globe.mp
new file mode 100644
index 00000000000..22d0cf2bee1
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/globe.mp
@@ -0,0 +1,32 @@
+% globe.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ color gammacnt;
+ numeric newradius, radius, aux, i, numc, foc, lc;
+ path conepath, latpath;
+ pen thickp;
+
+ f := (2,3,4);
+ viewcentr := 1.5*(1,1,1);
+ Spread := 200;
+ Shifts := 300;
+ radius = 1;
+ numc = 9;
+ thickp = pencircle scaled 1mm;
+
+ pickup thickp;
+ tropicalglobe( numc, black, radius, blue );
+ for i=1 upto numc: % longitudes
+ aux := (i-1)*180/numc;
+ gammacnt := (cosd(aux),sind(aux),0);
+ draw spatialhalfcircle(black,gammacnt,radius,true);
+ endfor;
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/halfcirclesfear.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/halfcirclesfear.mp
new file mode 100644
index 00000000000..7074987e166
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/halfcirclesfear.mp
@@ -0,0 +1,43 @@
+% halfcirclesfear
+% L. Nobre G.
+% 2001
+
+%input featpost3Dplus2D;
+
+% input la3Dmacros;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ color centre, axpin, axpon, axpun;
+ numeric size, radii;
+ f := (4,1.5,3.5);
+ size = 0.5;
+ radii = 1;
+ centre = (0,0,0);
+ axpin = (0,0,1);
+ axpon = (0,1,0);
+ axpun = (1,0,0);
+ cartaxes( 1.2,1.2,0.8 );
+ pickup pencircle scaled 2;
+ draw rigorouscircle( centre, axpin, radii ) withcolor red;
+ draw goodcirclepath( centre, axpin, radii );
+ draw spatialhalfcircle( centre, axpon, size, true );
+ draw spatialhalfcircle( centre, axpon, size, false ) dashed evenly;
+ draw spatialhalfcircle( centre, axpun, size, true );
+ draw spatialhalfcircle( centre, axpun, size, false ) dashed evenly;
+ draw rigorousfearpath( centre, size );
+endfig;
+
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/hexagonaltrimesh.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/hexagonaltrimesh.mp
new file mode 100644
index 00000000000..316ca97482e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/hexagonaltrimesh.mp
@@ -0,0 +1,25 @@
+% hexagonaltrimesh.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+def zsurface( expr xc, yc ) =
+ cosd(xc*57)*cosd(yc*57)+4*mexp(-(xc**2+yc**2)*6.4)
+enddef;
+
+f := 7*(4,1,5);
+Spread := 35;
+LightSource := 10*(4,-3,4);
+SubColor := 0.4background;
+
+beginfig(1);
+ numeric np, ssize;
+ path chair;
+ np = 40;
+ ssize = 15;
+
+ hexagonaltrimesh( true,np,ssize,zsurface);
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/hiddensurface.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/hiddensurface.mp
new file mode 100644
index 00000000000..b0d64e95612
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/hiddensurface.mp
@@ -0,0 +1,153 @@
+% hiddensurface.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+% The big nice trick to draw 3D hidden line surfaces
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+numeric toplevel;
+toplevel = 2.2;
+
+def zsurface( expr xc, yc ) =
+ begingroup
+ numeric zout;
+ zout = yc**4 -xc*yc*(1-yc**2);
+ if zout > toplevel:
+ zout := toplevel;
+ fi;
+ ( zout )
+ endgroup
+enddef;
+
+def zline( expr yc ) =
+ begingroup
+ numeric zout;
+ zout = 4*yc*yc*yc/(1-3*yc*yc); %% I don't get it...
+ if zout > 3:
+ zout := 3;
+ fi;
+ ( zout )
+ endgroup
+enddef;
+
+f := (6,1,2);
+Spread := 67;
+
+beginfig(1);
+ numeric i, j, nx, ny, lowx, higx, lowy, higy, refz;
+ numeric posx, posy, posz, facz, lowl, higl, pensize;
+ color gridx[], pos, begcont, endcont, begconf, endconf;
+ path facex, descontjump;
+ pensize = 3pt;
+ nx = 20;
+ ny = 50;
+ lowy = -2.5;
+ higy = 1;
+ lowx = 1.5;
+ higx = 3;
+ refz = -2.5;
+ facz = 5;
+ for i=0 upto nx:
+ for j=0 upto ny:
+ posx := lowx + i*( higx - lowx )/nx;
+ posy := lowy + j*( higy - lowy )/ny;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ gridx[j] := ( posx, posy, posz );
+ endfor;
+ pos := ( posx, -1, refz/facz );
+ facex := rp( pos )--rp( gridx0 );
+ for j=1 upto ny:
+ facex := facex--rp( gridx[j] );
+ endfor;
+ facex:=facex--rp((posx,1,refz/facz))--cycle;
+ unfill facex;
+ draw facex;
+ endfor;
+ lowl = -2.0;
+% higl = -0.7;
+ higl = -1.0;
+ for j=0 upto ny:
+ posy := lowl + j*( higl - lowl )/ny;
+ posx := zline( posy );
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ gridx[j] := ( posx, posy, posz );
+ endfor;
+ facex := rp( gridx0 );
+ for j=1 upto ny:
+ facex := facex--rp( gridx[j] );
+ endfor;
+ draw facex withcolor red; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ lowl := -1.4;
+ higl := -0.8;
+ for j=0 upto ny:
+ posy := lowl + j*( higl - lowl )/ny;
+ posx := -2*posy;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ gridx[j] := ( posx, posy, posz );
+ endfor;
+ facex := rp( gridx0 );
+ for j=1 upto ny:
+ facex := facex--rp( gridx[j] );
+ endfor;
+ draw facex withcolor green;
+ lowl := -1.0;
+ higl := 0.5;
+ for j=0 upto 1:
+ posy := lowl + j*( higl - lowl );
+ posx := 2;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ gridx[j] := ( posx, posy, posz );
+ endfor;
+% facex := rp( gridx0 );
+% for j=1 upto ny:
+% facex := facex--rp( gridx[j] );
+% endfor;
+% draw facex withcolor blue;
+ pickup pencircle scaled pensize;
+ draw rp(gridx0) withcolor red;
+ draw rp(gridx1) withcolor red;
+ posx := 2.83;
+ posy := -1.933;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ draw rp((posx,posy,posz)) withcolor blue;
+ posy := 0.517;
+ posy := bracket(lowy,posy,higy);
+ draw rp((posx,posy,posz)) withcolor blue;
+ begconf = (1.15,-1,refz/facz);
+ endconf = (1.15, 1,refz/facz);
+ begcont = ( 1,-1,1.15*toplevel/facz);
+ endcont = (-1,-1,1.15*toplevel/facz);
+ pickup pencircle scaled 0.5pensize;
+ drawarrow rp(begconf)--rp(endconf);
+ drawarrow rp(begcont)--rp(endcont);
+ label.ulft( btex $\Lambda$ etex, rp(0.5*(begcont+endcont)) );
+ label.bot( btex $\Upsilon$ etex, rp(0.5*(begconf+endconf)) );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/hiddensurfaces.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/hiddensurfaces.mp
new file mode 100644
index 00000000000..df698f038bf
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/hiddensurfaces.mp
@@ -0,0 +1,65 @@
+% hiddensurfaces.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+def zsurface( expr xc, yc ) =
+ begingroup
+ numeric zout;
+ zout = yc**4-xc*yc*(1-yc**2);
+ if zout > 1.5:
+ zout := 1.5;
+ fi;
+ ( zout )
+ endgroup
+enddef;
+
+f := (2.5,2,1.25);
+Spread := 127;
+
+beginfig(1);
+ numeric i, j, nx, ny, lowx, higx, lowy, higy, refz
+ posx, posy, posz, facz, counter;
+ color poi[][];
+ nx = 30;
+ ny = 30;
+ lowy = -2.5;
+ higy = 1;
+ lowx = 1.5;
+ higx = 3;
+ refz = 0;
+ facz = 5;
+ counter = 0;
+ for i=0 upto nx:
+ for j=0 upto ny:
+ posx := lowx + i*( higx - lowx )/nx;
+ posy := lowy + j*( higy - lowy )/ny;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz + refz;
+ poi[i][j] := ( posx, posy, posz );
+ endfor;
+ endfor;
+ for i=1 upto nx:
+ for j=1 upto ny:
+ counter := incr(counter);
+ npf[counter] := 3;
+ F[counter]p1 := poi[i-1][j-1];
+ F[counter]p2 := poi[i][j-1];
+ F[counter]p3 := poi[i][j];
+ counter := incr(counter);
+ npf[counter] := 3;
+ F[counter]p1 := poi[i-1][j-1];
+ F[counter]p2 := poi[i-1][j];
+ F[counter]p3 := poi[i][j];
+ endfor;
+ endfor;
+ NF := counter;
+ drawarrow rp((-1,-1,refz))--rp((1,-1,refz));
+ drawarrow rp((-1,-1,refz))--rp((-1,1,refz));
+ fill_faces( withcolor blue );
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/inductionbob.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/inductionbob.mp
new file mode 100644
index 00000000000..19b47c44105
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/inductionbob.mp
@@ -0,0 +1,116 @@
+% inductionbob.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+numeric altura;
+altura = 0.35;
+
+f := (4,6,1);
+Spread := 200;
+LightSource := f+blue;
+ShadowOn := false;
+
+def spirala( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, cblu, param[];
+ par1 = 4.5;
+ par2 = 0.3;
+ par3 = 0.2*par1;
+ param1 = par1*360*TheVal;
+ cred = -par2*sind( param1 );
+ cgre = ( TheVal - 1.0 )*par3;
+ cblu = par2*cosd( param1 );
+ ( (cred,cgre,cblu+altura) )
+ endgroup
+enddef;
+
+def spiralb( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, cblu, param[];
+ par1 = 4.0;
+ par2 = 0.3;
+ par3 = 0.2*par1;
+ param1 = par1*360*TheVal;
+ cred = par2*sind( param1 );
+ cgre = TheVal*par3;
+ cblu = -par2*cosd( param1 );
+ ( (cred,cgre,cblu+altura) )
+ endgroup
+enddef;
+
+def innerloop( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, cblu, param[];
+ par1 = 8;
+ par2 = 0.2;
+ param1 = par1+(360-2*par1)*TheVal;
+ cred = par2*cosd( param1 );
+ cgre = 0;
+ cblu = par2*sind( param1 );
+ ( (cred,cgre,cblu+altura) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric xouterdev, xinnerdev, scalecir, scalelab;
+ color startp, begp, endp, finisp, ap, bp, cp, dp, ep, fp, gp;
+ pair startz, begz, endz, finisz, az, bz, cz, dz, ez, fz, gz;
+ path innerpath, outerpath, primarcir, secondcir;
+ pen mypen;
+ scalecir = 3cm;
+ scalelab = 4;
+ xouterdev = 1.4;
+ xinnerdev = 1.0;
+ mypen = pencircle scaled 4pt;
+ startp = spirala( 0 );
+ finisp = spiralb( 1 );
+ begp = innerloop( 0 );
+ endp = innerloop( 1 );
+ ap = ( xouterdev, Y(startp), Z(startp) );
+ bp = ( xouterdev, Y(startp), Z(finisp) );
+ dp = ( xouterdev, Y(finisp), Z(finisp) );
+ cp = 0.5[bp,dp];
+ ep = ( xinnerdev, Y(begp), Z(begp) );
+ fp = ( xinnerdev, Y(endp), Z(endp) );
+ gp = 0.5[ep,fp];
+ startz = rp( startp );
+ finisz = rp( finisp );
+ begz = rp( begp );
+ endz = rp( endp );
+ az = rp( ap );
+ bz = rp( bp );
+ cz = rp( cp );
+ dz = rp( dp );
+ ez = rp( ep );
+ fz = rp( fp );
+ gz = rp( gp );
+ emptyline( false, 1, black, 0.7background, 700, 0.8, 2, spirala );
+ outerpath = startz--az--bz--dz--finisz;
+ primarcir = fullcircle scaled scalecir shifted cz;
+ emptyline( false, 0.8, black, 0.4*(red+background), 150, 0.8, 2, innerloop );
+ innerpath = begz--ez--fz--endz;
+ secondcir = fullcircle scaled scalecir shifted gz;
+ draw innerpath withpen mypen;
+ unfill secondcir;
+ draw secondcir withpen mypen;
+ label( btex $V_S$ etex scaled scalelab, gz);
+ emptyline( true, 1, black, 0.7background, 700, 0.8, 2, spiralb );
+ draw outerpath withpen mypen;
+ unfill primarcir;
+ draw primarcir withpen mypen;
+ label( btex $V_P$ etex scaled scalelab, cz );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/joinedemptylines.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/joinedemptylines.mp
new file mode 100644
index 00000000000..a4a629d8afb
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/joinedemptylines.mp
@@ -0,0 +1,47 @@
+% joinedemptylines.mp
+% L. Nobre G.
+% 2001
+
+%input featpost3Dplus2D;
+
+numeric altura;
+altura = 1;
+
+f := (2,3,1.8+altura);
+Spread := 125;
+LightSource := 0.7*(4,-1,4);
+ShadowOn := true;
+
+def helixone( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cblu, param;
+ par1 = 3*360;
+ par2 = 0.3;
+ par3 = 0.8;
+ param = par1*TheVal;
+ cred = par2*cosd( param );
+ cblu = par2*sind( param );
+ ( (cred,cblu,par3*(-1+TheVal)+altura) )
+ endgroup
+enddef;
+
+def helixtwo( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cblu, param;
+ par1 = 3*360;
+ par2 = 0.1;
+ par3 = 0.8/3;
+ param = par1*TheVal;
+ cred = par2*cosd( param );
+ cblu = par2*sind( param );
+ ( (cred+0.2,cblu,par3*TheVal+altura) )
+ endgroup
+enddef;
+
+beginfig(1);
+ emptyline( false, 0.91, black, 0.5background, 360, 0.88, 2, helixone );
+ emptyline( true, 0.91, black, 0.5background, 120, 0.88, 2, helixtwo );
+ drawarrow rp((0.5,0,altura))--rp((0.32,0,altura));
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/kindofcube.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/kindofcube.mp
new file mode 100644
index 00000000000..c2e6a99f5a9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/kindofcube.mp
@@ -0,0 +1,81 @@
+% kindofcube.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+Spread := 30;
+f := 5.4*(1.5,0.5,1);
+
+beginfig(1);
+ numeric gridstep, sidenumber, i, j, coord, aa, ab, ac;
+ color pa;
+ gridstep = 0.9;
+ sidenumber = 10;
+ coord = 0.5*sidenumber*gridstep;
+ for i=0 upto sidenumber:
+ for j=0 upto sidenumber:
+ pa := (-coord+j*gridstep,-coord+i*gridstep,0);
+ aa := uniformdeviate(360);
+ ab := uniformdeviate(180);
+ ac := uniformdeviate(90);
+ kindofcube( false, false, pa, aa, ab, ac, 0.4, 0.4, 0.9 );
+ endfor;
+ endfor;
+endfig;
+
+beginfig(2);
+ f := (4,1.0,0.5);
+ Spread := 120;
+ numeric lena, lenb, lenc, aa, ab, ac, angray, micr;
+ pair zeror;
+ color axa, axb, axc, returnedcorner, dummyc, auxx, auxy;
+ lena=0.3;
+ lenb=0.6;
+ lenc=0.9;
+ aa=130;
+ ab=20;
+ ac=70;
+ angray=0.7;
+ micr=0.01;
+ zeror=rp(black);
+ cartaxes(1,1,1);
+ axa = ( cosd(aa), sind(aa), 0 );
+ axb = axa*cosd(ab)+blue*sind(ab);
+ auxx= ( cosd(aa+90), sind(aa+90), 0);
+ auxy = ncrossprod( axb, auxx );
+ axc = auxx*cosd(ac)+auxy*sind(ac);
+ draw zeror--rp(axa);
+ draw zeror--rp(axb);
+ draw zeror--rp(-axa);
+ draw zeror--rp(axc);
+ draw zeror--rp(auxx);
+ label.rt( btex $a$ etex, rp(axa) );
+ label.rt( btex $b$ etex, rp(axb) );
+ label.lft( btex $c$ etex, rp(auxx) );
+ label.lft( btex $d$ etex, rp(axc) );
+ label.bot( btex $o$ etex, zeror );
+ angline( axa,red,black,angray,btex $\alpha_1$ etex,bot );
+ angline( axb,axa,black,angray,btex $\alpha_2$ etex,rt );
+ angline( axc,auxx,black,angray,btex $\alpha_3$ etex,lft );
+ squareangline( -axa,auxx,black,0.2);
+ kindofcube( true, true, black, aa, ab, ac, lena, lenb, lenc );
+ draw zeror--rp(blue) dashed evenly;
+ dotlabel.bot( btex $l_1$ etex, rp(lena*axb) );
+ dotlabel.rt( btex $l_2$ etex, rp(lenb*axc) );
+ dotlabel.top( btex $l_3$ etex, rp(lenc*ncrossprod(axb,axc) ) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/labelconstruct.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/labelconstruct.mp
new file mode 100644
index 00000000000..45213320942
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/labelconstruct.mp
@@ -0,0 +1,30 @@
+% labelconstruct.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+f := 1.1*(2,1,0.5);
+ParallelProj := true;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ kindofcube(false,true,(0,-0.5,0),90,0,0,1.2,0.1,0.4);
+ kindofcube(false,true,(0,0,0),0,0,0,0.5,0.1,0.8);
+ labelinspace(false,(0.45,0.1,0.65),(-0.4,0,0),(0,0,0.1),
+ btex \framebox{\textsc{Label}} etex);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/labelinspace.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/labelinspace.mp
new file mode 100644
index 00000000000..da51f50633f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/labelinspace.mp
@@ -0,0 +1,33 @@
+% labelinspace.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+f := (2,3,0.5);
+ParallelProj := true;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ cartaxes( 1, 1.3, 1 );
+ labelinspace( false, black, 0.8*blue, 0.7*red,
+ btex \framebox{$\frac{\sqrt{5}-1}{2}$} etex);
+ labelinspace( false, 0.8*blue, -0.8*blue, 0.6*green,
+ btex \framebox{$\phi$} etex);
+ labelinspace( true, 0.7*red, 0.6*green, -0.7*red,
+ btex \framebox{$\frac{1+\sqrt{5}}{2}$} etex);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/magneticflux.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/magneticflux.mp
new file mode 100644
index 00000000000..c5f62220794
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/magneticflux.mp
@@ -0,0 +1,105 @@
+% magneticflux.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,mathpazo}
+\begin{document}
+etex
+
+TDAtiplen := 0.1; % tdarrow
+TDAhalftipbase := 0.04; % Three-Dimensional
+TDAhalfthick := 0.02; % Arrow
+ForePen := pencircle scaled 10pt;
+BackPen := pencircle scaled 6pt;
+
+numeric ranga;
+ranga = 30+uniformdeviate(120);
+
+def ellip( expr TheVal ) =
+ ( (cosd(360*TheVal),sind(360*TheVal)/sind(ranga),0) )
+enddef;
+
+beginfig(2);
+ f := ( 4, 1, 2 );
+ Spread := 90;
+ pen blackpen, whitepen;
+ numeric majoraxe, i, j, gridstepn, gridstep, gridstart, halen, rang;
+ numeric ellfocus, totdist, marginl;
+ path espira, partes, covere;
+ color avec, midvec;
+ halen = 1;
+ marginl = 0.14;
+ rang = 45+30*floor(uniformdeviate(3.9));
+ show rang;
+ avec = (0,cosd(rang),sind(rang))*halen;
+ blackpen = pencircle scaled 5pt;
+ whitepen = pencircle scaled 3pt;
+ majoraxe = 1.2 + uniformdeviate(0.8);
+ ellfocus = majoraxe +-+ 1;
+ gridstepn= 15;
+ gridstep = 2*majoraxe/(gridstepn-1);
+ gridstart= 0.5*gridstepn*gridstep;
+ espira = ellipticpath( black, -red, -green*majoraxe );
+ draw espira withpen blackpen;
+ undraw espira withpen whitepen;
+ for j=-1 step gridstep until 1:
+ for i=-gridstart step gridstep until gridstart:
+ midvec := (j,i,0);
+ totdist := conorm(midvec-(0,-ellfocus,0))+conorm(midvec-(0,ellfocus,0));
+ if 2*majoraxe-marginl > totdist:
+ tdarrow( midvec, midvec+avec );
+% draw rp(midvec) withpen whitepen;
+ fi;
+ endfor;
+ endfor;
+ partes = subpath (10.3,25.6) of espira;
+ covere = subpath (10,26) of espira;
+ draw partes withpen blackpen;
+ undraw covere withpen whitepen;
+endfig;
+
+beginfig(1);
+ f := ( 4, 1.9, 1.22 );
+ Spread := 90;
+ numeric nodc, lsc;
+ nodc = 10;
+ lsc = 2.4;
+ closedline( true, 200, 0.5, 1.75 )( ellip );
+ numeric i, j, circlesize, polar, phi;
+ color currpos, ini, fin, avec;
+ string comm;
+ avec = (0,cosd(ranga),sind(ranga));
+ circlesize = 1.86/nodc;
+ for i=0.93 step -circlesize until 0.4*circlesize:
+ polar := floor(6.28318*i/circlesize);
+ for j=1 upto polar:
+ phi := 360*j/polar;
+ currpos := i*(cosd(phi),sind(phi)/sind(ranga),0);
+ comm:="tdarrow("
+ & cstr( currpos )
+ & ","
+ & cstr( currpos + avec )
+ & ");";
+ getready( comm, currpos );
+ endfor;
+ endfor;
+ doitnow;
+ pickup pencircle scaled 2pt;
+ drawarrow rp((0,1.07/sind(ranga),0))--rp((0,2.47,0));
+ drawarrow rp((1.07,0,0))--rp((1.67,0,0));
+ angline((0,2.37,0),(0,0.93/sind(ranga),0)+avec,(0,0.93/sind(ranga),0),
+ 0.3, btex $\alpha$ etex scaled lsc, urt);
+ label.bot( btex $x$ etex scaled lsc, rp((1.67,0,0)) );
+ label.bot( btex $y$ etex scaled lsc, rp((0,2.47,0)) );
+endfig;
+
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/nembiaxi.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/nembiaxi.mp
new file mode 100644
index 00000000000..99bfbc7b87b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/nembiaxi.mp
@@ -0,0 +1,64 @@
+% nembiaxi.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+
+
+beginfig(1);
+ f := 1.3*(4,5,3);
+ Spread := 70;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, counter;
+ color lenvec, currpos, xnoise, tmpcol;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Nb
+ cylength := 0.45;
+ cyradius := 0.1;
+ basen := 5;
+ hn := 3;
+ basestep := cylength*1.65;
+ hstep := cylength;
+ basesdev := basestep*0.1;
+ hsdev := hstep*0.1;
+ hbase := -0.8;
+ angsdev := 12;
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ hcurr := hbase;
+ forever:
+ exitunless hcurr < hmax+hbase;
+ hcurr := hcurr + hstep;
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := uniformdeviate( 10 )-5;
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ xnoise := ( sind( angsdev*normaldeviate ), 0, 0 );
+ xnoise := green + xnoise;
+ tmpcol := ncrossprod( ( vcx, vcy, vcz ), xnoise );
+ lenvec := cylength*tmpcol;
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ counter := incr( counter );
+ generateonebiax( counter, aone, atwo, cylength,
+ 90, 0.35*cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( false, 7, true );
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/nemsaddl.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/nemsaddl.mp
new file mode 100644
index 00000000000..ccc7d9852a1
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/nemsaddl.mp
@@ -0,0 +1,86 @@
+% nemsaddl.mp and nemsplay.mp and nemtwist.mp and nembends.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+
+
+beginfig(1);
+ f := 2*(5,3,4);
+ Spread := 70;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, angstep;
+ color lenvec, currpos;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% splay, sddle and twist
+ angstep := 10;
+ cylength := 0.6;
+ cyradius := 0.1;
+ basen := 3;
+ hn := 1;
+ basestep := cyradius*4.2;
+ hstep := cylength*1.4;
+ basesdev := cyradius*0.003;
+ hsdev := hstep*0.005;
+ hbase := -0.8;
+ angsdev := 3;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% bend
+% angstep := 15;
+% cylength := 0.6;
+% cyradius := 0.1;
+% basen := 3;
+% hn := 1;
+% basestep := cylength*1.6;
+% hstep := cyradius*3.4;
+% basesdev := basestep*0.01;
+% hsdev := hstep*0.005;
+% hbase := -0.8;
+% angsdev := 3;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ for i=-basen upto basen:
+ for j=-basen upto basen:
+ hcurr := hbase;
+ forever:
+ exitunless hcurr < hmax+hbase;
+ hcurr := hcurr + hstep;
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := angle((xcurr,ycurr))+angsdev*normaldeviate;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% atwo := ( i ++ j )*angstep + angsdev*normaldeviate;
+% vcz := cosd( atwo );
+% vcy := sind( atwo )*sind( aone ); % pure-splay
+% vcx := sind( atwo )*cosd( aone ); % pure-splay
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% atwo := ( i ++ j )*angstep + angsdev*normaldeviate;
+% vcz := cosd( atwo );
+% vcy := sind( atwo )*sind( aone ); % saddle-splay
+% vcx := -sind( atwo )*cosd( aone ); % saddle-splay
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ atwo := ( i ++ j )*angstep + angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone+90 );% pure-twist
+ vcx := sind( atwo )*cosd( aone+90 );% pure-twist
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% atwo := j *angstep + angsdev*normaldeviate;
+% vcz := sind( atwo );
+% vcy := cosd( atwo ); % pure-bend
+% vcx := 0; % pure-bend
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ endfor;
+ endfor;
+ endfor;
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/nsmetica.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/nsmetica.mp
new file mode 100644
index 00000000000..d13a33e1cc3
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/nsmetica.mp
@@ -0,0 +1,60 @@
+% nsmetica.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+
+
+beginfig(1);
+ f := 2*(5,3,2);
+ Spread := 70;
+ NF := 0;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, counter;
+ color lenvec, currpos;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sma
+ cylength := 0.45;
+ cyradius := 0.1;
+ basen := 11;
+ hn := 3;
+ basestep := cyradius*2.4;
+ hstep := cylength*2.1;
+ basesdev := cyradius*0.3;
+ hsdev := hstep*0.04;
+ hbase := -0.8;
+ angsdev := 7;
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ hcurr := hbase;
+ counter := 0;
+ for k=1 upto hn:
+ hcurr := hcurr + hstep;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := (i-1)*basestep + uniformdeviate( basestep );
+ ycurr := (j-1)*basestep + uniformdeviate( basestep );
+ aone := uniformdeviate( 360 );
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, 5, false );
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/parafuso.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/parafuso.mp
new file mode 100644
index 00000000000..74e8cda3e77
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/parafuso.mp
@@ -0,0 +1,100 @@
+% parafuso.mp
+% L. Nobre G.
+% 2005
+
+%input featpost3Dplus2D;
+
+def theline( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, cblu, param;
+ par0 = 0;
+ par1 = 6*360;
+ par2 = 0.3;
+ par3 = 850;
+ param = par0+TheVal*(par1-par0);
+ cred = -par2*cosd( param );
+ cblu = par2*sind( param );
+ cgre = param/par3;
+ ( (cred,cgre,cblu) )
+ endgroup
+enddef;
+
+def loxodrome( expr TheVal ) =
+ begingroup
+ numeric cred, cgre, cblu, alpha, theta, ratio, radio;
+ ratio = 22;
+ radio = 2;
+ theta = ratio*180*TheVal;
+ alpha = 170*TheVal-85;
+ cred = radio*cosd(theta)*cosd(alpha);
+ cgre = radio*sind(theta)*cosd(alpha);
+ cblu = radio*sind(alpha);
+ ( (cred,cgre,cblu) )
+ endgroup
+enddef;
+
+f := (2,4,1.8);
+Spread := 77;
+ShadowOn := false;
+
+beginfig(1);
+ numeric axsize, zaxpos, zaxlen;
+ color xbeg, xend, ybeg, yend, zbeg, zend;
+ axsize = 0.85;
+ zaxpos = 0.55;
+ zaxlen = 2.1;
+ pickup pencircle scaled 1.5pt;
+ xbeg = (axsize,0,0);
+ xend = (-axsize,0,0);
+ ybeg = (0,0,-axsize);
+ yend = (0,0,axsize);
+ zbeg = (zaxpos,-zaxpos,0);
+ zend = (zaxpos,zaxlen,0);
+ drawarrow rp( xbeg )--rp( xend );
+ drawarrow rp( ybeg )--rp( yend );
+% defaultfont := "putr8r";
+ defaultscale := 1.95;
+ label.rt( "A", rp( xend ) );
+ label.lft( "B", rp( yend ) );
+ emptyline( false, 1, black, 0.5background, 1000, 0.82, 2, theline );
+ drawarrow rp( zbeg )--rp( zend );
+ label.bot( "C", rp( zend ) );
+endfig;
+
+beginfig(2);
+ numeric axsize, zaxpos, zaxlen;
+ color xbeg, xend, ybeg, yend, zbeg, zend;
+ axsize = 0.85;
+ zaxpos = 0.55;
+ zaxlen = 2.1;
+ pickup pencircle scaled 1.5pt;
+ xbeg = (axsize,0,0);
+ xend = (-axsize,0,0);
+ ybeg = (0,0,-axsize);
+ yend = (0,0,axsize);
+ zbeg = (zaxpos,-zaxpos,0);
+ zend = (zaxpos,zaxlen,0);
+ drawarrow rp( xbeg )--rp( xend );
+ drawarrow rp( ybeg )--rp( yend );
+% defaultfont := "putr8r";
+ defaultscale := 0.65;
+ label.rt( "X", rp( xend ) );
+ label.lft( "Y", rp( yend ) );
+ closedline( false, 70, 0.5, 0.95, theline );
+ drawarrow rp( zbeg )--rp( zend );
+ label.bot( "Z", rp( zend ) );
+ doitnow;
+endfig;
+
+f := (2,4,2.8);
+beginfig(3);
+ NCL := 0;
+ Nobjects := 0;
+ closedline( false, 270, 0.5, 0.85, loxodrome );
+ doitnow;
+endfig;
+
+end;
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/pathofstraightline.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/pathofstraightline.mp
new file mode 100644
index 00000000000..06711c223f3
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/pathofstraightline.mp
@@ -0,0 +1,29 @@
+% pathofstraightline.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+SphericalDistortion := true;
+Spread := 100;
+f := 0.4*(1.5,0.5,1);
+
+beginfig(1);
+ numeric gridstep, sidenumber, i, coord;
+ color pa, pb, pc, pd;
+ gridstep = 0.1;
+ sidenumber = 10;
+ coord = 0.5*sidenumber*gridstep;
+ for i=0 upto sidenumber:
+ pa := (-coord,-coord+i*gridstep,0);
+ pb := (coord,-coord+i*gridstep,0);
+ pc := (-coord+i*gridstep,-coord,0);
+ pd := (-coord+i*gridstep,coord,0);
+ draw pathofstraightline( pa, pb );
+ draw pathofstraightline( pc, pd );
+ endfor;
+endfig;
+
+end.
+
+ \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/photoreverse.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/photoreverse.mp
new file mode 100644
index 00000000000..542fd1f3508
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/photoreverse.mp
@@ -0,0 +1,242 @@
+% photoreverse.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2003 Wolfgang Glunz <wglunz@pstoedit.net>
+
+% MetaPost source tuned by PstoeditMpostPreeditor (lex scanner)
+% and edited by L. Nobre G. <nobre@lince.cii.fc.ul.pt>
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+beginfig(1);
+ path PreeditedPath[];
+ linecap := butt;
+ linejoin := mitered;
+ PreeditedPath1 = hide(z1=(267.637,309.195))z1..controls hide(z2=(265.005,308.373))z2 and hide(z3=(262.069,307.351))z3..hide(z4=(261.056,306.906))z4
+ ..controls hide(z5=(260.051,306.463))z5 and hide(z6=(257.254,305.728))z6..hide(z7=(254.841,305.272))z7
+ ..controls hide(z8=(250.692,304.488))z8 and hide(z9=(204.457,292.788))z9..hide(z10=(182.447,286.951))z10
+ ..controls hide(z11=(176.816,285.458))z11 and hide(z12=(168.096,283.167))z12..hide(z13=(163.069,281.859))z13
+ ..controls hide(z14=(151.222,278.777))z14 and hide(z15=(141.515,276.205))z15..hide(z16=(134.184,274.205))z16
+ ..controls hide(z17=(130.967,273.328))z17 and hide(z18=(125.044,271.795))z18..hide(z19=(121.022,270.8))z19
+ ..controls hide(z20=(112.027,268.574))z20 and hide(z21=(85.2788,261.351))z21..hide(z22=(82.2654,260.334))z22
+ ..controls hide(z23=(81.0576,259.926))z23 and hide(z24=(74.8799,258.292))z24..hide(z25=(68.5181,256.697))z25
+ ..controls hide(z26=(53.8198,253.011))z26 and hide(z27=(54.844,253.994))z27..hide(z28=(56.676,245.334))z28
+ ..controls hide(z29=(57.3293,242.246))z29 and hide(z30=(56.3792,241.622))z30..hide(z31=(47.3118,239.178))z31
+ ..controls hide(z32=(35.9773,236.124))z32 and hide(z33=(35.1968,235.536))z33..hide(z34=(38.4636,232.521))z34
+ ..controls hide(z35=(40.325,230.802))z35 and hide(z36=(46.4053,219.375))z36..hide(z37=(48.1816,214.256))z37
+ ..controls hide(z38=(50.9392,206.31))z38 and hide(z39=(75.4822,148.371))z39..hide(z40=(81.2634,136.159))z40
+ ..controls hide(z41=(83.6174,131.186))z41 and hide(z42=(85.5562,126.827))z42..hide(z43=(85.5562,126.506))z43
+ ..controls hide(z44=(85.5562,124.811))z44 and hide(z45=(87.6768,124.222))z45..hide(z46=(90.6018,125.105))z46
+ ..controls hide(z47=(94.1848,126.187))z47 and hide(z48=(94.4399,127.076))z48..hide(z49=(91.2598,127.398))z49
+ ..controls hide(z50=(86.803,127.85))z50 and hide(z51=(81.7302,144.202))z51..hide(z52=(66.9248,205.847))z52
+ ..controls hide(z53=(57.2651,246.065))z53 and hide(z54=(57.3979,243.248))z54..hide(z55=(65.0811,244.906))z55
+ ..controls hide(z56=(67.3086,245.386))z56 and hide(z57=(71.2236,246.393))z57..hide(z58=(73.8562,247.162))z58
+ ..controls hide(z59=(76.4578,247.923))z59 and hide(z60=(81.7537,249.412))z60..hide(z61=(85.5562,250.453))z61
+ ..controls hide(z62=(89.3586,251.494))z62 and hide(z63=(93.6614,252.702))z63..hide(z64=(95.0623,253.122))z64
+ ..controls hide(z65=(96.4841,253.549))z65 and hide(z66=(99.0842,254.15))z66..hide(z67=(100.912,254.475))z67
+ ..controls hide(z68=(102.711,254.795))z68 and hide(z69=(106.689,255.777))z69..hide(z70=(109.687,256.642))z70
+ ..controls hide(z71=(115.705,258.378))z71 and hide(z72=(115.391,258.29))z72..hide(z73=(129.431,262.147))z73
+ ..controls hide(z74=(134.842,263.633))z74 and hide(z75=(139.964,265.139))z75..hide(z76=(140.765,265.48))z76
+ ..controls hide(z77=(141.57,265.822))z77 and hide(z78=(145.519,266.957))z78..hide(z79=(149.541,268.003))z79
+ ..controls hide(z80=(153.562,269.049))z80 and hide(z81=(158.005,270.236))z81..hide(z82=(159.412,270.641))z82
+ ..controls hide(z83=(164.668,272.153))z83 and hide(z84=(171.332,273.79))z84..hide(z85=(180.984,275.938))z85
+ ..controls hide(z86=(185.445,276.931))z86 and hide(z87=(190.982,278.282))z87..hide(z88=(193.416,278.972))z88
+ ..controls hide(z89=(195.835,279.657))z89 and hide(z90=(203.214,281.625))z90..hide(z91=(209.869,283.359))z91
+ ..controls hide(z92=(216.523,285.094))z92 and hide(z93=(224.23,287.209))z93..hide(z94=(227.053,288.076))z94
+ ..controls hide(z95=(229.905,288.952))z95 and hide(z96=(233.467,289.972))z96..hide(z97=(235.097,290.379))z97
+ ..controls hide(z98=(236.722,290.785))z98 and hide(z99=(239.484,291.549))z99..hide(z100=(241.312,292.098))z100
+ ..controls hide(z101=(243.136,292.645))z101 and hide(z102=(247.309,293.664))z102..hide(z103=(250.672,294.384))z103
+ ..controls hide(z104=(255.718,295.463))z104 and hide(z105=(258.712,296.887))z105..hide(z106=(255.937,296.887))z106
+ ..controls hide(z107=(255.547,296.887))z107 and hide(z108=(255.206,297.399))z108..hide(z109=(255.206,297.984))z109
+ ..controls hide(z110=(255.206,298.587))z110 and hide(z111=(255.864,299.081))z111..hide(z112=(256.669,299.081))z112
+ ..controls hide(z113=(257.546,299.081))z113 and hide(z114=(258.131,298.613))z114..hide(z115=(258.131,297.911))z115
+ ..controls hide(z116=(258.131,296.975))z116 and hide(z117=(258.643,296.837))z117..hide(z118=(260.69,297.219))z118
+ ..controls hide(z119=(265.886,298.191))z119 and hide(z120=(265.944,297.765))z120..hide(z121=(265.075,264.932))z121
+ ..controls hide(z122=(264.736,252.135))z122 and hide(z123=(264.811,245.7))z123..hide(z124=(265.297,245.7))z124
+ ..controls hide(z125=(266.883,245.7))z125 and hide(z126=(267.399,252.793))z126..hide(z127=(267.917,281.75))z127
+ ..controls hide(z128=(268.149,294.694))z128 and hide(z129=(268.149,294.694))z129..hide(z130=(265.364,299.227))z130
+ ..controls hide(z131=(262.174,304.419))z131 and hide(z132=(261.87,306.04))z132..hide(z133=(263.981,306.6))z133
+ ..controls hide(z134=(268.294,307.744))z134 and hide(z135=(275.854,303.103))z135..hide(z136=(280.281,296.595))z136
+ ..controls hide(z137=(283.962,291.184))z137 and hide(z138=(284.721,290.268))z138..hide(z139=(289.063,286.003))z139
+ ..controls hide(z140=(291.403,283.705))z140 and hide(z141=(292.5,282.033))z141..hide(z142=(292.5,280.763))z142
+ ..controls hide(z143=(292.5,279.62))z143 and hide(z144=(293.377,278.063))z144..hide(z145=(294.767,276.741))z145
+ ..controls hide(z146=(296.017,275.551))z146 and hide(z147=(298.525,272.208))z147..hide(z148=(300.361,269.283))z148
+ ..controls hide(z149=(302.197,266.358))z149 and hide(z150=(303.934,263.981))z150..hide(z151=(304.236,263.981))z151
+ ..controls hide(z152=(304.545,263.981))z152 and hide(z153=(305.201,262.957))z153..hide(z154=(305.736,261.641))z154
+ ..controls hide(z155=(306.263,260.343))z155 and hide(z156=(308.249,257.363))z156..hide(z157=(310.196,254.95))z157
+ ..controls hide(z158=(312.143,252.537))z158 and hide(z159=(313.706,250.225))z159..hide(z160=(313.706,249.758))z160
+ ..controls hide(z161=(313.706,249.294))z161 and hide(z162=(314.657,248))z162..hide(z163=(315.827,246.87))z163
+ ..controls hide(z164=(316.997,245.74))z164 and hide(z165=(318.128,243.888))z165..hide(z166=(318.35,242.738))z166
+ ..controls hide(z167=(318.613,241.372))z167 and hide(z168=(319.52,240.264))z168..hide(z169=(320.982,239.521))z169
+ ..controls hide(z170=(322.225,238.889))z170 and hide(z171=(323.698,237.449))z171..hide(z172=(324.309,236.267))z172
+ ..controls hide(z173=(324.914,235.097))z173 and hide(z174=(325.652,234.031))z174..hide(z175=(325.955,233.89))z175
+ ..controls hide(z176=(326.254,233.75))z176 and hide(z177=(327.334,231.989))z177..hide(z178=(328.331,230.015))z178
+ ..controls hide(z179=(329.365,227.967))z179 and hide(z180=(331.096,225.887))z180..hide(z181=(332.316,225.225))z181
+ ..controls hide(z182=(333.504,224.581))z182 and hide(z183=(335.098,222.921))z183..hide(z184=(335.863,221.532))z184
+ ..controls hide(z185=(336.635,220.13))z185 and hide(z186=(338.471,217.547))z186..hide(z187=(339.995,215.719))z187
+ ..controls hide(z188=(341.518,213.89))z188 and hide(z189=(343.403,211.128))z189..hide(z190=(344.236,209.503))z190
+ ..controls hide(z191=(345.069,207.878))z191 and hide(z192=(347.734,204.531))z192..hide(z193=(350.232,201.971))z193
+ ..controls hide(z194=(352.945,199.192))z194 and hide(z195=(354.903,196.494))z195..hide(z196=(355.168,195.17))z196
+ ..controls hide(z197=(355.411,193.957))z197 and hide(z198=(356.943,191.441))z198..hide(z199=(358.596,189.54))z199
+ ..controls hide(z200=(361.841,185.811))z200 and hide(z201=(364.128,182.683))z201..hide(z202=(365.551,180.034))z202
+ ..controls hide(z203=(366.846,177.621))z203 and hide(z204=(365.23,174.037))z204..hide(z205=(362.846,174.037))z205
+ ..controls hide(z206=(361.091,174.037))z206 and hide(z207=(358.527,172.096))z207..hide(z208=(359.273,171.332))z208
+ ..controls hide(z209=(359.507,171.093))z209 and hide(z210=(360.799,171.399))z210..hide(z211=(362.115,172.005))z211
+ ..controls hide(z212=(368.257,174.837))z212 and hide(z213=(375.377,173.789))z213..hide(z214=(371.109,170.681))z214
+ ..controls hide(z215=(370.133,169.97))z215 and hide(z216=(369.915,169.138))z216..hide(z217=(370.268,167.456))z217
+ ..controls hide(z218=(370.58,165.969))z218 and hide(z219=(370.316,164.385))z219..hide(z220=(369.501,162.849))z220
+ ..controls hide(z221=(368.801,161.533))z221 and hide(z222=(368.321,159.646))z222..hide(z223=(368.404,158.535))z223
+ ..controls hide(z224=(368.485,157.438))z224 and hide(z225=(368.095,156.301))z225..hide(z226=(367.526,155.976))z226
+ ..controls hide(z227=(366.853,155.591))z227 and hide(z228=(366.377,153.635))z228..hide(z229=(366.137,150.272))z229
+ ..controls hide(z230=(365.933,147.42))z230 and hide(z231=(365.431,143.858))z231..hide(z232=(365.003,142.228))z232
+ ..controls hide(z233=(364.584,140.633))z233 and hide(z234=(363.853,137.475))z234..hide(z235=(363.395,135.281))z235
+ ..controls hide(z236=(362.936,133.087))z236 and hide(z237=(362.088,130.162))z237..hide(z238=(361.53,128.846))z238
+ ..controls hide(z239=(360.967,127.519))z239 and hide(z240=(360.506,125.117))z240..hide(z241=(360.506,123.508))z241
+ ..controls hide(z242=(360.506,121.899))z242 and hide(z243=(360.111,119.859))z243..hide(z244=(359.629,118.974))z244
+ ..controls hide(z245=(359.15,118.097))z245 and hide(z246=(358.834,116.269))z246..hide(z247=(358.934,114.952))z247
+ ..controls hide(z248=(359.034,113.636))z248 and hide(z249=(358.602,111.825))z249..hide(z250=(357.983,110.967))z250
+ ..controls hide(z251=(357.35,110.088))z251 and hide(z252=(356.85,108.298))z252..hide(z253=(356.85,106.909))z253
+ ..controls hide(z254=(356.85,105.519))z254 and hide(z255=(356.382,103.567))z255..hide(z256=(355.79,102.485))z256
+ ..controls hide(z257=(355.209,101.424))z257 and hide(z258=(354.401,97.4023))z258..hide(z259=(354.005,93.5999))z259
+ ..controls hide(z260=(352.968,83.6548))z260 and hide(z261=(352.529,81.2454))z261..hide(z262=(351.429,79.4868))z262
+ ..controls hide(z263=(350.069,77.3098))z263 and hide(z264=(348.615,69.103))z264..hide(z265=(349.163,66.6899))z265
+ ..controls hide(z266=(349.581,64.8442))z266 and hide(z267=(349.391,64.6501))z267..hide(z268=(346.247,63.7119))z268
+ ..controls hide(z269=(341.811,62.3882))z269 and hide(z270=(340.625,63.3262))z270..hide(z271=(340.914,67.9331))z271
+ ..controls hide(z272=(341.263,73.5166))z272 and hide(z273=(339.121,72.5398))z273..hide(z274=(338.347,66.7629))z274
+ ..controls hide(z275=(337.642,61.498))z275 and hide(z276=(335.318,60.0554))z276..hide(z277=(334.459,64.3499))z277
+ ..controls hide(z278=(334.225,65.5198))z278 and hide(z279=(333.412,67.0278))z279..hide(z280=(332.646,67.7136))z280
+ ..controls hide(z281=(331.914,68.3679))z281 and hide(z282=(331.256,69.5457))z282..hide(z283=(331.256,70.2))z283
+ ..controls hide(z284=(331.256,70.8691))z284 and hide(z285=(330.353,72.7593))z285..hide(z286=(329.3,74.2949))z286
+ ..controls hide(z287=(325.789,79.4136))z287 and hide(z288=(320.082,90.9722))z288..hide(z289=(318.72,95.7205))z289
+ ..controls hide(z290=(317.42,100.254))z290 and hide(z291=(314.317,105.3))z291..hide(z292=(312.829,105.3))z292
+ ..controls hide(z293=(308.461,105.3))z293 and hide(z294=(294.694,129.504))z294..hide(z295=(294.694,137.182))z295
+ ..controls hide(z296=(294.694,141.643))z296 and hide(z297=(291.904,145.559))z297..hide(z298=(290.891,142.521))z298
+ ..controls hide(z299=(290.542,141.474))z299 and hide(z300=(287.381,143.252))z300..hide(z301=(287.381,144.495))z301
+ ..controls hide(z302=(287.381,144.918))z302 and hide(z303=(286.723,145.888))z303..hide(z304=(285.992,146.542))z304
+ ..controls hide(z305=(285.21,147.242))z305 and hide(z306=(284.219,148.809))z306..hide(z307=(283.725,150.125))z307
+ ..controls hide(z308=(283.246,151.402))z308 and hide(z309=(282.133,154.294))z309..hide(z310=(281.275,156.487))z310
+ ..controls hide(z311=(280.406,158.711))z311 and hide(z312=(278.15,162.52))z312..hide(z313=(276.229,165.006))z313
+ ..controls hide(z314=(274.309,167.493))z314 and hide(z315=(272.756,170.223))z315..hide(z316=(272.756,171.112))z316
+ ..controls hide(z317=(272.756,172))z317 and hide(z318=(271.953,173.672))z318..hide(z319=(270.965,174.842))z319
+ ..controls hide(z320=(269.404,176.689))z320 and hide(z321=(269.276,177.255))z321..hide(z322=(269.969,179.229))z322
+ ..controls hide(z323=(270.893,181.862))z323 and hide(z324=(269.866,185.685))z324..hide(z325=(267.573,188.15))z325
+ ..controls hide(z326=(266.139,189.692))z326 and hide(z327=(265.841,220.618))z327..hide(z328=(267.229,223.909))z328
+ ..controls hide(z329=(267.537,224.64))z329 and hide(z330=(267.426,225.664))z330..hide(z331=(266.979,226.212))z331
+ ..controls hide(z332=(266.536,226.755))z332 and hide(z333=(265.939,230.782))z333..hide(z334=(265.65,235.17))z334
+ ..controls hide(z335=(264.577,251.473))z335 and hide(z336=(263.579,226.029))z336..hide(z337=(264.07,194.878))z337
+ ..controls hide(z338=(264.101,192.884))z338 and hide(z339=(263.729,188.479))z339..hide(z340=(263.25,185.189))z340
+ ..controls hide(z341=(262.42,179.485))z341 and hide(z342=(262.452,179.086))z342..hide(z343=(263.835,177.876))z343
+ ..controls hide(z344=(264.65,177.164))z344 and hide(z345=(266.512,174.33))z345..hide(z346=(268.04,171.478))z346
+ ..controls hide(z347=(269.567,168.626))z347 and hide(z348=(271.381,165.501))z348..hide(z349=(272.135,164.421))z349
+ ..controls hide(z350=(272.9,163.324))z350 and hide(z351=(273.487,162.293))z351..hide(z352=(273.487,162.045))z352
+ ..controls hide(z353=(273.487,161.804))z353 and hide(z354=(275.511,158.242))z354..hide(z355=(277.976,154.147))z355
+ ..controls hide(z356=(282.728,146.25))z356 and hide(z357=(284.237,143.655))z357..hide(z358=(287.245,138.206))z358
+ ..controls hide(z359=(289.99,133.234))z359 and hide(z360=(299.06,117.685))z360..hide(z361=(301.023,114.587))z361
+ ..controls hide(z362=(301.95,113.124))z362 and hide(z363=(302.737,111.747))z363..hide(z364=(302.737,111.589))z364
+ ..controls hide(z365=(302.737,111.183))z365 and hide(z366=(314.213,91.2598))z366..hide(z367=(321.733,78.6091))z367
+ ..controls hide(z368=(325.081,72.9785))z368 and hide(z369=(329.837,64.9495))z369..hide(z370=(332.304,60.7668))z370
+ ..controls hide(z371=(338.083,50.968))z371 and hide(z372=(337.658,51.1626))z372..hide(z373=(346.101,54.4392))z373
+ ..controls hide(z374=(354.37,57.6489))z374 and hide(z375=(353.838,56.9644))z375..hide(z376=(355.457,66.4705))z376
+ ..controls hide(z377=(356.179,70.7117))z377 and hide(z378=(357.29,77.0364))z378..hide(z379=(357.91,80.4373))z379
+ ..controls hide(z380=(358.537,83.8743))z380 and hide(z381=(359.518,89.2683))z381..hide(z382=(360.104,92.5029))z382
+ ..controls hide(z383=(360.686,95.7136))z383 and hide(z384=(362.512,105.446))z384..hide(z385=(364.153,114.075))z385
+ ..controls hide(z386=(367.6,132.21))z386 and hide(z387=(370.829,149.516))z387..hide(z388=(373.021,161.606))z388
+ ..controls hide(z389=(373.857,166.213))z389 and hide(z390=(374.711,170.875))z390..hide(z391=(374.912,171.917))z391
+ ..controls hide(z392=(375.191,173.367))z392 and hide(z393=(374.51,174.842))z393..hide(z394=(372.046,178.132))z394
+ ..controls hide(z395=(364.981,187.565))z395 and hide(z396=(360.559,193.664))z396..hide(z397=(357.253,198.534))z397
+ ..controls hide(z398=(355.351,201.336))z398 and hide(z399=(351.495,206.797))z399..hide(z400=(348.733,210.6))z400
+ ..controls hide(z401=(345.967,214.408))z401 and hide(z402=(340.482,222.007))z402..hide(z403=(336.594,227.419))z403
+ ..controls hide(z404=(332.706,232.83))z404 and hide(z405=(327.32,240.264))z405..hide(z406=(324.675,243.872))z406
+ ..controls hide(z407=(321.994,247.528))z407 and hide(z408=(318.404,252.436))z408..hide(z409=(316.598,254.914))z409
+ ..controls hide(z410=(307.005,268.076))z410 and hide(z411=(302.032,274.894))z411..hide(z412=(295.05,284.456))z412
+ ..controls hide(z413=(290.779,290.306))z413 and hide(z414=(285.377,297.845))z414..hide(z415=(283.001,301.275))z415
+ ..controls hide(z416=(275.704,311.805))z416 and hide(z417=(275.811,311.75))z417..cycle;
+ PreeditedPath2 = hide(z418=(254.987,177.913))z418..controls hide(z419=(254.744,177.67))z419 and hide(z420=(253.305,177.229))z420..hide(z421=(251.769,176.926))z421
+ ..controls hide(z422=(250.239,176.624))z422 and hide(z423=(246.065,175.346))z423..hide(z424=(242.482,174.084))z424
+ ..controls hide(z425=(235.17,171.507))z425 and hide(z426=(231.263,171.562))z426..hide(z427=(228.296,174.285))z427
+ ..controls hide(z428=(226.59,175.85))z428 and hide(z429=(225.265,175.207))z429..hide(z430=(225.222,172.794))z430
+ ..controls hide(z431=(225.181,170.533))z431 and hide(z432=(221.496,168.977))z432..hide(z433=(216.377,169.058))z433
+ ..controls hide(z434=(212.647,169.117))z434 and hide(z435=(210.978,168.823))z435..hide(z436=(209.978,167.931))z436
+ ..controls hide(z437=(209.247,167.279))z437 and hide(z438=(208.138,166.725))z438..hide(z439=(207.565,166.725))z439
+ ..controls hide(z440=(206.982,166.725))z440 and hide(z441=(205.847,166.11))z441..hide(z442=(205.042,165.359))z442
+ ..controls hide(z443=(202.136,162.644))z443 and hide(z444=(198.973,161.521))z444..hide(z445=(194.147,161.49))z445
+ ..controls hide(z446=(190.929,161.469))z446 and hide(z447=(188.598,161.014))z447..hide(z448=(186.688,160.034))z448
+ ..controls hide(z449=(185.149,159.244))z449 and hide(z450=(181.789,157.939))z450..hide(z451=(179.156,157.109))z451
+ ..controls hide(z452=(176.524,156.279))z452 and hide(z453=(173.783,155.284))z453..hide(z454=(173.014,154.879))z454
+ ..controls hide(z455=(172.251,154.477))z455 and hide(z456=(169.942,153.653))z456..hide(z457=(167.895,153.051))z457
+ ..controls hide(z458=(165.847,152.448))z458 and hide(z459=(163.522,151.492))z459..hide(z460=(162.74,150.93))z460
+ ..controls hide(z461=(161.973,150.38))z461 and hide(z462=(160.18,149.906))z462..hide(z463=(158.864,149.906))z463
+ ..controls hide(z464=(157.548,149.906))z464 and hide(z465=(155.467,149.416))z465..hide(z466=(154.367,148.846))z466
+ ..controls hide(z467=(153.27,148.278))z467 and hide(z468=(152.149,147.955))z468..hide(z469=(151.954,148.151))z469
+ ..controls hide(z470=(151.753,148.351))z470 and hide(z471=(150.016,147.838))z471..hide(z472=(148.115,147.018))z472
+ ..controls hide(z473=(146.213,146.197))z473 and hide(z474=(143.748,145.515))z474..hide(z475=(142.667,145.51))z475
+ ..controls hide(z476=(128.554,145.452))z476 and hide(z477=(126.589,144.869))z477..hide(z478=(124.219,140.034))z478
+ ..controls hide(z479=(123.528,138.624))z479 and hide(z480=(122.192,137.646))z480..hide(z481=(119.925,136.89))z481
+ ..controls hide(z482=(118.097,136.281))z482 and hide(z483=(115.887,135.452))z483..hide(z484=(114.952,135.025))z484
+ ..controls hide(z485=(114.015,134.597))z485 and hide(z486=(112.283,134.322))z486..hide(z487=(111.04,134.404))z487
+ ..controls hide(z488=(109.836,134.483))z488 and hide(z489=(107.75,133.91))z489..hide(z490=(106.506,133.16))z490
+ ..controls hide(z491=(105.256,132.406))z491 and hide(z492=(103.033,131.403))z492..hide(z493=(101.644,130.967))z493
+ ..controls hide(z494=(100.254,130.53))z494 and hide(z495=(98.2485,129.46))z495..hide(z496=(97.2561,128.627))z496
+ ..controls hide(z497=(95.428,127.091))z497 and hide(z498=(95.428,127.091))z498..hide(z499=(98.426,127.436))z499
+ ..controls hide(z500=(101.129,127.747))z500 and hide(z501=(115.684,132.079))z501..hide(z502=(128.334,136.337))z502
+ ..controls hide(z503=(131.163,137.289))z503 and hide(z504=(139.669,139.925))z504..hide(z505=(147.347,142.228))z505
+ ..controls hide(z506=(155.025,144.531))z506 and hide(z507=(164.185,147.312))z507..hide(z508=(167.822,148.444))z508
+ ..controls hide(z509=(171.478,149.581))z509 and hide(z510=(176.841,151.206))z510..hide(z511=(179.887,152.1))z511
+ ..controls hide(z512=(182.911,152.987))z512 and hide(z513=(191.441,155.611))z513..hide(z514=(198.9,157.95))z514
+ ..controls hide(z515=(206.359,160.288))z515 and hide(z516=(215.873,163.225))z516..hide(z517=(220.106,164.495))z517
+ ..controls hide(z518=(224.347,165.767))z518 and hide(z519=(230.894,167.764))z519..hide(z520=(234.731,168.955))z520
+ ..controls hide(z521=(238.534,170.136))z521 and hide(z522=(244.657,171.975))z522..hide(z523=(248.259,173.019))z523
+ ..controls hide(z524=(255.864,175.222))z524 and hide(z525=(259.346,176.934))z525..hide(z526=(257.985,177.8))z526
+ ..controls hide(z527=(256.888,178.498))z527 and hide(z528=(255.62,178.546))z528..cycle;
+ dotlabels.rt(371,375,416,44,26);
+ draw PreeditedPath1 withcolor green;
+ draw PreeditedPath2 withcolor red;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FEATPOST specific %%
+ PhotoMarks := 5;
+ PhotoPair1 := z26; PhotoPoint1 := (7.0,-0.6,5.6);
+ PhotoPair2 := z44; PhotoPoint2 := (7.0,0,0);
+ PhotoPair3 := z371; PhotoPoint3:= (0,6.4,0);
+ PhotoPair4 := z375; PhotoPoint4:= (-0.6,6.4,0);
+ PhotoPair5 := z416; PhotoPoint5:= (-0.6,-0.6,5.6);
+ color pp[];
+ pp1 = (7.0,-0.6,7.0);
+ pp5 = (-0.6,-0.6,7.0);
+ pp2 = (8.4,0,0);
+ pp3 = (8.4,6.4,0);
+ path pt[];
+ f := (15,20,15); %%%%%%%%%%%%%%%%%%%%%%%
+ viewcentr := black; %%
+ Spread := 30; %% Parameters
+ ShiftV := (250,100); %%
+% SphericalDistortion := true; %%%%%%%%%%%%%%%%%%%%%%%
+
+ pt1 = rp(PhotoPoint1)--rp(pp1)--rp(pp5)--rp(PhotoPoint5);
+ pt2 = rp(PhotoPoint2)--rp(pp2)--rp(pp3)--rp(PhotoPoint3);
+ draw pt1 withpen pencircle scaled 3pt withcolor blue;
+ draw pt2 withpen pencircle scaled 3pt withcolor blue;
+
+ photoreverse(400,5.5,2.5); %% Changes parameters
+
+ pt3 = rp(PhotoPoint1)--rp(pp1)--rp(pp5)--rp(PhotoPoint5);
+ pt4 = rp(PhotoPoint2)--rp(pp2)--rp(pp3)--rp(PhotoPoint3);
+ draw pt3 withpen pencircle scaled 1pt;
+ draw pt4 withpen pencircle scaled 1pt;
+endfig;
+end
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/polyhedr.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/polyhedr.mp
new file mode 100644
index 00000000000..b0509b75f05
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/polyhedr.mp
@@ -0,0 +1,191 @@
+% polyhedr.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{newcent}
+\pagestyle{empty}
+\begin{document}
+etex
+
+% This exemplifies hidden line removal.
+
+f := (2,5,3);
+
+beginfig(1);
+ Print_Step := 1;
+ faceraytrace( 0.4, red );
+ lineraytrace( 0.4, black );
+% pickup pencircle scaled 2pt;
+% draw_all_test( false );
+% pickup pencircle scaled 1pt;
+% sharpraytrace;
+endfig;
+
+f := 2*(2,5,3.5);
+Print_step := 10;
+Spread := 156;
+LightSource := 2.5*(4,-3,17);
+
+beginfig(2);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Definition of the 3D-figure
+ V1 := (1.4,0,0);
+ V2 := (1,1,0);
+ V3 := (0,1.4,0);
+ V4 := (-1,1,0);
+ V5 := (-1.4,0,0);
+ V6 := (-1,-1,0);
+ V7 := (0, -1.4,0);
+ V8 := (1,-1,0);
+ V9 := (1.4,0,1);
+ V10:= (1,1,1);
+ V11:= (0,1.4,1);
+ V12:= (-1,1,1);
+ V13:= (-1.4,0,1);
+ V14:= (-1,-1,1);
+ V15:= (0,-1.4,1);
+ V16:= (1,-1,1);
+
+ V17:= (1.4,0,-1);
+ V18:= (1,1,-1);
+ V19:= (0,1.4,-1);
+ V20:= (-1,1,-1);
+ V21:= (-1.4,0,-1);
+ V22:= (-1,-1,-1);
+ V23:= (0,-1.4,-1);
+ V24:= (1,-1,-1);
+
+ V25:= (0.7,0,0);
+ V26:= (0,0.7,0);
+ V27:= (0.7,-0.7,0.7);
+ V28:= (0.7,0,0.7);
+ V29:= (0,0.7,0.7);
+ V30:= (-0.7,0.7,0.7);
+ V31:= (0.35,0.35,1.05);
+ V32:= (0,-0.7,1.4);
+ V34:= (0,0,1.4);
+ V33:= (-0.7,0,1.4);
+ NL := 1;
+ npl1 := 9;
+ L1p1 := V17;
+ L1p2 := V18;
+ L1p3 := V19;
+ L1p4 := V20;
+ L1p5 := V21;
+ L1p6 := V22;
+ L1p7 := V23;
+ L1p8 := V24;
+ L1p9 := V17;
+ NF := 8;
+ npf1 := 4;
+ F1p1 := V1;
+ F1p2 := V2;
+ F1p3 := V10;
+ F1p4 := V9;
+ npf2 := 4;
+ F2p1 := V2;
+ F2p2 := V3;
+ F2p3 := V11;
+ F2p4 := V10;
+ npf3 := 4;
+ F3p1 := V3;
+ F3p2 := V4;
+ F3p3 := V12;
+ F3p4 := V11;
+ npf4 := 4;
+ F4p1 := V4;
+ F4p2 := V5;
+ F4p3 := V13;
+ F4p4 := V12;
+ npf5 := 4;
+ F5p1 := V5;
+ F5p2 := V6;
+ F5p3 := V14;
+ F5p4 := V13;
+ npf6 := 4;
+ F6p1 := V6;
+ F6p2 := V7;
+ F6p3 := V15;
+ F6p4 := V14;
+ npf7 := 4;
+ F7p1 := V7;
+ F7p2 := V8;
+ F7p3 := V16;
+ F7p4 := V15;
+ npf8 := 4;
+ F8p1 := V8;
+ F8p2 := V1;
+ F8p3 := V9;
+ F8p4 := V16;
+ makeface9(25,26,29,31,28);
+ makeface10(25,27,28);
+ makeface11(26,29,30);
+ makeface12(27,28,31,34,32);
+ makeface13(31,29,30,33,34);
+ makeface14(32,33,34);
+ makeface15(25,26,30,33,32,27);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% draw_all_test(true);
+ ShadowOn := true;
+ fill_faces();
+ draw_invisible( true, true, TableC3, TableC0 );
+% lineraytrace(0.3, black);
+% faceraytrace(0.4, green); % This my take very long.
+% sharpraytrace;
+
+endfig;
+
+f := 2*(-2,-0.5,2.5);
+Spread := 56;
+LightSource := 1.5*(-4,5,2.7);
+
+beginfig(3);
+ numeric i, aux;
+ pair anglepar;
+ V1 := ( 0.7, 0, 0 );
+ V2 := ( 0, 0.7, 0 );
+ V3 := ( 0.7,-0.7, 0.7 );
+ V4 := ( 0.7, 0, 0.7 );
+ V5 := ( 0, 0.7, 0.7 );
+ V6 := (-0.7, 0.7, 0.7 );
+ V7 := ( 0.35,0.35,1.05);
+ V8 := ( 0, -0.7, 1.4 );
+ V9 := ( 0, 0, 1.4 );
+ V10:= (-0.7, 0, 1.4 );
+ anglepar = getanglepair( (1,1,1) );
+ for i=11 upto 20:
+ V[i]:=eulerrotation( -45, 0, 0, V[i-10] );
+ V[i]:=eulerrotation( 0, 90-ypart anglepar, 0, V[i] );
+ endfor;
+ aux = Z( V11 );
+ for i=25 upto 34:
+ V[i]:=( X(V[i-14]),Y(V[i-14]),1.35*(Z(V[i-14])-aux));
+ endfor;
+ makeface1(25,26,29,31,28);
+ makeface2(25,27,28);
+ makeface3(26,29,30);
+ makeface4(32,33,34);
+ makeface5(25,26,30,34,32,27);
+ makeface6(27,28,31,33,32);
+ makeface7(31,29,30,34,33);
+ for i=1 upto 7:
+ FC[i] := 4;
+ FCD[i]:= true;
+ endfor;
+ ShadowOn := true;
+ setthearena( 10, 5 );
+ fill_faces();
+ draw_invisible( false, false, TableC4, TableC0 );
+% for i=25 upto 34:
+% label.top( decimal(i), rp(V[i]) );
+% endfor;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/positivecharge.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/positivecharge.mp
new file mode 100644
index 00000000000..b0fccbc11a3
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/positivecharge.mp
@@ -0,0 +1,28 @@
+% positivecharge.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ numeric size, num, i, j, coos[];
+ string comm, bray;
+ color fro, tip;;
+ size = 1.5;
+ num = 70;
+ bray = "0.05";
+ draw rp(black)--rp((size,0,0))--rp((size,size,0))--rp((0,size,0))--cycle;
+ for i=1 upto num:
+ for j=1 upto 6:
+ coos[j] := uniformdeviate(size);
+ endfor;
+ fro := (coos1,coos2,coos3);
+ tip := (coos4,coos5,coos6);
+ comm := "positivecharge(true," & cstr(fro) & "," & bray & ");";
+ getready( comm, fro );
+ comm := "positivecharge(false," & cstr(tip) & "," & bray & ");";
+ getready( comm, tip );
+ endfor;
+ doitnow;
+endfig;
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/resistcircuit.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/resistcircuit.mp
new file mode 100644
index 00000000000..e0e679c97e1
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/resistcircuit.mp
@@ -0,0 +1,64 @@
+% resistcircuit.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ boolean kind[];
+ numeric largmolas, lengmolas, numolas, numturns, u, i, fraction, stepx;
+ numeric totalx, totaly, actuax, actuay, numparal, numserie, stepy;
+ path refpath;
+ pair refpoint, startpoint, ini, fin;
+ pickup pencircle scaled 2pt;
+ fraction = 0.6;
+ numolas = 9;
+ u = 2mm;
+ largmolas = 2u;
+ lengmolas = 12u;
+ numturns = 10;
+ actuax = 1;
+ actuay = 1;
+ numparal = 0;
+ numserie = 1;
+ stepy = largmolas/fraction;
+ stepx = 0.5*(1-fraction)*lengmolas;
+ draw (left*stepx)--origin;
+ for i=2 upto numolas:
+ if uniformdeviate(2) > 1:
+ kind[i] = false;
+ numserie := incr( numserie );
+ else:
+ kind[i] = true;
+ numparal := incr( numparal );
+ fi;
+ endfor;
+ totalx = numserie*lengmolas;
+ totaly = numparal*stepy;
+ draw (right*totalx)--(right*(totalx+stepx));
+ startpoint = (up*0.5*totaly);
+ refpoint = startpoint;
+ draw (down*0.5*totaly)--refpoint;
+ refpath = springpath(origin,right*lengmolas,numturns,largmolas,fraction);
+ draw refpath shifted refpoint;
+ refpoint := refpoint + right*lengmolas;
+ for i=2 upto numolas:
+ if kind[i]:
+ ini := startpoint+down*stepy*actuay;
+ fin := ini + 0.5*(actuax-1)*lengmolas*right;
+ draw ini--fin;
+ draw refpath shifted fin;
+ ini := fin + lengmolas*right;
+ fin := ini + 0.5*(actuax-1)*lengmolas*right;
+ draw ini--fin--refpoint;
+ refpoint := refpoint + down*stepy*0.5;
+ actuay := incr( actuay );
+ else:
+ draw refpath shifted refpoint;
+ refpoint := refpoint + right*lengmolas;
+ actuax := incr( actuax );
+ fi;
+ endfor;
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorouscircle.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorouscircle.mp
new file mode 100644
index 00000000000..a63ecb92e95
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorouscircle.mp
@@ -0,0 +1,49 @@
+% rigorouscircle.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+f := (2,0.2,0.1);
+
+
+beginfig(1);
+ numeric ind, cray, sray, cnum, ang, aux, auxs;
+ color sidevec, rayvec, angulmomv, vecaux;
+ path paux;
+ pen pendot;
+ pendot = pencircle scaled 2pt;
+ sray = 1;
+ cnum = 8;
+ ang = 45;
+ auxs = 0.15;
+ ray = 3*cosd(ang)*sray/cnum;
+ sidevec = ( sray*sind(ang), 0, 0 );
+ for ind=1 upto cnum:
+ aux := ind*360/cnum;
+% draw rigorouscircle( black, (0,sind(aux),cosd(aux)), sray ) dashed evenly;
+ rayvec := sray*cosd(ang)*(0,cosd(aux),sind(aux));
+
+ vecaux := rayvec+sidevec;
+ drawarrow rp(black)--rp(vecaux+auxs*N(vecaux));
+ paux := rigorouscircle( vecaux, vecaux, ray );
+ draw paux;
+ drawoptions( withpen pendot );
+ drawarrow (subpath (0,1) of paux);
+ draw rp(vecaux);
+ drawoptions();
+
+ vecaux := rayvec-sidevec;
+ drawarrow rp(black)--rp(vecaux+auxs*N(vecaux));
+ paux := rigorouscircle( vecaux, vecaux, ray );
+ draw paux;
+ drawoptions( withpen pendot );
+ drawarrow (subpath (0,1) of paux);
+ draw rp(vecaux);
+ drawoptions();
+ endfor;
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorouscone.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorouscone.mp
new file mode 100644
index 00000000000..3c79b95315b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorouscone.mp
@@ -0,0 +1,36 @@
+% rigorouscone.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ color nalfa, gammacnt, vertex;
+ path gamma, cone;
+ numeric altura, grids, radius, aux, i, numc, slope;
+
+ f := (5,4,2);
+ Spread := 60;
+ ShiftV := (200,200);
+ altura = 1;
+ radius = 0.3;
+ grids = 1;
+ numc = 9;
+ slope = 3;
+ nalfa = (0,0,1);
+
+ for i=1 upto numc:
+ aux := (i-0.5*(numc+1))*grids;
+ gammacnt := (0,aux,0);
+ vertex := (aux/slope,aux,altura);
+ gamma := rigorouscircle( gammacnt, nalfa, radius );
+ cone := rigorouscone(true, gammacnt, nalfa, radius, vertex );
+ unfill cone;
+ draw gamma dashed evenly;
+ draw cone;
+ endfor;
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousdiscSD.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousdiscSD.mp
new file mode 100644
index 00000000000..e9bfa7c2730
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousdiscSD.mp
@@ -0,0 +1,49 @@
+% rigorousdiscSD.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+f := 0.8*(6,3,4);
+
+SphericalDistortion := true;
+%%%%%Spread := 6;
+
+%SphericalDistortion := false;
+%%%%%%Spread := 20;
+
+beginfig(1);
+ color nalfa, gammacnt, vertex;
+ numeric altura, grids, radius, aux, auy, i, j, numc;
+
+ altura = 1;
+ radius = 0.5;
+ grids = 1.4;
+ numc = 7;
+
+ for i=1 upto numc:
+ aux := (i-0.5*(numc+1))*grids;
+ for j=1 upto numc:
+ auy := (j-0.5*(numc+1))*grids;
+ if normaldeviate > 0:
+ gammacnt := (aux,auy,0);
+ vertex := (aux,auy,altura);
+ else:
+ if normaldeviate > 0:
+ gammacnt := (aux-altura/2,auy,radius);
+ vertex := (aux+altura/2,auy,radius);
+ else:
+ gammacnt := (aux,auy-altura/2,radius);
+ vertex := (aux,auy+altura/2,radius);
+ fi;
+ fi;
+ nalfa := vertex - gammacnt;
+ rigorousdisc( 0, true, gammacnt, radius, nalfa );
+ endfor;
+ endfor;
+ produce_auto_scale;
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousdiscoptions.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousdiscoptions.mp
new file mode 100644
index 00000000000..59200177b7d
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousdiscoptions.mp
@@ -0,0 +1,31 @@
+% rigorousdiscoptions.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+f := 0.8*(6,3,4);
+
+beginfig(1);
+ color axe, cstep, colen;
+ numeric nstep, sfrac, ouray, inray;
+
+ nstep = 0.65;
+ sfrac = 0.1;
+ ouray = 0.7;
+ inray = 0.5;
+
+ axe = red;
+ cstep = ( nstep, 0, 0 );
+ colen = ( nstep*sfrac, 0, 0 );
+
+ pickup pencircle scaled 2pt;
+ rigorousdisc( 0, true, -cstep, ouray, colen );
+ rigorousdisc( 0, false, black, ouray, colen );
+ rigorousdisc( inray, true, cstep, ouray, colen );
+ rigorousdisc( inray, false, 2*cstep, ouray, colen );
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousfearpath.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousfearpath.mp
new file mode 100644
index 00000000000..c56ab28f61a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/rigorousfearpath.mp
@@ -0,0 +1,66 @@
+% rigorousfearpath.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ numeric sfr, radfac, ind;
+ color xv, yv, zv, Ve[];
+ path p[];
+ f := 2*(5,2,3);
+ Spread := 50;
+ csr := 0.47;
+ clr := 0.57;
+ xv := (csr,0,0);
+ yv := (0,csr,0);
+ zv := (0,0,csr);
+ Ve1 := (-1,-1,-1);
+ Ve2 := (-1,1,-1);
+ Ve3 := (1,-1,-1);
+ Ve4 := (1,1,-1);
+ Ve5 := (-1,-1,1);
+ Ve6 := (-1,1,1);
+ Ve7 := (1,-1,1);
+ Ve8 := (1,1,1);
+ Ve9 := (0,0,0);
+ for ind=1 upto 8:
+ p[ind] := rigorousfearpath( Ve[ind], csr );
+ endfor;
+ p9 := rigorousfearpath( Ve9, clr );
+ unfill p1;
+ draw p1;
+ draw rp(Ve1+yv)--rp(Ve2-yv);
+ draw rp(Ve1+xv)--rp(Ve3-xv);
+ unfill p2;
+ draw p2;
+ unfill p3;
+ draw p3;
+ draw rp(Ve4-yv)--rp(Ve3+yv);
+ draw rp(Ve4-xv)--rp(Ve2+xv);
+ unfill p4;
+ draw p4;
+ draw rp(Ve1+zv)--rp(Ve5-zv);
+ draw rp(Ve2+zv)--rp(Ve6-zv);
+ unfill p9;
+ draw p9;
+ draw rp(Ve3+zv)--rp(Ve7-zv);
+ draw rp(Ve4+zv)--rp(Ve8-zv);
+ unfill p5;
+ draw p5;
+ draw rp(Ve5+yv)--rp(Ve6-yv);
+ draw rp(Ve5+xv)--rp(Ve7-xv);
+ unfill p6;
+ draw p6;
+ unfill p7;
+ draw p7;
+ draw rp(Ve8-yv)--rp(Ve7+yv);
+ draw rp(Ve8-xv)--rp(Ve6+xv);
+ unfill p8;
+ draw p8;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/rotatnlc.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/rotatnlc.mp
new file mode 100644
index 00000000000..3adafc002cc
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/rotatnlc.mp
@@ -0,0 +1,49 @@
+% rotatnlc.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+
+ f := 2*(2,1,0.55);
+
+ Spread := 450;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, thetamin;
+ numeric thetamax, thetastp, long, radius, polar;
+ sizevec := (7,42,1); % (number of circles,
+ % number of vectors in outer circle,
+ % number of levels )
+ gridvec := (0.08,0.23,0.3);
+ thetamin := 90;
+ thetamax := 150;
+ long := 0.08;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -X(gridvec)*X(sizevec) ,
+ -X(gridvec)*X(sizevec) ,
+ 0 );
+ bordpos := starpos;
+ counter := 1;
+ for i=1 upto X(sizevec):
+ radius := (i-1)*X(gridvec);
+ polar := i*floor(Y(sizevec)/X(sizevec));
+ for j=1 upto polar:
+ for k=1 upto Z(sizevec):
+ phi := 360*(j-1)/polar;
+ theta := thetamin+(i-1)*thetastp;
+ currpos := radius*(cosd(phi-90),sind(phi-90),0)
+ +(k-1)*(0,0,Z(gridvec));
+ generatedirline( counter, phi, theta, long, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NL := decr(counter);
+ director_invisible( true, Y(gridvec), false );
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/saturn.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/saturn.mp
new file mode 100644
index 00000000000..44be273cc73
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/saturn.mp
@@ -0,0 +1,111 @@
+% saturn.mp
+% L. Nobre G.
+% 2005
+
+verbatimtex
+\documentclass{article}
+\usepackage{newcent}
+\pagestyle{empty}
+\begin{document}
+etex
+
+f := 2.5*(5,0,-1);
+Spread := 100;
+
+beginfig(1);
+ path planet, twilight, darkness, ringins, ringout, shadein, shadout;
+ path fullplanet, fullring, backdark, sunplanet, backring;
+ path nearringout, nearringins, hdtv, darkplanet;
+ numeric planetray, ringinsray, ringoutray, cutmargin, athmosray;
+ color sunposition, axedirection, labelpos, darknesstart, darknessend;
+ numeric inclinangle, labelray, begintime, endtime, colorfactor;
+ color planetcolor, ringcolor, toptextcolor, deepskycolor, bottextcolor;
+ picture storepicture;
+ planetray = 1;
+ ringinsray = 1.6;
+ ringoutray = 2.3;
+ labelray = 2.1;
+ cutmargin = 0.01;
+ inclinangle = 15;
+ sunposition = (-7,15,4);
+ colorfactor = 1.3;
+ bboxmargin := 6mm;
+ planetcolor = colorfactor*(255,152,55)/255;
+ ringcolor = colorfactor*(221,57,199)/255;
+ toptextcolor = colorfactor*(187,164,109)/255;
+ deepskycolor = colorfactor*(11,18,84)/255;
+ bottextcolor = colorfactor*(15,103,23)/255;
+ viewcentr := (0,0.5[planetray,ringinsray],0);
+ labelpos = (0,labelray,0);
+ athmosray = planetray+cutmargin;
+ axedirection = (0,-sind(inclinangle),cosd(inclinangle));
+ planet = rigorousfearpath( black, planetray );
+ twilight = spatialhalfcircle( black, sunposition, athmosray, true );
+ darknesstart = athmosray*ncrossprod( sunposition, axedirection );
+ darknessend = darknesstart - labelray*N( sunposition );
+ darkness = pathofstraightline( darknesstart, darknessend );
+ darknesstart := -darknesstart;
+ darknessend := darknesstart - labelray*N( sunposition );
+ backdark = pathofstraightline( darknesstart, darknessend );
+ ringins = goodcirclepath( black, axedirection, ringinsray );
+ ringout = goodcirclepath( black, axedirection, ringoutray );
+ endtime = xpart ( planet intersectiontimes twilight );
+ begintime = xpart ( reverse planet intersectiontimes twilight );
+ sunplanet = subpath (-begintime-cutmargin,endtime+cutmargin) of planet;
+ darkplanet = planet cutbefore twilight cutafter twilight;
+ fullplanet = buildcycle( sunplanet, reverse twilight );
+ fill fullplanet withcolor planetcolor;
+ endtime := xpart ( ringins intersectiontimes darkness );
+ begintime := xpart ( reverse ringins intersectiontimes sunplanet );
+ nearringins = subpath (-begintime-cutmargin,endtime+cutmargin) of ringins;
+ endtime := xpart ( ringout intersectiontimes darkness );
+ begintime := xpart ( reverse ringout intersectiontimes sunplanet );
+ nearringout = subpath (-begintime-cutmargin,endtime+cutmargin) of ringout;
+ backring = buildcycle( backdark, ringout, reverse darkplanet, reverse ringins );
+ fullring = buildcycle( nearringout, reverse darkness, reverse nearringins, sunplanet );
+ fill backring withcolor ringcolor;
+ fill fullring withcolor ringcolor;
+ picture thestatement;
+ thestatement = thelabel(
+ btex
+ \begin{tabular}{c}
+ \textbf{\textsf{{\Large T}$\!$ecnumbria}} \\
+ \textsf{\scriptsize a sombra da tecnologia}
+ \end{tabular}
+ etex,
+ origin);
+ pickup pencircle scaled 1pt;
+ draw thestatement scaled 2 shifted rp(labelpos) withcolor toptextcolor;
+ storepicture = currentpicture;
+ z1 = lrcorner currentpicture;
+ z2 = urcorner currentpicture;
+ z3 = ulcorner currentpicture;
+ z4 = llcorner currentpicture;
+ z5 = z1+down*bboxmargin;
+ z6 = z1+right*bboxmargin;
+ z7 = z2+right*bboxmargin;
+ z8 = z2+up*bboxmargin;
+ z9 = z3+up*bboxmargin;
+ z10= z3+left*bboxmargin;
+ z11= z4+left*bboxmargin;
+ z12= z4+down*bboxmargin;
+ z13= 0.5[z5,z12]+down*3*bboxmargin;
+ hdtv = z5..z6---z7..z8---z9..z10---z11..z12---cycle;
+ fill hdtv withcolor deepskycolor;
+ draw storepicture;
+ label(btex \texttt{\LARGE http://tecnumbria.com} etex, z13 );
+endfig;
+
+beginfig(2);
+ prologues := 1;
+ pickup pencircle scaled 5pt;
+ draw fullplanet;
+ unfill fullring;
+ draw fullring;
+ draw backring;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/sharpraytrace.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/sharpraytrace.mp
new file mode 100644
index 00000000000..120f272f5fe
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/sharpraytrace.mp
@@ -0,0 +1,102 @@
+% sharpraytrace.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input featpost3Dplus2D;
+
+f := (5,1.5,4.5);
+Spread := 60;
+PrintStep := 5;
+
+numeric phi;
+phi = 0.5*(1+sqrt(5));
+
+V1 := ( 1, phi,0);
+V2 := (-1, phi,0);
+V3 := (-1,-phi,0);
+V4 := ( 1,-phi,0);
+V5 := (0, 1, phi);
+V6 := (0,-1, phi);
+V7 := (0,-1,-phi);
+V8 := (0, 1,-phi);
+V9 := ( phi,0, 1);
+V10:= ( phi,0,-1);
+V11:= (-phi,0,-1);
+V12:= (-phi,0, 1);
+makeface1(1,2,3,4);
+makeface2(5,6,7,8);
+makeface3(9,10,11,12);
+
+beginfig(1);
+ pickup pencircle scaled 2pt;
+% numeric asize;
+% asize = 0.5*(phi+1);
+% cartaxes(asize,asize,asize);
+ sharpraytrace;
+endfig;
+
+Spread := 120;
+f:=3*(1,0.5,0.75);
+PrintStep := 0.15;
+
+numeric a, b, c, d, e;
+a = 0.1;
+b = 0.3;
+c = 1.1;
+d = 2.9;
+e = 0.5;
+
+V1 := ( a , b , c);
+V2 := ( a-1, b , 0);
+V3 := ( a-1-e, b-d,0);
+V4 := (-b , a , c);
+V5 := (-b , a-1, 0);
+V6 := (-b+d,a-1-e, 0);
+V7 := (-a , -b , c);
+V8 := (-a+1,-b , 0);
+V9 := (-a+1+e,-b+d,0);
+V10:= ( b , -a , c);
+V11:= ( b ,-a+1, 0);
+V12:= (b-d,-a+1+e, 0);
+makeface1(1,2,3);
+makeface2(4,5,6);
+makeface3(7,8,9);
+makeface4(10,11,12);
+
+beginfig(2);
+ pickup pencircle scaled 2pt;
+ sharpraytrace;
+endfig;
+
+Spread := 120;
+f:=(3,5,-0.6);
+PrintStep := 5;
+
+numeric a, b, c, d;
+a = 0.2;
+b = 0.3;
+c = 1.3;
+d = 1.4;
+
+V1 := ( b, 2.5*a, b);
+V2 := ( b,-2.5*a, b);
+V3 := (-c,-2.5*a,-3*b);
+V4 := (-c, 2.5*a,-3*b);
+V5 := (-b, 4*a, b);
+V6 := (-b,-4*a, b);
+V7 := ( c,-4*a,-3*b);
+V8 := ( c, 4*a,-3*b);
+V9 := ( d, 2*a,-b);
+V10:= ( d,-2*a,-b);
+V11:= (-d,-2*a,-b);
+V12:= (-d, 2*a,-b);
+makeface1(1,2,3,4);
+makeface2(5,6,7,8);
+makeface3(9,10,11,12);
+
+beginfig(3);
+ pickup pencircle scaled 2pt;
+ sharpraytrace;
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/simplecar.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/simplecar.mp
new file mode 100644
index 00000000000..48224c4fc11
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/simplecar.mp
@@ -0,0 +1,25 @@
+% simplecar.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+%f := 0.25*(2,2.15,15.3);
+f := (2,0.15,1.1);
+Spread := 320;
+HoriZon := -0.2;
+
+beginfig(1);
+ color refpos, angcol, lencol, froncol, rearcol;
+ refpos = black;
+ angcol = black;
+ lencol = (0.6, 0.35, 0.28);
+ froncol = (0.026, 0.12, 0.06);
+ rearcol = froncol;
+ setthearena( 12, 1.3 );
+ simplecar( refpos, angcol, lencol, froncol, rearcol );
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/simplecarparam.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/simplecarparam.mp
new file mode 100644
index 00000000000..c98c6bcdd87
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/simplecarparam.mp
@@ -0,0 +1,56 @@
+% simplecarparam.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+%f := 0.25*(2,2.15,15.3);
+f := (3.5,8,1.1);
+Spread := 160;
+
+beginfig(1);
+ color refpos, angcol, lencol, froncol, rearcol;
+ color a, b, c, d;
+ numeric lx, ly, lz, fx, fy, fz, hei;
+ lx = 0.8;
+ ly = 0.35;
+ lz = 0.18;
+ fx = 0.1;
+ fy = 0.2;
+ fz = 0.132;
+ hei = 0.05;
+ refpos = black;
+ angcol = black;
+ lencol = (lx, ly, lz);
+ froncol = (fx, fy, fz);
+ rearcol = froncol;
+ a = (0.5*lx,0.5*ly,-0.5*lz);
+ b = (0.5*lx-fx,0.5*ly,-0.5*lz);
+ c = (0.5*lx-fx,0.5*ly+fy,-0.5*lz);
+ d = (0.5*lx-fx-fz,0.5*ly+fy,-0.5*lz);
+ simplecar( refpos, angcol, lencol, froncol, rearcol );
+ drawdblarrow rp(a)--rp(b);
+ drawdblarrow rp(b)--rp(c);
+ drawdblarrow rp(c)--rp(d);
+ drawoptions( withcolor 0.87red );
+ labelinspace( true, 0.3[a,b], -red, hei*blue, btex X etex );
+ labelinspace( true, 0.3[b,c], green, hei*blue, btex Y etex );
+ labelinspace( true, 0.3[c,d], -red, hei*blue, btex Z etex );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/spatialhalfsfear.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/spatialhalfsfear.mp
new file mode 100644
index 00000000000..d80e3e3f5a6
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/spatialhalfsfear.mp
@@ -0,0 +1,15 @@
+% spatialhalfsfear.mp
+% L. Nobre G.
+% 2004
+
+f := (3,-0.2,3);
+beginfig(1);
+ spatialhalfsfear( black, blue, 1 );
+ drawoptions( withpen pencircle scaled 3pt withcolor (blue+green) );
+ spatialhalfsfear( black, blue+green, 0.8 );
+ drawoptions( withpen pencircle scaled 3pt withcolor red );
+ spatialhalfsfear( black, red, 0.6 );
+ drawoptions( withpen pencircle scaled 3pt withcolor green );
+ spatialhalfsfear( black, green, 0.7 );
+endfig;
+end. \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/spltwiben.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/spltwiben.mp
new file mode 100644
index 00000000000..5c85736f7bc
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/spltwiben.mp
@@ -0,0 +1,81 @@
+% spltwiben.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+def zsurface( expr xc, yc ) =
+ ((3*xc-5)*(3*xc+5)/(3*sqrt(3)*yc-5))
+enddef;
+
+f := (4,-5,3);
+Spread := 120;
+
+beginfig(1);
+ numeric i, j, nx, ny, lowx, higx, lowy, higy;
+ numeric posx, posy, posz, facz;
+ color gridx[], pos, reforig, endbeta, endpsip;
+ color endfiel, kdiv, krot, kben, akdiv, akrot, akben;
+ path facex;
+ facz = 7;
+ nx = 15;
+ ny = 50;
+ lowx = 0;
+ higx = 0.5*sqrt(3);
+ reforig = (0,-0.5,0);
+ endpsip = (0.3,-0.5,0);
+ endbeta = (0,-0.2,0);
+ endfiel = (0,-0.5,9/facz);
+ kdiv = (0,-0.5,8/facz);
+ krot = (0,-0.5,2/facz);
+ kben = (0,-0.5,5/facz);
+ akdiv = (higx,0.5,8/facz);
+ akrot = (higx,-0.5,2/facz);
+ akben = (0,0,5/facz);
+ draw rp((0,0,0))--rp((0,0,5/facz));
+ for i=1 upto nx:
+ posx := lowx + i*( higx - lowx )/nx;
+ lowy := -sqrt(3)*posx/3;
+ higy := -lowy;
+ for j=0 upto ny:
+ posy := lowy + j*( higy - lowy )/ny;
+ posz := zsurface( posx, posy )/facz;
+ gridx[j] := ( posx, posy, posz );
+ % show gridx[j];
+ endfor;
+ pos := ( posx, lowy, 0 );
+ facex := rp( pos )--rp( gridx0 );
+ for j=1 upto ny:
+ facex := facex--rp( gridx[j] );
+ endfor;
+ facex:=facex--rp((posx,higy,0))--cycle;
+ unfill facex;
+ draw facex;
+ endfor;
+ drawarrow rp(reforig)--rp(endpsip);
+ drawarrow rp(reforig)--rp(endbeta);
+ drawarrow rp(reforig)--rp(endfiel);
+ label.ulft(btex $\mathcal{X}$ etex, rp(endbeta) );
+ label.llft(btex $\mathcal{Z}$ etex, rp(endpsip) );
+ label.llft(btex $\mathcal{H}$ etex, rp(endfiel) );
+ dotlabel("",rp(reforig+(0,0,Z(gridx[ny]))));
+ dotlabel("",rp(reforig+(0,0,Z(gridx0))));
+ dotlabel("",rp(kben));
+ dotlabel.rt(btex $\mathcal{K}_1$ etex,rp(gridx[ny]));
+ dotlabel.lrt(btex $\mathcal{K}_2$ etex,rp(gridx0));
+ dotlabel.lft(btex $\mathcal{K}_3$ etex,rp(akben));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/stageforthree.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/stageforthree.mp
new file mode 100644
index 00000000000..f0d81f26e60
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/stageforthree.mp
@@ -0,0 +1,115 @@
+% stageforthree.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+Spread := 35;
+f := (13,7,3.5);
+
+beginfig(1);
+ numeric i, len, wang, reflen, frac, coordg;
+ numeric fws, NumLines, inray, outay;
+ path conepath, cira, cirb, ella, ellb, tuba, tubb, tubc;
+ color axe, aroc, cubevertex, conecenter, conevertex;
+ color allellaxe, ellaaxe, ellbaxe, pca, pea, pcb, peb;
+ frac := 0.5;
+ len := 0.6;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ reflen := 0.2*fws;
+ outay := 0.45*fws;
+ inray := 0.7*outay;
+ coordg := frac*fws;
+ NumLines := 30;
+ HoriZon := -0.5*fws;
+ setthestage( 0.5*NumLines, 2*fws );
+ cubevertex = (0.12*fws,-0.5*fws,-0.5*fws);
+ kindofcube(false,true,cubevertex,180,0,0,0.65*fws,0.2*fws,fws);
+ aroc := outay*(0,cosd(wang),sind(wang))-0.5*(0,fws,fws);
+ rigorousdisc( inray, true, aroc, outay, axe*len );
+ allellaxe := reflen*( 0.707, 0.707, 0 );
+ ellaaxe := reflen*( 0.707, -0.707, 1.0 );
+ ellbaxe := reflen*( -0.707, 0.707, 1.0 );
+ conecenter = ( coordg, coordg, -0.5*fws );
+ pca := ( coordg, -coordg, -0.5*fws );
+ pcb := ( -coordg, coordg, -0.5*fws );
+ pea := ( coordg, -coordg, 0.9*fws );
+ peb := ( -coordg, coordg, 0.9*fws );
+ cira := goodcirclepath( pca, blue, reflen );
+ cirb := goodcirclepath( pcb, blue, reflen );
+ ella := ellipticpath( pea, allellaxe, ellaaxe );
+ ellb := ellipticpath( peb, allellaxe, ellbaxe );
+ tuba := twocyclestogether( cira, ella );
+ tubb := twocyclestogether( cirb, ellb );
+ tubc := twocyclestogether( ella, ellb );
+ unfill tubb; draw tubb;
+ unfill tubc; draw tubc;
+ unfill tuba; draw tuba;
+ conevertex = conecenter + ( -3.5*reflen, 0, 0.8*fws );
+ verygoodcone(false,conecenter,blue,reflen,conevertex);
+endfig;
+
+Spread := 23;
+f := (6,13,3);
+ShadowOn := true;
+
+beginfig(2);
+ numeric reflen, frac, coordg;
+ numeric fws, NumLines;
+ path ella, ellb;
+ color axe, cubevertex;
+ color allellaxe, ellaaxe, pca, pcb;
+ frac := 0.5;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ reflen := 0.35*fws;
+ coordg := frac*fws;
+ NumLines := 52;
+ HoriZon := -0.5*fws;
+ setthestage( 0.5*NumLines, 3.6*fws );
+ cubevertex = (0.3*fws,-0.5*fws,-0.5*fws);
+ kindofcube(false,true,cubevertex,180,0,0,0.6*fws,0.2*fws,fws);
+ allellaxe := reflen*( 0.707, 0.707, 0 );
+ ellaaxe := reflen*( 0.5, -0.5, 0 );
+ pca := ( coordg, coordg, -0.5*fws );
+ pcb := ( -coordg, coordg, -0.5*fws );
+
+ whatisthis( pca, 0.5*ellaaxe, allellaxe, reflen, 0.3 );
+ whatisthis( pcb, ellaaxe*sqrt(2), allellaxe/sqrt(2), 2*reflen, 0.6 );
+
+endfig;
+
+Spread := 23;
+f := (13,6,4.5);
+ShadowOn := true;
+LightSource := 10*(4,-3,6);
+beginfig(3);
+ numeric reflen, frac, coordg;
+ numeric fws, NumLines;
+ path ella, ellb;
+ color axe, cubevertex, conecenter, conevertex;
+ color allellaxe, ellaaxe, pca, pcb;
+ frac := 0.5;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ reflen := 0.35*fws;
+ coordg := frac*fws;
+ NumLines := 45;
+ HoriZon := -0.5*fws;
+ setthestage( 0.5*NumLines, 3.3*fws );
+ cubevertex = (0.3*fws,-0.5*fws,0);
+ tropicalglobe( 7, cubevertex, 0.5*fws, axe );
+ allellaxe := reflen*( 0.707, 0.707, 0 );
+ ellaaxe := reflen*( 0.5, -0.5, 0 );
+ pcb := ( -coordg, coordg, 0 );
+ rigorousdisc( 0, true, pcb, 0.5*fws, -ellaaxe );
+ conecenter = ( coordg, coordg, -0.5*fws );
+ conevertex = conecenter + ( 0, 0, 0.9*fws );
+ verygoodcone(false,conecenter,blue,reflen,conevertex);
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/tangencypoint.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/tangencypoint.mp
new file mode 100644
index 00000000000..7c6d8f79601
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/tangencypoint.mp
@@ -0,0 +1,38 @@
+% tangencypoint.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ numeric u, i;
+ u = 5mm;
+ pen a, b, c;
+ a = pencircle scaled 3pt;
+ b = pencircle scaled 5pt;
+ c = pencircle scaled 1pt;
+ z1 = (1u,1u);
+ z2 = (4u,4u);
+ z3 = (4u,5u);
+ z4 = (3u,5u);
+ z5 = (3u,6u);
+ z6 = (4u,7u);
+ z7 = (6u,1u);
+ path cp;
+ cp = z1{up}..z2..z3..z4..z5..{up}z6;
+ draw cp withpen c;
+ for i=1 upto 6:
+ draw z[i] withpen a withcolor 0.5*(red+green);
+ endfor;
+ z8 = firsttangencypoint( cp, z7, 5 );
+ draw z7 withpen b withcolor green;
+ draw z7--z8 withpen c withcolor blue;
+endfig;
+
+end.
+
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/tdarrow.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/tdarrow.mp
new file mode 100644
index 00000000000..5ef43d52524
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/tdarrow.mp
@@ -0,0 +1,26 @@
+% tdarrow.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ numeric size, num, i, j, coos[];
+ string comm;
+ color tmpc, fro, tip;;
+ size = 1.5;
+ num = 250;
+ draw rp(black)--rp((size,0,0))--rp((size,size,0))--rp((0,size,0))--cycle;
+ for i=1 upto num:
+ for j=1 upto 6:
+ coos[j] := uniformdeviate(size);
+ endfor;
+ fro := (coos1,coos2,coos3);
+ tip := (coos4,coos5,coos6);
+ comm := "tdarrow(" & cstr(fro) & "," & cstr(tip) & ");";
+ tmpc := 0.5[fro,tip];
+ getready( comm, tmpc );
+ endfor;
+ doitnow;
+endfig;
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/thearchicon.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/thearchicon.mp
new file mode 100644
index 00000000000..3c9acb10391
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/thearchicon.mp
@@ -0,0 +1,59 @@
+% thearchicon.mp
+% L. Nobre G.
+% 2002
+
+%input featpost3Dplus2D;
+
+f := 0.8*(6,3,4);
+
+beginfig(1);
+ color tracecol, lockcol;
+ numeric altura, compri, radius, altfrac, comfrac, radang;
+ path theside, thefront, thelocka, thelockb, thelock;
+ color poi[];
+ numeric numpl, aux, i;
+ altura = 1;
+ compri = 2;
+ radius = 0.8;
+ altfrac = 0.2;
+ comfrac = 0.15;
+ radang = 37;
+ numpl = 9;
+ tracecol = blue;
+ lockcol = black;
+ currentpen := pencircle scaled 3mm;
+ drawoptions( withcolor tracecol );
+ rigorousdisc( 0, true, (-0.5compri,0,0), radius, (compri,0,0) );
+ poi1 = (0.5compri,-radius,0);
+ poi2 = (0.5compri,radius,0);
+ poi3 = (-0.5compri,radius,0);
+ poi4 = (0.5compri,-radius,-altura);
+ poi5 = (0.5compri,radius,-altura);
+ poi6 = (-0.5compri,radius,-altura);
+ theside = rp(poi1)--rp(poi2)--rp(poi5)--rp(poi4)--cycle;
+ thefront= rp(poi2)--rp(poi3)--rp(poi6)--rp(poi5)--cycle;
+ drawoptions( withcolor background );
+ fill theside;
+ fill thefront;
+ thelocka = rp((comfrac*compri,radius,-altfrac*altura))
+ --rp((comfrac*compri,radius,0));
+ thelockb = rp((-comfrac*compri,radius,-altfrac*altura))
+ --rp((-comfrac*compri,radius,0));
+ for i=1 upto numpl:
+ aux := i*radang/numpl;
+ poi7 := (comfrac*compri,radius*cosd(aux),radius*sind(aux));
+ poi8 := (-comfrac*compri,radius*cosd(aux),radius*sind(aux));
+ thelocka := thelocka...rp(poi7);
+ thelockb := thelockb...rp(poi8);
+ endfor;
+ thelock = thelocka--reverse thelockb--cycle;
+ drawoptions( withcolor lockcol );
+ filldraw thelock;
+ drawoptions( withcolor tracecol );
+ draw theside;
+ draw thefront;
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/thethreekindsofperspec.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/thethreekindsofperspec.mp
new file mode 100644
index 00000000000..3d9ffe9e0d1
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/thethreekindsofperspec.mp
@@ -0,0 +1,195 @@
+% thethreekindsofperspec.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+f := (4,2,2.5);
+Spread := 45;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+color psdf, psdu, psdv, rll, rlr, rur, rul, pll, plr, pur, pul;
+color pc;
+numeric projecplanesize, sizefraction, positfraction, aspectratio, rectsize;
+pen realpen, lightpen, projpen, dotpen;
+path projecplanepath, realpath;
+psdf = 3.1*(0,1,0.37);
+projecplanesize = 1.7;
+sizefraction = 0.19;
+positfraction = 0.65;
+aspectratio = 1.0;
+rectsize = 0.15;
+realpen = pencircle scaled 2.6pt;
+lightpen = pencircle scaled 0.55pt;
+projpen = pencircle scaled 1.8pt;
+dotpen = pencircle scaled 3.8pt;
+psdv = N( (-Y(psdf), X(psdf), 0) );
+psdu = ncrossprod( psdf, psdv );
+pll = projecplanesize*(-aspectratio*psdv-psdu);
+plr = projecplanesize*(+aspectratio*psdv-psdu);
+pur = projecplanesize*(+aspectratio*psdv+psdu);
+pul = projecplanesize*(-aspectratio*psdv+psdu);
+projecplanepath = rp(pll)--rp(plr)--rp(pur)--rp(pul)--cycle;
+pc = positfraction*psdf;
+rll = pc+sizefraction*projecplanesize*(-psdv-psdu);
+rlr = pc+sizefraction*projecplanesize*(+psdv-psdu);
+rur = pc+sizefraction*projecplanesize*(+psdv+psdu);
+rul = pc+sizefraction*projecplanesize*(-psdv+psdu);
+realpath = rp(rll)--rp(rlr)--rp(rur)--rp(rul)--cycle;
+
+beginfig(1);
+ draw projecplanepath withpen realpen;
+ draw realpath withpen realpen;
+ draw rp(psdf) withpen lightpen;
+ drawoptions( withpen lightpen );
+ squareangline( psdf, psdv, black, rectsize );
+ squareangline( psdf, psdu, black, rectsize );
+ drawoptions();
+ pair prll, prlr, prur, prul;
+ prll = rp(rll-pc);
+ prlr = rp(rlr-pc);
+ prur = rp(rur-pc);
+ prul = rp(rul-pc);
+ path projpath;
+ projpath = prll--prlr--prur--prul--cycle;
+ draw projpath withpen projpen;
+ draw prll--rp(rll+(1-positfraction)*psdf) withpen lightpen;
+ draw prlr--rp(rlr+(1-positfraction)*psdf) withpen lightpen;
+ draw prur--rp(rur+(1-positfraction)*psdf) withpen lightpen;
+ draw prul--rp(rul+(1-positfraction)*psdf) withpen lightpen;
+ draw rp(black)--rp(psdf) withpen lightpen;
+ draw rp(black) withpen dotpen;
+ draw rp(psdf) withpen dotpen;
+ label.rt( btex f etex, rp(psdf) );
+% label.bot( btex viewcentr etex, rp(black) );
+endfig;
+
+beginfig(2);
+ draw projecplanepath withpen realpen;
+ draw realpath withpen realpen;
+ draw rp(psdf) withpen lightpen;
+ drawoptions( withpen lightpen );
+ squareangline( psdf, psdv, black, rectsize );
+ squareangline( psdf, psdu, black, rectsize );
+ drawoptions();
+ pair prll, prlr, prur, prul;
+ LightSource:=psdf;
+ prll = rp(projectpoint(black,rll));
+ prlr = rp(projectpoint(black,rlr));
+ prur = rp(projectpoint(black,rur));
+ prul = rp(projectpoint(black,rul));
+ path projpath;
+ projpath = prll--prlr--prur--prul--cycle;
+ draw projpath withpen projpen;
+ draw prll--rp(psdf) withpen lightpen;
+ draw prlr--rp(psdf) withpen lightpen;
+ draw prur--rp(psdf) withpen lightpen;
+ draw prul--rp(psdf) withpen lightpen;
+ draw rp(black)--rp(psdf) withpen lightpen;
+ draw rp(black) withpen dotpen;
+ draw rp(psdf) withpen dotpen;
+ label.rt( btex f etex, rp(psdf) );
+ label.bot( btex viewcentr etex, rp(black) );
+endfig;
+
+beginfig(3);
+ draw projecplanepath withpen realpen;
+ draw realpath withpen realpen;
+ draw rp(psdf) withpen lightpen;
+ drawoptions( withpen lightpen );
+ squareangline( psdf, psdv, black, rectsize );
+ squareangline( psdf, psdu, black, rectsize );
+ numeric dist;
+ dist = conorm( psdf );
+ color ml, mt, mr, mb;
+ mb = 0.5[rll,rlr];
+ ml = 0.5[rll,rul];
+ mr = 0.5[rur,rlr];
+ mt = 0.5[rur,rul];
+ drawoptions( withpen projpen );
+ angline( rll, mb, psdf, dist, "", top );
+ angline( rll, ml, psdf, dist, "", top );
+ angline( rur, mt, psdf, dist, "", top );
+ angline( rur, mr, psdf, dist, "", top );
+ angline( mb, rlr, psdf, dist, "", top );
+ angline( ml, rul, psdf, dist, "", top );
+ angline( mr, rlr, psdf, dist, "", top );
+ angline( mt, rul, psdf, dist, "", top );
+ angline( black, mb, psdf, dist, "", top );
+ angline( black, ml, psdf, dist, "", top );
+ angline( black, mr, psdf, dist, "", top );
+ angline( black, mt, psdf, dist, "", top );
+ drawoptions();
+ numeric marc, darc, dmarc, ddarc;
+ marc = 0.01745*getangle(-psdf,mt-psdf)*dist;
+ darc = 0.01745*getangle(-psdf,rll-psdf)*dist*0.707;
+ color pro[], esf[], proc[], esfc[];
+ pro1 = darc*(-psdv-psdu);
+ pro2 = marc*(-psdu);
+ pro3 = darc*(+psdv-psdu);
+ pro4 = marc*(+psdv);
+ pro5 = darc*(+psdv+psdu);
+ pro6 = marc*(+psdu);
+ pro7 = darc*(-psdv+psdu);
+ pro8 = marc*(-psdv);
+ esf1 = psdf+dist*N(rll-psdf);
+ esf2 = psdf+dist*N(mb-psdf);
+ esf3 = psdf+dist*N(rlr-psdf);
+ esf4 = psdf+dist*N(mr-psdf);
+ esf5 = psdf+dist*N(rur-psdf);
+ esf6 = psdf+dist*N(mt-psdf);
+ esf7 = psdf+dist*N(rul-psdf);
+ esf8 = psdf+dist*N(ml-psdf);
+ ddarc = conorm(pro1-esf1)/3;
+ dmarc = conorm(pro2-esf2)/3;
+ proc1 = pro1+ddarc*N(psdf);
+ proc2 = pro2+dmarc*N(psdf);
+ proc3 = pro3+ddarc*N(psdf);
+ proc4 = pro4+dmarc*N(psdf);
+ proc5 = pro5+ddarc*N(psdf);
+ proc6 = pro6+dmarc*N(psdf);
+ proc7 = pro7+ddarc*N(psdf);
+ proc8 = pro8+dmarc*N(psdf);
+ esfc1 = esf1+ddarc*N(rll-psdf);
+ esfc2 = esf2+dmarc*N(mb-psdf);
+ esfc3 = esf3+ddarc*N(rlr-psdf);
+ esfc4 = esf4+dmarc*N(mr-psdf);
+ esfc5 = esf5+ddarc*N(rur-psdf);
+ esfc6 = esf6+dmarc*N(mt-psdf);
+ esfc7 = esf7+ddarc*N(rul-psdf);
+ esfc8 = esf8+dmarc*N(ml-psdf);
+ numeric i;
+ drawoptions( withpen lightpen );
+ for i=1 upto 8:
+ draw rp(esf[i])..controls rp(esfc[i]) and rp(proc[i])..rp(pro[i]);
+ draw rp(psdf)--rp(esf[i]);
+ endfor;
+ draw rp(pro2)--rp(pro6);
+ draw rp(pro4)--rp(pro8);
+ draw rp(mb)--rp(mt);
+ draw rp(ml)--rp(mr);
+ drawoptions( withpen projpen );
+ draw rp(pro1)...rp(pro2)..rp(pro3);
+ draw rp(pro3)...rp(pro4)..rp(pro5);
+ draw rp(pro5)...rp(pro6)..rp(pro7);
+ draw rp(pro7)...rp(pro8)..rp(pro1);
+ draw rp(black)--rp(psdf) withpen lightpen;
+ draw rp(black) withpen dotpen;
+ draw rp(psdf) withpen dotpen;
+ label.rt( btex f etex, rp(psdf) );
+% label.ulft( btex viewcentr etex, rp(black) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end; \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/torus.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/torus.mp
new file mode 100644
index 00000000000..e629e85823a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/torus.mp
@@ -0,0 +1,297 @@
+% torus
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+% Draw a torus with NP dots, a section of 3.14*RS^2
+% and a total diameter of 2*(RB+RS). The dots are placed
+% on a single closed line that turns around the $z$ axis
+% NB times and around the section NS times.
+% figure(1) exemplifies the use of signalvertex.
+
+def flask( expr TheVal ) =
+ begingroup
+ numeric RB, RS, RP, NB, NS, NM, phi, theta, first, second, third;
+ RB=1;
+ RS=0.3;
+ RP=0.02;
+ NB=8;
+ NS=5;
+ NM=4;
+ theta=360*NB*TheVal;
+ phi=360*NS*TheVal;
+ first =(RB+(RS+RP*sind(NM*theta))*cosd(phi))*cosd(theta);
+ second=(RB+(RS+RP*sind(NM*theta))*cosd(phi))*sind(theta);
+ third = (RS+RP*sind(NM*theta))*sind(phi);
+ ( (first,second,third) )
+ endgroup
+enddef;
+
+def blask( expr TheVal ) =
+ begingroup
+ numeric RB, RS, NB, NS, phi, theta, first, second, third;
+ RB=1;
+ RS=0.1;
+ NB=1;
+ NS=24;
+ theta=360*NB*TheVal;
+ phi=360*NS*TheVal;
+ first =(RB+RS*cosd(phi))*cosd(theta);
+ second=(RB+RS*cosd(phi))*sind(theta);
+ third = RS*sind(phi);
+ ( (first,second,third) )
+ endgroup
+enddef;
+
+beginfig(5);
+ Spread := 200;
+ numeric NP, i, varfrac;
+ path cl;
+ string comm;
+ pen bip, sp;
+ varfrac = 1.25;
+ bip = pencircle scaled 15pt;
+ sp = pencircle scaled 9pt;
+ NP=600;
+ cl = for i=1 upto NP: rp(flask(i/NP)).. endfor cycle;
+ draw cl;
+ for i=1 upto NP:
+ comm:="draw subpath ("
+ & decimal(i-0.5)
+ & ","
+ & decimal(i+0.5)
+ & ") of cl withpen bip; undraw subpath ("
+ & decimal(i-varfrac)
+ & ","
+ & decimal(i+varfrac)
+ & ") of cl withpen sp;";
+ getready( comm, flask( i/NP ) );
+ endfor;
+ closedline( true, 300, 0.5, 1 )( blask );
+ doitnow;
+endfig;
+
+beginfig(6);
+ Spread := 100;
+ f := (7,3,9);
+ HoriZon := -2;
+ LightSource := (1,-1,15);
+ numeric sinthe, costhe, ux, uz, lx, lz, co, i;
+ costhe = (4*sqrt(5)-sqrt(3))/11;
+ sinthe = sqrt(1-(costhe**2));
+ ux = costhe*sqrt(2)/2;
+ uz = sinthe/2;
+ lx = sqrt(4/3)*sinthe;
+ lz = -sqrt(2/3)*costhe;
+ co = sqrt(2)*(2*sqrt(5)+5*sqrt(3))/22;
+ V1 := (ux,0,-uz);
+ V2 := (lx,0,-lz);
+ V3 := (0,ux,uz); V15:= (0,-ux,uz);
+ V4 := (0,lx,lz); V16:= (0,-lx,lz);
+ V5 := (co,co,0); V14:= (-co,-co,0);
+ V6 := (-ux,0,-uz);
+ V7 := (-lx,0,-lz);
+ V8 := (-co,co,0); V13:= (co,-co,0);
+ V9 := improvertex( V5, 1, V4, 1, V3, sqrt(3)-1, (0,1,0) );
+ V10:= (-X(V9),-Y(V9),Z(V9));
+ V11:= (Y(V9),-X(V9),-Z(V9));
+ V12:= (-Y(V9),X(V9),-Z(V9));
+ makeface1(1,2,3);
+ makeface2(1,2,5);
+ makeface3(2,3,5);
+ makeface4(9,4,5);
+ makeface5(3,4,1);
+ makeface6(1,4,5);
+ makeface7(3,6,7);
+ makeface8(3,7,8);
+ makeface9(6,7,8);
+ makeface10(9,8,4);
+ makeface11(4,6,8);
+ makeface12(3,4,6);
+ makeface13(3,5,9);
+ makeface14(3,8,9);
+ makeface15(7,8,12);
+ makeface16(7,14,12);
+ makeface17(6,8,12);
+ makeface18(6,14,12);
+ makeface19(2,5,11);
+ makeface20(2,13,11);
+ makeface21(1,5,11);
+ makeface22(1,13,11);
+ makeface23(10,15,13);
+ makeface24(10,15,14);
+ makeface25(10,16,13);
+ makeface26(10,16,14);
+ makeface27(2,1,15);
+ makeface28(6,7,15);
+ makeface29(13,15,2);
+ makeface30(14,15,7);
+ makeface31(16,1,15);
+ makeface32(16,6,15);
+ for i=1 upto 32:
+ FC[i] := TableColors;
+ FCD[i]:= true;
+ endfor;
+ ShadowOn := true;
+ setthearena(15,6);
+ fill_faces();
+ draw_invisible( false, false, TableC3, TableC0 );
+% drawoptions( withcolor red );
+% for i=1 upto 16:
+% label.bot( decimal( i ), rp( V[i] ) );
+% endfor;
+endfig;
+
+beginfig(1);
+ Spread := 140;
+ NP:=2000;
+ RB:=1;
+ RS:=0.2;
+ R3:=0.1;
+ NB:=8;
+ NS:=5;
+ jB:=360*NB/NP;
+ jS:=360*NS/NP;
+ for i=1 upto NP:
+ phi :=i*jS;
+ theta :=i*jB;
+ first :=(RB+(RS+R3*sind(4*theta))*cosd(phi))*cosd(theta);
+ second:=(RB+(RS+R3*sind(4*theta))*cosd(phi))*sind(theta);
+ third := (RS+R3*sind(4*theta))*sind(phi);
+ signalvertex( (first,second,third), 1, black );
+ endfor;
+endfig;
+
+% Draw a torus with faces.
+
+beginfig(2);
+
+ PrintStep := 7;
+
+ f := ( 3,1,1 );
+
+ RB:=1;
+ RS:=0.25;
+ NB:=3;
+ NS:=5;
+ jB:=360/NB;
+ jS:=360/NS;
+ iS:=jS;
+ iB:=jB;
+ counter:=0;
+ for i=1 upto NB:
+ for j=1 upto NS:
+ counter := incr(counter);
+ npf[counter]:= 4;
+ phi :=j*jS;
+ theta:=i*jB;
+ f1 :=(RB+(RS)*cosd(phi))*cosd(theta);
+ s1 :=(RB+(RS)*cosd(phi))*sind(theta);
+ t1 := (RS)*sind(phi);
+ F[counter]p[1]:=(f1,s1,t1);
+ f2 :=(RB+(RS)*cosd(phi))*cosd(theta+iB);
+ s2 :=(RB+(RS)*cosd(phi))*sind(theta+iB);
+ t2 := (RS)*sind(phi);
+ F[counter]p[2]:=(f2,s2,t2);
+ f3 :=(RB+(RS)*cosd(phi+iS))*cosd(theta+iB);
+ s3 :=(RB+(RS)*cosd(phi+iS))*sind(theta+iB);
+ t3 := (RS)*sind(phi+iS);
+ F[counter]p[3]:=(f3,s3,t3);
+ f4 :=(RB+(RS)*cosd(phi+iS))*cosd(theta);
+ s4 :=(RB+(RS)*cosd(phi+iS))*sind(theta);
+ t4 := (RS)*sind(phi+iS);
+ F[counter]p[4]:=(f4,s4,t4);
+ endfor;
+ endfor;
+ NF:=counter;
+% faceraytrace(0.3, blue);
+% draw_all_test(false);
+ sharpraytrace;
+endfig;
+
+beginfig(3);
+ f := (6,2,4);
+% f := (6,2,7); % NO CUSP.
+ Spread:=70;
+ HoriZon := -2;
+ ShadowOn := true;
+ numeric bigray, smaray, angstep;
+ color toruscenter, torusmoment, nearaxe, sideaxe, viewline;
+ color circlecenter, circlemoment;
+ numeric ang, ind, i, anglim;
+ path cpath, apath, opath, ipath, wp, ep;
+ pair outerp[], innerp[], refpair;
+ pen markpen;
+ boolean cuspcond;
+ picture holepic;
+ markpen = pencircle scaled 5pt;
+ pickup markpen;
+ bigray = 2;
+ smaray = 1;
+ angstep= 2;
+ toruscenter = black;
+ torusmoment = (0,1,2);
+ refpair = unitvector( rp(toruscenter+torusmoment)-rp(toruscenter) );
+ viewline = f-toruscenter;
+ ind = 0;
+ sideaxe = bigray*ncrossprod( torusmoment, viewline );
+ nearaxe = bigray*ncrossprod( sideaxe, torusmoment );
+ anglim = 0.5*angstep-180;
+ if ShadowOn:
+ for ang=anglim step angstep until -anglim:
+ circlecenter:= nearaxe*cosd(ang)+sideaxe*sind(ang);
+ circlemoment:=-nearaxe*sind(ang)+sideaxe*cosd(ang);
+ filldraw circleshadowpath(circlecenter,circlemoment,smaray);
+ endfor;
+ fi;
+ for ang=anglim step angstep until -anglim:
+ ind := incr( ind );
+ circlecenter:= nearaxe*cosd(ang)+sideaxe*sind(ang);
+ circlemoment:=-nearaxe*sind(ang)+sideaxe*cosd(ang);
+ cpath:=spatialhalfcircle(circlecenter,circlemoment,smaray,true);
+ if ang>=0:
+ outerp[ind]=point 0 of cpath;
+ innerp[ind]=point (length cpath) of cpath;
+ elseif ang<0:
+ innerp[ind]=point 0 of cpath;
+ outerp[ind]=point (length cpath) of cpath;
+ fi;
+ endfor;
+ opath = for i=1 upto ind: outerp[i].. endfor cycle;
+ ipath = for i=1 upto ind: innerp[i].. endfor cycle;
+ holepic = currentpicture;
+ clip holepic to ipath;
+ unfill opath;
+ draw holepic;
+ draw opath withcolor green;
+ draw ipath withcolor red;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Perhaps there is an analytic way of getting the angle of the cusp point? %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ i := ceiling(1+180/angstep);
+ forever:
+ i := incr( i );
+ cuspcond := refpair dotprod innerp[i+1] < refpair dotprod innerp[i];
+ exitif cuspcond or ( i > ind-1 );
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ ep = outerp[ind-i]--innerp[ind-i];
+ wp = innerp[i]--outerp[i];
+ unfill buildcycle(opath,ep,reverse ipath,wp);
+ draw opath withcolor green;
+ draw subpath (i,ind-i) of ipath withcolor red;
+endfig;
+
+beginfig(4);
+ f := (16,2,3.8);
+ Spread:=40;
+ pickup pencircle scaled 3pt;
+ smoothtorus( black-3*blue, blue, 4, 1 );
+ smoothtorus( black, blue, 4, 1 );
+ smoothtorus( black+3*blue, blue, 4, 1 );
+endfig;
+
+end.
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/trajectoryline.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/trajectoryline.mp
new file mode 100644
index 00000000000..30fe6235713
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/trajectoryline.mp
@@ -0,0 +1,88 @@
+% trajectoryline.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+Spread := 30;
+f := (10,0,0);
+
+color posa, posb, axer;
+numeric kfac, refrad;
+posa = -5*green;
+posb = 5*green;
+axer = blue;
+kfac = 2.5;
+refrad = 1;
+
+def vecfunc( expr posit )=
+ begingroup
+ save modula, modulb, field;
+ color field;
+ numeric modula, modulb;
+ modula = conorm( posit-posa );
+ modulb = conorm( posit-posb );
+ field = ( posit-posa )/(modula**3)+kfac*( posit-posb )/(modulb**3);
+ ( -field )
+ endgroup
+enddef;
+
+def magfunc( expr posit )=
+ begingroup
+ save perpd, refvec, dist;
+ color perpd, refvec;
+ numeric dist;
+ perpd = ccrossprod( axer, posit );
+ refvec = posit - refrad*ncrossprod( perpd, axer );
+ dist = conorm( refvec );
+ ( ncrossprod( refvec, perpd )/(dist**2) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, lena, numa, sa, diffstep, ray;
+ color stp, svl;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 400;
+ numa = 58;
+ diffstep = 0.12;
+ ray = 3.5;
+ sa = 168;
+ for i=sa step numa until (180):
+ stp := ( 0, ray*cosd(i), ray*sind(i) );
+ svl := N( -stp );
+ oneline := trajectorypath( lena, stp, svl, diffstep, vecfunc );
+ draw oneline withpen grossa;
+ draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(posa) withpen grossa;
+ draw rp(posb) withpen grossa;
+endfig;
+
+beginfig(2);
+ numeric i, lena, numa, sa, diffstep, ray;
+ color stp, svl;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 100;
+ numa = 4;
+ diffstep = 1;
+ ray = 5.5;
+ sa = 97;
+ for i=sa step numa until (120):
+ stp := ( 0, ray*cosd(i), ray*sind(i) );
+ svl := 0.8*N( -stp );
+ oneline := magnetictrajectorypath( lena, stp, svl, diffstep, magfunc );
+ draw oneline withpen grossa;
+ draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(black) withpen grossa;
+endfig;
+
+end.
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/triangulartrimesh.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/triangulartrimesh.mp
new file mode 100644
index 00000000000..1a19c776976
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/triangulartrimesh.mp
@@ -0,0 +1,39 @@
+% triangulartrimesh.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input featpost3Dplus2D;
+
+def zsurface( expr xc, yc ) =
+ cosd(xc*57)*cosd(yc*57)+4*mexp(-(xc**2+yc**2)*6.4)
+enddef;
+
+f := 16*(4,1,1);
+Spread := 35;
+LightSource := 10*(4,-3,4);
+defaultfont := "cmvtt10";
+beginfig(1);
+ numeric np, ssize, lx, ly, topl, ystep, i, zl;
+ string L[];
+ L0 = "P";
+ L1 = "H";
+ L2 = "Y";
+ L3 = "S";
+ L4 = "I";
+ L5 = "C";
+ L6 = "S";
+ np = 72;
+ ssize = 15;
+ ly = -0.5*ssize;
+ lx = -sqrt(3)*ssize/6;
+ ystep = ssize/7;
+ topl = 2*zsurface( 0, 0 );
+ for i=0 upto 6:
+ zl := zsurface(lx,i*ystep+ly);
+ labelinspace(false,(lx,i*ystep+ly,zl),green*ystep,blue*(topl-zl),L[i]);
+ endfor;
+ hexagonaltrimesh( false,np,ssize,zsurface);
+ label.ulft("matagalatlante.org",lrcorner currentpicture);
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/tropicalglobe.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/tropicalglobe.mp
new file mode 100644
index 00000000000..e861c8c4462
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/tropicalglobe.mp
@@ -0,0 +1,23 @@
+% tropicalglobe.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ numeric radius, numc;
+ pen thickp;
+
+ f := (3,0,2);
+ viewcentr := 0.5*(1,1,1);
+ Spread := 20;
+ radius = 1;
+ numc = 18;
+ thickp = pencircle scaled 1mm;
+
+ drawoptions( withpen thickp );
+ tropicalglobe( numc, black, radius, blue );
+ produce_auto_scale;
+endfig;
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/tshirtfig.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/tshirtfig.mp
new file mode 100644
index 00000000000..3873ab3c1fa
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/tshirtfig.mp
@@ -0,0 +1,39 @@
+% tshirtfig.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ f := (5,4,3);
+ Spread := 70;
+ pickup pencircle scaled 2.4pt;
+ numeric gridstep, cylength, cyradius, numcylis;
+ numeric i, j, curcoord, curangle, curnorma, tmp;
+ numeric othcoord, othangle, zcoord, coef, othnorma;
+ color base, lenvec;
+ cylength := 0.2;
+ cyradius := 0.3;
+ gridstep := cyradius*2.2;
+ numcylis := 7;
+ coef := 0.22;
+ for i=1 upto numcylis: % saddle
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := -curcoord*2*coef;
+ for j=1 upto numcylis:
+ othnorma := j-0.5*(numcylis+1);
+ othcoord := othnorma*gridstep;
+ othangle := othcoord*2*coef;
+ zcoord:=coef*(othcoord**2-curcoord**2);
+ base := (curcoord,othcoord,zcoord);
+ lenvec := cylength*N((-curangle,-othangle,1));
+ tmp := zcoord/2.4+0.8;
+ if tmp > 1: show tmp; fi;
+ background := tmp*TableC2;
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ endfor;
+endfig;
+
+end. \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/tuftescatter.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/tuftescatter.mp
new file mode 100644
index 00000000000..2df874ec1dc
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/tuftescatter.mp
@@ -0,0 +1,83 @@
+% tuftescatter.mp
+% L. Nobre G.
+% IYP (2005)
+
+% input featpost3Dplus2D;
+
+def linscatter = uniformdeviate( 2 ) - 1 enddef;
+
+def fullcalculator =
+ begingroup
+ color aux;
+ numeric cx, cy;
+ forever:
+ cx := linscatter;
+ cy := linscatter;
+ exitif cx ++ cy < 0.8; % Saddle ray
+ endfor;
+ aux = ( cx, cy, cx*cx-cy*cy );
+ ( eulerrotation( -25, -15, -5, aux ) ) % Rotation angles
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric totalnum, classnum, sparksiz, pointray;
+ totalnum = 350; % Number of data points
+ classnum = 30; % Number of sparkline classes
+ sparksiz = 0.34; % Maximum sparkline height
+ pointray = 0.025; % Size of the data points
+ f := ( 7, 6, 5 );
+ Spread := 150;
+ numeric i, j, k, l, hx[], hy[], hz[], classtep;
+ classtep = 2/classnum;
+ color tmp;
+ for j=0 upto classnum:
+ hx[j] = 0;
+ hy[j] = 0;
+ hz[j] = 0;
+ endfor;
+ for l=1 upto totalnum:
+ tmp := fullcalculator;
+ for k=1 upto classnum:
+ if ( X(tmp) <= k*classtep-1 ) and ( X(tmp) > (k-1)*classtep-1 ):
+ hx[k] := incr( hx[k] );
+ fi;
+ if ( Y(tmp) <= k*classtep-1 ) and ( Y(tmp) > (k-1)*classtep-1 ):
+ hy[k] := incr( hy[k] );
+ fi;
+ if ( Z(tmp) <= k*classtep-1 ) and ( Z(tmp) > (k-1)*classtep-1 ):
+ hz[k] := incr( hz[k] );
+ fi;
+ endfor;
+ draw rigorouscircle( (-1,Y(tmp),Z(tmp)), red, pointray );
+ draw rigorouscircle( (X(tmp),-1,Z(tmp)), green, pointray );
+ draw rigorouscircle( (X(tmp),Y(tmp),-1), blue, pointray );
+ getready("fill rigorousfearpath("
+ & cstr( tmp )
+ & ",pointray) withcolor blue; draw rigorousfearpath("
+ & cstr( tmp )
+ & ",pointray); ", tmp);
+ endfor;
+ numeric maxn, sparkfac;
+ maxn = 0;
+ for i=1 upto classnum:
+ if hx[i]>maxn: maxn := hx[i]; fi;
+ if hy[i]>maxn: maxn := hy[i]; fi;
+ if hz[i]>maxn: maxn := hz[i]; fi;
+ endfor;
+ sparkfac = sparksiz/maxn;
+ for j=1 upto classnum:
+ draw rp(((j-1)*classtep-1,1+sparkfac*hx[j-1],-1))
+ --rp(((j-1)*classtep-1,1+sparkfac*hx[j],-1))
+ --rp((j*classtep-1,1+sparkfac*hx[j],-1));
+ draw rp((-1,(j-1)*classtep-1,1+sparkfac*hy[j-1]))
+ --rp((-1,(j-1)*classtep-1,1+sparkfac*hy[j]))
+ --rp((-1,j*classtep-1,1+sparkfac*hy[j]));
+ draw rp((-1,1+sparkfac*hz[j-1],(j-1)*classtep-1))
+ --rp((-1,1+sparkfac*hz[j],(j-1)*classtep-1))
+ --rp((-1,1+sparkfac*hz[j],j*classtep-1));
+ endfor;
+ doitnow;
+endfig;
+
+end. \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/twistflat.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/twistflat.mp
new file mode 100644
index 00000000000..080f3364282
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/twistflat.mp
@@ -0,0 +1,55 @@
+% twistflat.mp
+% L. Nobre G.
+% Y2K
+
+%input featpost3Dplus2D;
+
+
+
+beginfig(1);
+
+ f := 0.7*(1.5,0.3,1.2);
+
+ Spread := 700;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, thetamin,
+ thetamax, thetastp, long, base;
+ sizevec := (11,6,1);
+ gridvec := (0.05,0.1,0.1);
+ thetamin := 55;
+ thetamax := 125;
+ long := 0.08;
+ base := 0.1;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -0.5*X(gridvec)*(X(sizevec)-1) ,
+ -0.5*Y(gridvec)*(Y(sizevec)-1) ,
+ -0.5*Z(gridvec)*(Z(sizevec)-1) );
+ bordpos := starpos - 0.5*gridvec;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ NF := 1;
+ draw facepath(1);
+ counter := 1;
+ for i=1 upto X(sizevec):
+ for j=1 upto Y(sizevec):
+ for k=1 upto Z(sizevec):
+ phi := 90;
+ theta := thetamin+(i-1)*thetastp;
+ currpos := starpos+( (i-1)*X(gridvec) ,
+ (j-1)*Y(gridvec) ,
+ (k-1)*Z(gridvec) );
+ generatedirline( counter, phi, theta, long, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NL := decr(counter);
+ director_invisible( true, base, false );
+endfig;
+
+end;
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/twoholes.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/twoholes.mp
new file mode 100644
index 00000000000..07cf6c31964
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/twoholes.mp
@@ -0,0 +1,31 @@
+% twoholes.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3Dplus2D;
+
+f := 1.5*(0,1.5,1);
+Spread := 100;
+
+beginfig(1);
+ numeric stagelevel, holediam, outerdiam, stagemargin;
+ numeric numberofstagesidesquares, stagesidesize;
+ numeric centercoord;
+ color centerposdisc, centerpostorus;
+ stagelevel = 0.2;
+ holediam = 0.6;
+ stagemargin = 0.2;
+ numberofstagesidesquares = 20;
+ outerdiam = holediam+4*stagelevel;
+ stagesidesize = 2*( outerdiam + stagemargin );
+ centercoord = 0.3535*outerdiam;
+ HoriZon := -stagelevel;
+ centerpostorus = ( centercoord, -centercoord, 0 );
+ centerposdisc = ( -centercoord, centercoord, HoriZon );
+ setthestage( numberofstagesidesquares, stagesidesize );
+ smoothtorus( centerpostorus, blue,
+ 0.5*holediam+stagelevel, stagelevel );
+ rigorousdisc( 0.5*holediam, true, centerposdisc,
+ 0.5*outerdiam, 1.5*stagelevel*blue );
+endfig;
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/unperfection.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/unperfection.mp
new file mode 100644
index 00000000000..0e95bc05451
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/unperfection.mp
@@ -0,0 +1,59 @@
+% unperfection.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+Spread := 70;
+f := (10,4,5);
+
+beginfig(1);
+ numeric i, len, polelen;
+ numeric fws, NumLines, linex, inray, outay, axray;
+ numeric wang, poleray;
+ path aro[], oneline;
+ color axe, pole, polec, aroc;
+ picture floorwall;
+ len := 0.6;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ pole := (0,1,0);
+ fws := 4;
+ polelen := 0.8*fws;
+ outay := 0.45*fws;
+ inray := 0.7*outay;
+ poleray := 0.07*inray;
+ NumLines := 30;
+ for i=0 upto NumLines:
+ linex := fws*(i/NumLines-0.5);
+ oneline := rp((linex,0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,0.5*fws));
+ draw oneline withcolor (0.7*background);
+ endfor;
+ aroc := outay*(0,cosd(wang),sind(wang))-0.5*(0,fws,fws);
+ polec := (0,(outay-inray)*cosd(wang)-fws/2,
+ (outay+inray)*sind(wang)-poleray-fws/2);
+ aro1 := goodcirclepath( aroc, axe, inray );
+ aro2 := goodcirclepath( aroc+len*axe, axe, inray );
+ aro3 := buildcycle( aro1, aro2 );
+ floorwall := currentpicture;
+ clip floorwall to aro3;
+ aro4 := spatialhalfcircle( aroc+len*axe, axe, inray, false );
+ aro5 := spatialhalfcircle( aroc+len*axe, axe, outay, false );
+ aro6 := reverse aro5;
+ aro7 := aro4--aro6--cycle;
+ fill aro7 withcolor (0.6*background);
+ rigorousdisc( 0, true, aroc, inray, axe*len );
+ draw floorwall;
+ draw aro3;
+ rigorousdisc( 0, true, polec, poleray, pole*polelen );
+ aro8 := spatialhalfcircle( aroc+len*axe, axe, inray, true );
+ aro9 := spatialhalfcircle( aroc+len*axe, axe, outay, true );
+ aro10 := reverse aro9;
+ aro11 := aro8--aro10--cycle;
+ fill aro11 withcolor (0.6*background);
+ rigorousdisc( 0, false, aroc, outay, axe*len );
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/unperfectionremoved.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/unperfectionremoved.mp
new file mode 100644
index 00000000000..1829b9e7787
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/unperfectionremoved.mp
@@ -0,0 +1,34 @@
+% unperfectionremoved.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+Spread := 70;
+f := (13,4,3);
+
+beginfig(1);
+ numeric i, len;
+ numeric fws, NumLines, linex, inray, outay, axray;
+ numeric wang;
+ path oneline;
+ color axe, aroc;
+ len := 0.6;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ outay := 0.45*fws;
+ inray := 0.7*outay;
+ NumLines := 30;
+ for i=0 upto NumLines:
+ linex := fws*(i/NumLines-0.5);
+ oneline := rp((linex,0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,0.5*fws));
+ draw oneline withcolor (0.7*background);
+ endfor;
+ aroc := outay*(0,cosd(wang),sind(wang))-0.5*(0,fws,fws);
+ rigorousdisc( inray, true, aroc, outay, axe*len );
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/vanallenbelt.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/vanallenbelt.mp
new file mode 100644
index 00000000000..83c636ab380
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/vanallenbelt.mp
@@ -0,0 +1,51 @@
+% vanallenbelt.mp
+% L. Nobre G.
+% 2004
+
+% input featpost3Dplus2D;
+
+def magnfield( expr pos ) =
+ begingroup
+ save dist, anga, angb, angp, bv, bh, br, bx, by, bz, fin;
+ numeric dist, anga, angb, bv, bh, br, bx, by, bz;
+ pair angp;
+ color fin;
+ dist = conorm( pos );
+ angp = getanglepair( pos );
+ anga = xpart( angp );
+ angb = ypart( angp );
+ bh = 0.5*cosd( angb )/dist**3;
+ bv = sind( angb )/dist**3;
+ br = bv*cosd( angb ) - bh*sind( angb );
+ bz = bv*sind( angb ) + bh*cosd( angb );
+ bx = br*cosd( anga );
+ by = br*sind( anga );
+ fin = ( bx, by, bz );
+ ( 25*fin )
+ endgroup
+enddef;
+
+def pmf( expr pos ) =
+ (2*red/(((greenpart pos) ++ (bluepart pos))**2))
+enddef;
+
+beginfig(1);
+ color vel;
+ vel = 1.1*(-0.25,0.0,0.1);
+ cartaxes(1,1,1);
+ draw magnetictrajectorypath(200, red, vel, 0.22, magnfield );
+% draw magnetictrajectorypath(400, red,-vel, 0.22, magnfield );
+endfig;
+
+beginfig(2);
+ f := 2*red;
+ Spread := 200;
+ numeric ang;
+ color vel;
+ ang = 145;
+ vel = 0.8*( 0, cosd( ang ), sind( ang ) );
+ draw magnetictrajectorypath(200, green, vel, 0.1, pmf );
+ drawarrow reverse (rp(blue)--rp(black)--rp(green));
+endfig;
+
+end. \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/verygoodcone.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/verygoodcone.mp
new file mode 100644
index 00000000000..8ce59552a21
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/verygoodcone.mp
@@ -0,0 +1,28 @@
+% verygoodcone.mp
+% L. Nobre G.
+% 2003
+
+%input featpost3Dplus2D;
+
+beginfig(1);
+ numeric radiusin, fac, i, numc, stepang, xcoor, ycoor, radc;
+
+ f := (5,0.3,1.5);
+ Spread := 70;
+ radiusin = 0.3;
+ numc = 9;
+ fac = 3;
+ stepang = 360/numc;
+ radc = (fac-1)*radiusin*sind(0.5*stepang);
+
+ for i=0 step stepang until 180:
+ xcoor := -radiusin*cosd(i);
+ ycoor := radiusin*sind(i);
+verygoodcone(true,fac*(xcoor,-ycoor,0),(-xcoor,ycoor,0),radc,(xcoor,-ycoor,0));
+verygoodcone(true,fac*(xcoor,ycoor,0),-(xcoor,ycoor,0),radc,(xcoor,ycoor,0));
+ endfor;
+endfig;
+
+end;
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/standard/xraycamera.mp b/Master/texmf-dist/doc/metapost/featpost/example/standard/xraycamera.mp
new file mode 100644
index 00000000000..b3f6e51c6de
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/standard/xraycamera.mp
@@ -0,0 +1,117 @@
+% xraycamera.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ f := (10,7,8);
+ Spread := 45;
+ numeric w, h, l, d, t, tr, tl, ma, mb, we, ar;
+ w = 3;
+ h = 2;
+ l = 4;
+ d = 0.75;
+ t = 1.2;
+ tr= 0.15;
+ tl= 0.25;
+ ma= 0.3;
+ mb= 0.2;
+ ar= 2;
+ we= 0.6*(h-t);
+ pen thin, thick, aver;
+ thin = pencircle scaled 0.5pt;
+ thick= pencircle scaled 1.5pt;
+ aver = pencircle scaled 1.0pt;
+ ahlength:=2mm;
+ ahangle:=30;
+ color p[];
+ p1 = (0,w/2,-ma-mb);
+ p2 = (0,w/2,-ma);
+ p3 = (0,w/2,0);
+ p4 = (0,w/2,h);
+ p5 = (0,-w/2,-ma-mb);
+ p6 = (0,-w/2,-ma);
+ p7 = (0,-w/2,0);
+ p8 = (0,-w/2,h);
+ p9 = (0,-w/2-ma-mb,0);
+ p10= (0,-w/2-ma,0);
+ p11= (0,-w/2-ma-mb,h);
+ p12= (0,-w/2-ma,h);
+ p13= (-l,-w/2-ma-mb,h);
+ p14= (-l,-w/2-ma,h);
+ p15= (-l,-w/2,h);
+ p16= (-l,-w/2,0);
+ p17= (-l,w/2,0);
+ p18= (-l,w/2,h);
+ p19= (-l+d,0,0);
+ p20= (-l+d,0,t);
+ p21= (-l-ma,0,t);
+ p22= (-l-ma-mb,0,t);
+ p23= (-l-ma,0,0);
+ p24= (-l-ma-mb,0,0);
+ p25= (-l+d,w/2+ma,0);
+ p26= (-l+d,w/2+ma+mb,0);
+ p27= (-l,w/2+ma,0);
+ p28= (-l,w/2+ma+mb,0);
+ p29= 0.5[p2,p6];
+ p30= 0.5[p10,p12];
+ p31= 0.5[p12,p14];
+ p32= 0.5[p21,p23];
+ p33= 0.5[p25,p27];
+ p34= (0,0,h);
+ p35= (0,0,2*t-h);
+ drawoptions( withpen thick );
+ draw rp(p8)--rp(p4)--rp(p3)--rp(p7)--rp(p8)--rp(p15)--rp(p16);
+ draw rp(p15)--rp(p18)--rp(p17)--rp(p3)--rp(p4)--rp(p18);
+ path pat[];
+ pat1 = rp(p8)--rp(p4);
+ pat2 = rp(p7)--rp(p16)--rp(p17);
+ pat3 = rp(p4)--rp(p18);
+ pat4 = pat2 cutbefore pat1 cutafter pat3;
+ draw pat4;
+ drawoptions( withpen thin );
+ drawdblarrow rp(p2)--rp(p6);
+ drawdblarrow rp(p10)--rp(p12);
+ drawdblarrow rp(p14)--rp(p12);
+ drawdblarrow rp(p21)--rp(p23);
+ drawdblarrow rp(p25)--rp(p27);
+ draw rp(p1)--rp(p3);
+ draw rp(p5)--rp(p7);
+ draw rp(p7)--rp(p9);
+ draw rp(p8)--rp(p11);
+ draw rp(p13)--rp(p15);
+ draw rp(p20)--rp(p22);
+ draw rp(p19)--rp(p24);
+ draw rp(p17)--rp(p28);
+ draw rp(p19)--rp(p26);
+ drawoptions( withpen thick );
+ rigorousdisc( 0, true, p20, tr, (-tl,0,0) );
+ draw rp(p19)--rp(p20) withpen thin;
+ drawoptions( withpen aver );
+ draw rp(p34)--rp(p20)--rp(p35);
+ fill ellipticpath( (0,0,t), (h-t)*blue, we*green ) withcolor 0.5white;
+ draw pat2 dashed evenly withpen thick;
+ draw rp(p20)--rp(p35)--rp(p34) dashed evenly;
+ draw rp((0,0,t)-we*green)--rp((0,0,t)+we*green) dashed evenly;
+ angline( p34, p35, p20, ar, btex $\alpha$ etex, llft );
+ label.bot(btex $w$ etex, rp(p29));
+ label.lft(btex $h$ etex, rp(p30));
+ label.top(btex $l$ etex, rp(p31));
+ label.lft(btex $t$ etex, rp(p32));
+ label.rt(btex $d$ etex, rp(p33));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/tug04/cone.mp b/Master/texmf-dist/doc/metapost/featpost/example/tug04/cone.mp
new file mode 100644
index 00000000000..883f01ff625
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/tug04/cone.mp
@@ -0,0 +1,37 @@
+% cone.mp
+% L. Nobre G.
+% 2004
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ f := (5,3,4);
+ numeric labscal;
+ picture labr, labc, laba, labv;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labr = btex $R$ etex scaled labscal;
+ labv = btex $\vec{v}$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ verygoodcone(true,black,blue,0.8,blue+green);
+ drawoptions( withpen pencircle scaled 1.3pt );
+ draw rp(black)--rp(green)--rp(blue+green) dashed evenly;
+ drawdblarrow rp(black)--rp(0.8green);
+ label.urt( labr, rp(0.4green) );
+ drawarrow rp(black)--rp(0.45*blue);
+ label.rt( laba, rp((0,0,0.25)) );
+ dotlabel.llft( labc, rp(black) );
+ dotlabel.rt( labv, rp(blue+green) );
+
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/tug04/ellipticprism.mp b/Master/texmf-dist/doc/metapost/featpost/example/tug04/ellipticprism.mp
new file mode 100644
index 00000000000..6106c980adf
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/tug04/ellipticprism.mp
@@ -0,0 +1,39 @@
+% ellipticprism.mp
+% L. Nobre G.
+% 2004
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ f := (5,3,4);
+ numeric labscal;
+ picture labsa, labba, labsb, labd, labc;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ labsa = btex $\vec{S}_1$ etex scaled labscal;
+ labsb = btex $\vec{S}_2$ etex scaled labscal;
+ labba = btex $\vec{B}_1$ etex scaled labscal;
+ labd= btex $D$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ whatisthis( black, 0.5red, green, 0.85, 0.8 );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(0.85blue);
+ label.rt( labd, rp(0.4blue) );
+ drawarrow rp(black)--rp(0.5red);
+ label.ulft( labsa, rp(0.25red) );
+ drawarrow rp(black)--rp(green);
+ label.top( labba, rp((0,0.5,0)) );
+ drawarrow rp(0.85blue)--rp(0.8*0.5*red+0.85blue);
+ label.ulft( labsb, rp(0.2red+0.85blue) );
+ dotlabel.bot( labc, rp(black) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/tug04/intersection2D.mp b/Master/texmf-dist/doc/metapost/featpost/example/tug04/intersection2D.mp
new file mode 100644
index 00000000000..d482fde6ed0
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/tug04/intersection2D.mp
@@ -0,0 +1,46 @@
+% intersection2D.mp
+% L. Nobre G.
+% 2004
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ numeric u;
+ pair Aa, Ab, Ba, Bb, Un, Kn, Or;
+ pen dotpen, penpen;
+ color knowncolour, notknowncol;
+ picture kn, un;
+ u = 4mm;
+ Aa = (0,8u);
+ Ab = (15u,0);
+ Ba = (12u,0.5u);
+ Bb = (13u,6u);
+ Kn = (0,1u);
+ Or = (1.5u,1.5u);
+ dotpen = pencircle scaled 0.5u;
+ penpen = pencircle scaled 0.2u;
+ knowncolour = blue;
+ notknowncol = red;
+ kn = btex given etex;
+ un = btex unknown etex;
+ draw Aa--Ab;
+ draw Ba--Bb;
+ drawoptions( withpen dotpen withcolor knowncolour );
+ draw Aa;
+ draw Ab;
+ draw Ba;
+ draw Bb;
+ draw Kn+Or;
+ drawoptions( withpen dotpen withcolor notknowncol );
+ Un = whatever[Aa,Ab];
+ Un = whatever[Ba,Bb];
+ draw Un;
+ draw Or;
+ drawoptions();
+ label.rt( kn, Kn+Or );
+ label.rt( un, Or );
+endfig;
+
+verbatimtex }\end{document} etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/tug04/kindofcube.mp b/Master/texmf-dist/doc/metapost/featpost/example/tug04/kindofcube.mp
new file mode 100644
index 00000000000..c29d727bd61
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/tug04/kindofcube.mp
@@ -0,0 +1,57 @@
+% kindofcube.mp
+% L. Nobre G.
+% 2004
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ f := (4,1.2,0.5);
+ Spread := 120;
+ numeric lena, lenb, lenc, aa, ab, ac, angray, micr, labscal;
+ pair zeror;
+ color axa, axb, axc, returnedcorner, dummyc, auxx, auxy;
+ lena=0.3;
+ lenb=0.6;
+ lenc=0.9;
+ aa=130;
+ ab=32;
+ ac=67;
+ labscal=1.6;
+ angray=0.85;
+ micr=0.01;
+ zeror=rp(black);
+ cartaxes(1.2,1,1.15);
+ axa = ( cosd(aa), sind(aa), 0 );
+ axb = axa*cosd(ab)+blue*sind(ab);
+ auxx= ( cosd(aa+90), sind(aa+90), 0);
+ auxy = ncrossprod( axb, auxx );
+ axc = auxx*cosd(ac)+auxy*sind(ac);
+ draw zeror--rp(axa);
+ draw zeror--rp(axb);
+ draw zeror--rp(-0.6*axa);
+ draw zeror--rp(axc);
+ draw zeror--rp(auxx);
+ label.rt( btex $a$ etex scaled labscal, rp(axa) );
+ label.rt( btex $b$ etex scaled labscal, rp(axb) );
+ label.lft( btex $c$ etex scaled labscal, rp(auxx) );
+ label.lft( btex $d$ etex scaled labscal, rp(axc) );
+ angline( axa,red,black,angray,btex $\alpha_1$ etex scaled labscal,bot );
+ angline( axb,axa,black,angray,btex $\alpha_2$ etex scaled labscal,rt );
+ angline( axc,auxx,black,angray,btex $\alpha_3$ etex scaled labscal,lft );
+ squareangline( -axa,auxx,black,0.2);
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ kindofcube( false, true, black, aa, ab, ac, lena, lenb, lenc );
+ drawoptions();
+ dotlabel.bot( btex $\vec{o}$ etex scaled labscal, zeror );
+ label.bot( btex $l_1$ etex scaled labscal, rp(lena*axb) );
+ label.bot( btex $l_2$ etex scaled labscal, rp(0.5*lenb*axc) );
+ label.ulft( btex $l_3$ etex scaled labscal,rp(0.5*lenc*ncrossprod(axb,axc)));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/tug04/newexperimental.mp b/Master/texmf-dist/doc/metapost/featpost/example/tug04/newexperimental.mp
new file mode 100644
index 00000000000..bfacd32ae1f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/tug04/newexperimental.mp
@@ -0,0 +1,157 @@
+% newexperimental.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3D;
+%input featpost2D;
+
+%verbatimtex
+%\documentclass{article}
+%\usepackage{beton}
+%\usepackage{concmath}
+%\usepackage{ccfonts}
+%\begin{document}
+%etex
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+f := (4.5,-6,5);
+%f := (-4.5,-6,5);
+
+beginfig(1);
+ numeric len[], ray[];
+ color axe[], pos[], fix[], lab[];
+ color reflabpos, reflabpoi, lincolor;
+ picture txt[], dashpatt;
+ numeric inclang, aberang, sampang, stepang;
+ numeric squside, sqlevel, ul, outermagpos;
+ numeric innerray, polesep, fracone, fracsam;
+ numeric labelscale;
+ path tmpath, aupath, copath;
+
+ pickup pencircle scaled 1.2pt;
+ dashpatt = evenly scaled 3;
+ inclang = 150;
+ aberang = 17;
+ sampang = 30;
+ stepang = 20;
+ ul = 0.1;
+ labelscale = 5;
+ outermagpos = 30ul;
+ squside = outermagpos;
+ sqlevel = -20ul;
+ polesep = 15ul;
+ fracone = 0.33;
+ fracsam = 0.86;
+ ray1 = 10ul;
+ ray2 = 6ul;
+ ray3 = 8ul;
+ ray4 = 1.5ul;
+ ray5 = 4ul;
+ ray6 = 3ul;
+ ray7 = 3.5ul;
+ ray8 = 2ul;
+ len3 = 7ul;
+ len4 = 20ul;
+ len5 = 3ul;
+ len7 = 3.5ul;
+ len8 = 7ul;
+ lincolor = 0.5background;
+
+ reflabpos = ( -squside, 0, -sqlevel );
+ reflabpoi = ( -squside, squside, -sqlevel );
+ V1 := (squside,squside,-sqlevel);
+ V2 := (-squside,squside,-sqlevel);
+ V3 := (-squside,-squside,-sqlevel);
+ V4 := (squside,-squside,-sqlevel);
+% makeface1(1,2,3,4);
+% draw_all_test( false );
+
+ len1 = (1-fracone)*(outermagpos-ray5-polesep);
+ pos1 = (-outermagpos,0,0);
+ len2 = fracone*(outermagpos-ray5-polesep);
+ pos2 = (len1-outermagpos,0,0);
+ lab2 = reflabpos;
+ txt2 = thelabel.top( btex magnet etex scaled labelscale, rp( lab2 ) );
+ fix2 = (-outermagpos+0.5len1,0,ray1);
+ axe3 = ( 0, cosd( inclang ), sind( inclang ) );
+ pos3 = -( len3 + len4 + len5 )*axe3;
+ lab3 = (1-fracone)*reflabpoi+fracone*V1;
+ txt3 = thelabel.rt( btex rotor etex scaled labelscale, rp( lab3 ) );
+ axe4 = axe3;
+ pos4 = -( len4 + len5 )*axe4;
+ fix3 = pos4+fracsam*ray3*(0,cosd( inclang -90 ),sind( inclang -90 ));
+ axe5 = axe3;
+ pos5 = -( len5 )*axe5;
+ lab5 = (1-fracone)*reflabpoi+fracone*V2;
+ txt5 = thelabel.rt( btex sample etex scaled labelscale, rp(lab5) );
+ fix5 = fracsam*ray5*(0,cosd( inclang -90 ),sind( inclang -90 ));
+
+ V5 := fracsam*ray5*( sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ V6 := fracsam*ray5*( -sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ V8 := fracsam*ray5*( sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ V7 := fracsam*ray5*( -sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ axe6 = ( 0, cosd( inclang+aberang ), sind( inclang+aberang ) );
+ pos6 = ray1*axe6;
+ len6 = len4;
+ axe7 = ( 0, cosd( inclang-aberang ), sind( inclang-aberang ) );
+ pos7 = ( ray1 + 0.5len6 )*axe7;
+ lab6 = fracone*reflabpos+(1-fracone)*V3;
+ txt6=thelabel.lft(btex camera etex scaled labelscale,rp(lab6));
+ fix6 = pos6+len6*axe6;
+ pos8 = pos7+len7*axe7;
+ axe8 = axe7;
+ lab8 = (1-fracone)*reflabpos+fracone*V3;
+ txt8 = thelabel.lft( btex lamp etex scaled labelscale, rp( lab8 ) );
+ fix8 = pos8+len8*axe8;
+ len9 = len2;
+ pos9 = (ray5+polesep,0,0);
+ ray9 = ray2;
+ ray10 = ray1;
+ pos10 = pos9+len9*(1,0,0);
+ len10 = len1;
+
+ getready( "rigorousdisc( 0, true, pos1, ray1, len1*(1,0,0) )", pos1 );
+ getready( "whatisthis(pos2,ray1*green,ray1*blue,conorm((-ray5-polesep,0,0)-pos2),ray2/ray1)", pos2 );
+ getready( "rigorousdisc( 0, true, pos3, ray3, len3*axe3 )", pos3 );
+ getready( "rigorousdisc( 0, true, pos4, ray4, len4*axe4 )", pos4 );
+ getready( "rigorousdisc( 0, true, pos5, ray5, len5*axe5 )", pos5 );
+ getready( "draw rp(V5)--rp(V6)--rp(V7)--rp(V8)--cycle", black );
+ getready( "draw rp(pos6)--rp((0,0,0))--rp(pos7) dashed dashpatt",0.5*pos6);
+ getready( "rigorousdisc( 0, true, pos6, ray6, len6*axe6 )", pos6 );
+ getready( "whatisthis(pos7,ray7*red,-ray7*ncrossprod(red,axe7),conorm(pos8-pos7),ray8/ray7)", pos7 );
+ getready( "rigorousdisc( 0, true, pos8, ray8, len8*axe8 );", pos8 );
+ getready( "whatisthis(pos9,ray9*green,ray9*blue,conorm(pos10-pos9),ray10/ray9)", pos9 );
+ getready( "rigorousdisc( 0, true, pos10, ray10, len10*(1,0,0) )", pos10 );
+ doitnow;
+ draw llcorner txt2--lrcorner txt2--rp(fix2) withcolor lincolor;
+ draw lrcorner txt3--llcorner txt3--rp(fix3) withcolor lincolor;
+ draw lrcorner txt5--llcorner txt5--rp(fix5) withcolor lincolor;
+ draw llcorner txt6--lrcorner txt6--rp(fix6) withcolor lincolor;
+ draw llcorner txt8--lrcorner txt8--rp(fix8) withcolor lincolor;
+ draw txt2;
+ draw txt3;
+ draw txt5;
+ draw txt6;
+ draw txt8;
+
+ produce_auto_scale;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/tug04/perspec.mp b/Master/texmf-dist/doc/metapost/featpost/example/tug04/perspec.mp
new file mode 100644
index 00000000000..09efea9ab2f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/tug04/perspec.mp
@@ -0,0 +1,77 @@
+% perspec.mp
+% L. Nobre G.
+% 2004
+
+%input featpost3D;
+%input featpost2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+f := (4,2,2.5);
+Spread := 45;
+
+verbatimtex \documentclass{article} \begin{document} etex
+
+color psdf, psdu, psdv, rll, rlr, rur, rul, pll, plr, pur, pul;
+color pc;
+numeric projecplanesize, sizefraction, positfraction, aspectratio, rectsize;
+pen realpen, lightpen, projpen, dotpen;
+path projecplanepath, realpath;
+psdf = 3.1*(0,1,0.37);
+projecplanesize = 1.7;
+sizefraction = 0.19;
+positfraction = 0.65;
+aspectratio = 1.0;
+rectsize = 0.15;
+realpen = pencircle scaled 2.6pt;
+lightpen = pencircle scaled 0.55pt;
+projpen = pencircle scaled 1.8pt;
+dotpen = pencircle scaled 3.8pt;
+psdv = N( (-Y(psdf), X(psdf), 0) );
+psdu = ncrossprod( psdf, psdv );
+pll = projecplanesize*(-aspectratio*psdv-psdu);
+plr = projecplanesize*(+aspectratio*psdv-psdu);
+pur = projecplanesize*(+aspectratio*psdv+psdu);
+pul = projecplanesize*(-aspectratio*psdv+psdu);
+projecplanepath = rp(pll)--rp(plr)--rp(pur)--rp(pul)--cycle;
+pc = positfraction*psdf;
+rll = pc+sizefraction*projecplanesize*(-psdv-psdu);
+rlr = pc+sizefraction*projecplanesize*(+psdv-psdu);
+rur = pc+sizefraction*projecplanesize*(+psdv+psdu);
+rul = pc+sizefraction*projecplanesize*(-psdv+psdu);
+realpath = rp(rll)--rp(rlr)--rp(rur)--rp(rul)--cycle;
+
+beginfig(1);
+ draw projecplanepath withpen realpen;
+ draw realpath withpen realpen;
+ draw rp(psdf) withpen lightpen;
+ drawoptions( withpen lightpen );
+ squareangline( psdf, psdv, black, rectsize );
+ squareangline( psdf, psdu, black, rectsize );
+ drawoptions();
+ pair prll, prlr, prur, prul;
+ LightSource:=psdf;
+ prll = rp(projectpoint(black,rll));
+ prlr = rp(projectpoint(black,rlr));
+ prur = rp(projectpoint(black,rur));
+ prul = rp(projectpoint(black,rul));
+ path projpath;
+ projpath = prll--prlr--prur--prul--cycle;
+ draw projpath withpen projpen;
+ draw prll--rp(psdf) withpen lightpen;
+ draw prlr--rp(psdf) withpen lightpen;
+ draw prur--rp(psdf) withpen lightpen;
+ draw prul--rp(psdf) withpen lightpen;
+ draw rp(black)--rp(psdf) withpen lightpen;
+ draw rp(black) withpen dotpen;
+ draw rp(psdf) withpen dotpen;
+ label.rt( btex \texttt{f} etex, rp(psdf) );
+ label.bot( btex \texttt{viewcentr} etex, rp(black) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end; \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/tug04/planintersection.mp b/Master/texmf-dist/doc/metapost/featpost/example/tug04/planintersection.mp
new file mode 100644
index 00000000000..a3ab18237c4
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/tug04/planintersection.mp
@@ -0,0 +1,105 @@
+% planintersection.mp
+% L. Nobre G.
+% 2004
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ f := 0.5*(10,14,5.5);
+ color a, x, b, c, D, y, w, g, h;
+ color auxa, auxb, auxc, auxd, auxe, auxf;
+ pair appear;
+ numeric wid, hei, alfa, beta, forw, back, labscal;
+ pen thedotpen, borderpen, normalpen;
+ picture dasha, dashb, labx, laba, labb, labc, labD;
+ path outerb, innerb, apath, bpath;
+ wid = 1.5;
+ hei = 1;
+ forw = 1.5;
+ back = 1.5;
+ alfa = -10;
+ beta = -30;
+ labscal = 2.8;
+ labeloffset := 8pt;
+ ahangle := 30;
+ ahlength := 10pt;
+ a = ( 0.7*forw, 0.15*wid, 0.3*hei );
+ b = ( -0.7*back, 0.5*wid, 0.8*hei );
+ c = ( 0, 0.7*wid, 0.5*hei );
+ D = ( cosd( alfa )*cosd( beta ), sind( alfa )*cosd( beta ), sind( beta ) );
+ labx = btex $\vec{x}$ etex scaled labscal;
+ laba = btex $\vec{a}$ etex scaled labscal;
+ labb = btex $\vec{b}$ etex scaled labscal;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ labD = btex $\vec{D}$ etex scaled labscal;
+ thedotpen = pencircle scaled 4pt;
+ borderpen = pencircle scaled 2pt;
+ normalpen = pencircle scaled 1.5pt;
+ dasha = evenly scaled 2;
+% dashb = dashpattern( on 7pt off 5pt on 7pt );
+ dashb = withdots;
+ apath = rp((X(a),Y(a),0))--rp(a)--rp((X(a),0,Z(a)));
+ bpath = rp((X(b),Y(b),0))--rp(b)--rp((X(b),0,Z(b)));
+ auxa = ( forw, 0, 0 );
+ auxb = ( forw, 0, hei );
+ auxc = ( -back, 0, hei );
+ auxd = ( -back, 0, 0 );
+ auxe = ( -back, wid, 0 );
+ auxf = ( forw, wid, 0 );
+ outerb = rp(auxa)--rp(auxb)--rp(auxc)--rp(auxd)--rp(auxe)--rp(auxf)--cycle;
+ draw outerb withpen borderpen;
+ draw rp(auxa)--rp(auxd) withpen borderpen;
+
+ draw bpath dashed dasha withpen normalpen;
+ draw rp(b) withpen thedotpen;
+ label.top( labb, rp(b) );
+
+ draw rp(a)--rp(b) withpen normalpen;
+
+ cdotprod( y-c, D ) = 0;
+ cdotprod( y-black, green ) = 0;
+ cdotprod( y-black, blue ) = 0;
+
+ cdotprod( w-c, D ) = 0;
+ cdotprod( w-black, green ) = 0;
+ cdotprod( w-hei*blue, blue ) = 0;
+
+ cdotprod( g-c, D ) = 0;
+ cdotprod( g-wid*green, green ) = 0;
+ cdotprod( g-hei*blue, blue ) = 0;
+
+ cdotprod( h-c, D ) = 0;
+ cdotprod( h-wid*green, green ) = 0;
+ cdotprod( h-black, blue ) = 0;
+
+ innerb = rp(y)--rp(w)--rp(g)--rp(h)--cycle;
+ unfill innerb;
+ draw innerb withpen borderpen;
+
+ draw apath dashed dasha withpen normalpen;
+ draw rp(a) withpen thedotpen;
+ label.top( laba, rp(a) );
+
+ x = whatever[a,b];
+ cdotprod( x-c, D ) = 0;
+ draw rp(x) withpen thedotpen;
+ label.top( labx, rp(x) );
+
+ draw rp(a)--rp(x) withpen normalpen;
+ draw rp(x)--rp(b) withpen normalpen dashed dashb;
+
+ draw rp(c) withpen thedotpen;
+ drawarrow rp(c)--rp(c+0.7*D) withpen borderpen;
+ label.top( labc, rp(c) );
+
+ label.bot( labD, rp(c+0.5*D) );
+
+ draw rp(x)--rp(c) dashed dasha withpen normalpen;
+ drawoptions( withpen normalpen );
+ squareangline( x, c+D, c, 0.08*wid );
+
+endfig;
+
+verbatimtex }\end{document} etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/tug04/revolvers.mp b/Master/texmf-dist/doc/metapost/featpost/example/tug04/revolvers.mp
new file mode 100644
index 00000000000..41fd7a9c4e2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/tug04/revolvers.mp
@@ -0,0 +1,112 @@
+% revolvers.mp
+% L. Nobre G.
+% 2004
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+def posang( expr Angul ) =
+ rp( green*cosd( Angul ) + blue*sind( Angul ) )
+enddef;
+
+beginfig(1);
+ f := (3,5,4);
+ numeric labscal;
+ picture labr, labc, laba, labum, labdo, labtr, labqu, labci;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labr = btex $R$ etex scaled labscal;
+ labum= btex 1 etex scaled labscal;
+ labdo= btex 2 etex scaled labscal;
+ labtr= btex 3 etex scaled labscal;
+ labqu= btex 4 etex scaled labscal;
+ labci= btex 5 etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ tropicalglobe( 5, black, 1, blue );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(red);
+ label.top( labr, rp((0.5,0,0)) );
+ drawarrow rp(black)--rp(blue);
+ label.rt( laba, rp((0,0,0.5)) );
+ dotlabel.lrt( labc, rp(black) );
+ dotlabel.rt( labum, posang(-72) );
+ dotlabel.top( labdo, posang(-36) );
+ dotlabel.top( labtr, posang(0) );
+ dotlabel.top( labqu, posang(36) );
+ dotlabel.top( labci, posang(72) );
+endfig;
+
+beginfig(2);
+ f := (3,5,5.7);
+ numeric labscal;
+ picture labri, labc, laba, labro;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labri= btex $R_i$ etex scaled labscal;
+ labro= btex $R_o$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ rigorousdisc( 0.5, true, black, 1, 0.85*blue );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(red);
+ label.lrt( labro, rp(0.5*red) );
+ drawdblarrow rp(black+0.85*blue)--rp(0.5*green+0.85*blue);
+ label.urt( labri, rp(0.25*green+0.85*blue) );
+ drawarrow rp(black)--rp(0.85*blue);
+ label.ulft( laba, rp((0,0,0.5)) );
+ dotlabel.rt( labc, rp(black) );
+endfig;
+
+beginfig(3);
+ f := (3,2.05,2.65);
+ numeric labscal, bray, sray;
+ picture labrb, labc, laba, labrs;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ bray = 0.7;
+ sray = 0.4;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labrb= btex $R_b$ etex scaled labscal;
+ labrs= btex $R_s$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ smoothtorus( black, blue, bray, sray );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ draw goodcirclepath( bray*red, green, sray ) dashed evenly;
+ drawdblarrow rp(black)--rp(bray*red);
+ label.ulft( labrb, rp(0.5*bray*red) );
+ drawdblarrow rp(bray*red+sray*blue)--rp(bray*red);
+ label.llft( labrs, rp(bray*red+0.5*sray*blue) );
+ drawarrow rp(black)--rp(sray*blue);
+ label.rt( laba, rp((0,0,0.5*sray)) );
+ dotlabel.lrt( labc, rp(black) );
+endfig;
+
+beginfig(4);
+ f := (3,5,4);
+ numeric labscal;
+ picture labr, labc, laba;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labr = btex $R$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ spatialhalfsfear( black, blue, 1 );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(red);
+ label.ulft( labr, rp(0.5*red) );
+ drawarrow rp(black)--rp(0.4*blue);
+ label.rt( laba, rp((0,0,0.2)) );
+ dotlabel.lrt( labc, rp(black) );
+endfig;
+
+verbatimtex }\end{document} etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/tug04/tangency2D.mp b/Master/texmf-dist/doc/metapost/featpost/example/tug04/tangency2D.mp
new file mode 100644
index 00000000000..8682c43bc0d
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/tug04/tangency2D.mp
@@ -0,0 +1,56 @@
+% intersection2D.mp
+% L. Nobre G.
+% 2004
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ numeric u, r, d;
+ pair Aa, Ab, Ba, Bb, Ca, Cb, Da, Db, Ea, Eb, Or, Kn;
+ pen dotpen, penpen;
+ color knowncolour, notknowncol;
+ picture kn, un, rl;
+ u = 4mm;
+ Aa = (5u,4u);
+ Ab = (3u,2u);
+ Ba = (13u,5u);
+ Bb = 0.5[Aa,Ab];
+ r = abs( Aa - Ab );
+ d = abs( Aa - Ba ) +-+ r;
+ Ea = radialcross( Aa, r, Ba, d, true );
+ Eb = radialcross( Aa, r, Ba, d, false );
+ Ca = 1.4[Ba,Ea];
+ Cb = 1.15[Ea,Ba];
+ Da = 1.5[Ba,Eb];
+ Db = 1.1[Eb,Ba];
+ Kn = (0,1u);
+ Or = (10u,1u);
+ dotpen = pencircle scaled 0.5u;
+ penpen = pencircle scaled 0.2u;
+ knowncolour = blue;
+ notknowncol = red;
+ kn = btex given etex;
+ un = btex unknown etex;
+ rl = btex $R$ etex;
+ draw fullcircle scaled 2r shifted Aa;
+ draw Ca--Cb;
+ draw Da--Db dashed evenly;
+ drawarrow Aa--Ab;
+ drawoptions( withpen dotpen withcolor knowncolour );
+ draw Aa;
+ draw Ba;
+ draw Kn+Or;
+ drawoptions( withcolor knowncolour );
+ label.ulft( rl, Bb );
+ drawoptions( withpen dotpen withcolor notknowncol );
+ draw Ea;
+ draw Eb;
+ draw Or;
+ drawoptions();
+ label.rt( kn, Kn+Or );
+ label.rt( un, Or );
+endfig;
+
+verbatimtex }\end{document} etex
+
+end;
diff --git a/Master/texmf-dist/doc/metapost/featpost/galrey/galrey.rc b/Master/texmf-dist/doc/metapost/featpost/galrey/galrey.rc
new file mode 100644
index 00000000000..c73971b5950
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/galrey/galrey.rc
@@ -0,0 +1,75 @@
+########################################################################
+# #
+# This is the configuration file for Galrey #
+# every line beginning with '#' will be discarded (they are comments) #
+# Carefully read every comment before each parameter #
+# ##########
+# Copyright 2001, Claudio Cicali # Galrey #
+# # 0.5 #
+#################################################################################
+
+# TITLE: used as the html <title> ad as ashort description at the bottom of the html files
+# default: "My Galrey pictures collection"
+title = FeatPost Example Collection
+
+# PATTERN: only the files that match this patters are processed
+# default: "*.jpg"
+pattern=*.png
+
+# THUMBSIZE: desidered size XxY of the generated thumbnails
+# default: 80x60 (this is scaled based upon a 640x480 full size)
+thumbsize=140x140
+
+# THUMBPREFIX: desidered prefix of the thumbnails filename
+# default: "t_"
+thumbprefix=t_
+
+# THUMBSPERROW: how many thumbnails in each row of the index file
+# default: 5
+thumbsperrow=6
+
+# INDEX: name of the (generated) index file. Used also in the html file
+# default: "index.html"
+# index=galreyindex.html
+
+# GENERATEDEXT: the extension the generated html files will have
+# Galrey will generate an html file for each image in the
+# collection. This is the extension they will have
+# default: html
+generatedext=html
+
+# IMAGESPATH: the directory where the images reside (do not add the final '/')
+# default: "."
+imagespath=../galreyimages
+
+# OUTPUTPATH: the directory where the generated file will be placed
+# default: "."
+outputpath=../galreyimages
+
+# TEMPLATE: the name and location of the template file to use
+# default: "./galrey.tpl"
+template=galrey.tpl
+
+# SHOWINFO: this enables (or disable) the visualization of some image informations.
+# This information will be displayed under each images thumbnail in
+# the form : [width x height] imagesize
+# default: yes
+showinfo=no
+
+# MEMOFILE: if set, galrey will read a description for each image from the
+# specified file and will put it into the relative html file in
+# corrispondence of the $DESCRIPTION$ special tag.
+# The file must be builded respecting the following syntax:
+# for each image, add a line containing the imagename, a space, and a description
+# (as long as you like)
+# Example (an entry for an image called garden.jpg):
+# garden.jpg My beautiful garden full of flowers !
+#
+# Note: you can build a file in this way, simply running the following
+# command in the dir containing your images:
+# ls *.jpg > galrey.nfo
+# Than edit the galrey.nfo adding the comments on the right of each image listed
+# The list sorting order is not relevant
+# default: not set
+memofile=galrey.memo
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/galrey/galrey.sh b/Master/texmf-dist/doc/metapost/featpost/galrey/galrey.sh
new file mode 100644
index 00000000000..0cfee78ddce
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/galrey/galrey.sh
@@ -0,0 +1,6 @@
+ls ../galreyimages/ > ./galrey.ls
+dog -b ./galrey.ls > galrey.nms
+sed -e 's/.png//' galrey.nms > galrey.fn
+join -o 1.2,2.2 galrey.nms galrey.fn > galrey.memo
+galrey
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/galrey/galrey.tpl b/Master/texmf-dist/doc/metapost/featpost/galrey/galrey.tpl
new file mode 100644
index 00000000000..df414141291
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/galrey/galrey.tpl
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>$TITLE$</title>
+<style type="text/css">
+<!--
+.title {color: #CCCC00; font-family: Verdana, Arial; font-size: 16pt; font-weight: bold}
+.counter {color: #ffffcc; font-family: Verdana, Arial; font-size: 11pt; font-weight: bold}
+.nav {color: #CC9900; font-family: Verdana, Arial; font-size: 14pt; font-weight: normal; text-decoration: none}
+.nav:Hover {color: #CCCC00; font-family: Verdana, Arial; font-size: 14pt; font-weight: normal; text-decoration: underline}
+.memo {color: #ffffcc; font-family: Verdana, Arial; font-size: 10pt; font-weight: normal}
+-->
+</style>
+</head>
+
+<body bgcolor="#330066">
+<div align="center">
+<table cellpadding="0" cellspacing="0" width="600">
+<tr>
+<td>
+<a class="nav" href="$FIRST$">|&lt;</a>&nbsp;&nbsp;
+<a class="nav" href="$PREVIOUS$">&lt;&lt;</a>&nbsp;&nbsp;
+<a class="nav" href="$INDEX$">O</a>&nbsp;&nbsp;
+<a class="nav" href="$NEXT$">&gt;&gt;</a>&nbsp;&nbsp;
+<a class="nav" href="$LAST$">&gt;|</a>
+</td>
+<td>
+<div class="counter">$ID$/$TOTAL$</div>
+</td>
+<td align="right"><div class="title"><b>$TITLE$</b></div></td>
+</tr>
+</table>
+<br>
+<table cellpadding="3" cellspacing="0" bgcolor="#FFFFFF">
+<tr><td><img alt="imagefile: $CURRENT$" WIDTH="$WIDTH$" HEIGHT="$HEIGHT$" border="0" src="../galreyimages/$CURRENT$"></td></tr>
+</table>
+</div>
+<br>
+<div class="memo" align="center">$DESCRIPTION$</div>
+</body>
+</html>
diff --git a/Master/texmf-dist/doc/metapost/featpost/jpeg/cbxSmall.jpg b/Master/texmf-dist/doc/metapost/featpost/jpeg/cbxSmall.jpg
new file mode 100644
index 00000000000..d7291c3fbeb
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/jpeg/cbxSmall.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/jpeg/hiddenlinegraph1.jpg b/Master/texmf-dist/doc/metapost/featpost/jpeg/hiddenlinegraph1.jpg
new file mode 100644
index 00000000000..23f081024af
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/jpeg/hiddenlinegraph1.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/jpeg/mymetapostbackground.jpeg b/Master/texmf-dist/doc/metapost/featpost/jpeg/mymetapostbackground.jpeg
new file mode 100644
index 00000000000..14a6feecaf8
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/jpeg/mymetapostbackground.jpeg
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/jpeg/mymetapostclearback.jpeg b/Master/texmf-dist/doc/metapost/featpost/jpeg/mymetapostclearback.jpeg
new file mode 100644
index 00000000000..03a47cb2efe
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/jpeg/mymetapostclearback.jpeg
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/jpeg/par3Dplotexamples1.jpg b/Master/texmf-dist/doc/metapost/featpost/jpeg/par3Dplotexamples1.jpg
new file mode 100644
index 00000000000..cf12c9a6c73
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/jpeg/par3Dplotexamples1.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/jpeg/par3Dplotexamples2.jpg b/Master/texmf-dist/doc/metapost/featpost/jpeg/par3Dplotexamples2.jpg
new file mode 100644
index 00000000000..4eb188916c9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/jpeg/par3Dplotexamples2.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/jpeg/planpau2.jpeg b/Master/texmf-dist/doc/metapost/featpost/jpeg/planpau2.jpeg
new file mode 100644
index 00000000000..4e357099980
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/jpeg/planpau2.jpeg
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/latex/linuxdoc-sgml.sty b/Master/texmf-dist/doc/metapost/featpost/latex/linuxdoc-sgml.sty
new file mode 100644
index 00000000000..a8ad9ad41e3
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/latex/linuxdoc-sgml.sty
@@ -0,0 +1,117 @@
+%% This is linuxdoc-sgml.sty, for use with SGML-generated LaTeX
+%% by Matt Welsh (mdw@sunsite.unc.edu)
+%%
+%% $Id: linuxdoc-sgml.sty,v 1.8 1998/05/14 20:06:13 cg Exp $
+%%
+%% Based on linuxdoc.sty by Michael K. Johnson, and latex.tex by
+%% Leslie Lamport. MODIFIED BY L. NOBRE G. TO BE USED IN TUGBOAT
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{linuxdoc-sgml}
+
+%%% GLOBAL LAYOUT THINGS
+
+%\marginparwidth 0.0 in
+%\parindent 0.0 in
+%\topmargin -0.5 in
+%\setlength{\textheight}{\paperheight}
+%\addtolength{\textheight}{-2 in}
+%\advance\headsep 2 ex
+%\advance\textheight -2 ex
+%\renewcommand{\baselinestretch}{1.14}
+%\addtolength{\parskip}{1.2 ex}
+
+%%% ONE-SIDED/TWO-SIDED DEPENDENCIES
+
+%\if@twoside % ``book'' style was chosen
+% \oddsidemargin 0.0 in
+% \evensidemargin 0 in
+% \textwidth 6 in
+% \def\ps@headings{\let\@mkboth\markboth
+% \def\@oddfoot{}\def\@evenfoot{}% No feet.
+% \def\@evenhead{\protect\rule[-4pt]{\textwidth}{.5pt}\kern-\textwidth
+% \rm \thepage\hfil \bf \leftmark} % Left heading.
+% \def\@oddhead{\protect\rule[-4pt]{\textwidth}{.5pt}\kern-\textwidth
+% {\bf \rightmark}\hfil \rm\thepage} % Right heading.
+% \def\chaptermark##1{\markboth {{\ifnum \c@secnumdepth >\m@ne
+% \@chapapp\ \thechapter. \ \fi ##1}}{}}%
+% \def\sectionmark##1{\markright {{\ifnum \c@secnumdepth >\z@
+% \thesection. \ \fi ##1}}}}
+
+%\else % if not book style, then
+% \oddsidemargin 0.0 in
+% \evensidemargin\oddsidemargin
+% \textwidth 6.5 in
+% \def\ps@headings{\let\@mkboth\markboth
+% \def\@oddfoot{}\def\@evenfoot{}% No feet.
+% \def\@oddhead{\protect\rule[-4pt]{\textwidth}{.5pt}\kern-\textwidth
+% {\bf \rightmark}\hfil \rm\thepage} % Right heading.
+% \def\@evenhead\@oddhead
+% \def\chaptermark##1{\markboth {{\ifnum \c@secnumdepth >\m@ne
+% \@chapapp\ \thechapter. \ \fi ##1}}{}}%
+% \def\sectionmark##1{\markright {{\ifnum \c@secnumdepth >\z@
+% \thesection. \ \fi ##1}}}}
+
+%\fi
+
+%% Titlepage stuff
+
+\gdef\@title{}
+\gdef\title#1{\gdef\@title{#1}}
+\gdef\@date{}
+\gdef\date#1{\gdef\@date{#1}}
+\gdef\@author{}
+\gdef\author#1{\gdef\@author{#1}}
+\gdef\@abstract{}
+\gdef\abstract#1{\gdef\@abstract{#1}}
+
+\def\maketitle{\thispagestyle{empty}\let\footnotesize\small%
+\let\footnoterule\relax
+%\setcounter{page}{0}%
+%\null
+%\vskip 3 in
+\noindent
+{\huge\sf \@title}\\
+%\rule{\textwidth}{1mm}\\ %%%%%%%%%%%%%%%%%%%%%% MAIN MODIFICATION
+\mbox{}\@author\ \hfill \@date\ \\
+\vskip 1 ex
+\noindent{\sf \@abstract}
+\setcounter{footnote}{0}%
+\gdef\@author{}\gdef\@title{}\gdef\@years{}\gdef\@abstract{}
+\let\maketitle\relax}
+
+%% Needs to be here for the previous ps@headings defs to work.
+\pagestyle{headings}
+
+%%% USEFUL MACROS
+
+\newcommand{\linux}{Linux} % Always use this when
+ % refering to the \linux\
+ % operating system, like that.
+\newcommand{\key}[1]{{\fbox{\small\tt #1}}} % Use this to mark keys, like
+ % \key{del} for the delete key.
+\newcommand{\ret}{\fbox{\sf return}} % Special case for the return key.
+\newcommand{\st}{\small\tt} % Small typewriter -- comes in handy.
+%\newcommand{\lb}{{\tt\char '173}} % Left Brace '{'
+%\newcommand{\rb}{{\tt\char '175}} % Right Brace '}'
+\newcommand{\lbr}{$\langle$} % Left Bracket '<'
+\newcommand{\rbr}{$\rangle$} % Right Bracket '>'
+\newcommand{\bs}{{\tt\char '134}} % BackSlash '\'
+\newcommand{\tm}{${}^{\mbox{\tiny\sf TM}}$}
+\newcommand{\TM}{\tm} % TM trademark symbol in
+ % either case
+\newcommand{\cparam}[1]{{\rm \lbr{\sl #1}\rbr}}
+ % Metavariables.
+
+%% Define NAMEURL macro to handle the optional name argument
+%% This calls on the \url macro from the url.sty package so the
+%% URL will be hyphenated correctly.
+\def\nameurl#1#2{{\em #2} {\tt <\url{#1}>}}
+\def\onlynameurl#1{{\em #1}}
+
+%% the tscreen environment automatically goes into typewriter type,
+%% but is otherwise like the screen environment
+
+\newenvironment{tscreen}%
+ {\begin{quote}\bgroup\small\tt}%
+ {\egroup\end{quote}}
diff --git a/Master/texmf-dist/doc/metapost/featpost/latex/logofeatpost.tex b/Master/texmf-dist/doc/metapost/featpost/latex/logofeatpost.tex
new file mode 100644
index 00000000000..b7c852c4b5c
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/latex/logofeatpost.tex
@@ -0,0 +1,18 @@
+\documentclass{article}
+\newfont{\normald}{logod10 scaled 10000}
+\usepackage{graphics,color}
+%\setlength{\textwidth}{724pt}
+%\setlength{\oddsidemargin}{-5.4mm}
+%\setlength{\textheight}{57mm}
+%\setlength{\topmargin}{-4mm}
+%\setlength{\headheight}{5mm}
+%\setlength{\headsep}{2mm}
+%\setlength{\footskip}{2\baselineskip}
+\pagestyle{empty}
+\begin{document}
+\fcolorbox{white}{white}{
+ \begin{tabular}{l}
+ {\normald FEATPOST}
+ \end{tabular}
+ }
+\end{document}
diff --git a/Master/texmf-dist/doc/metapost/featpost/latex/ltugboat.cls b/Master/texmf-dist/doc/metapost/featpost/latex/ltugboat.cls
new file mode 100644
index 00000000000..cc0ad276d09
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/latex/ltugboat.cls
@@ -0,0 +1,1225 @@
+%%
+%% This is file `ltugboat.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tugboat.dtx (with options: `latex,classtop,common,classtail,latex2e,ltugboatcls')
+%%
+%% Copyright (C) 1994,1995,1996 TeX Users Group
+%% All rights reserved.
+%%
+%% This file is part of the tugboat package.
+%% -----------------------------------------
+%%
+%% This is a generated file. Permission is granted to customize the
+%% declarations in this file to serve the needs of your installation.
+%% However, no permission is granted to distribute a modified version of
+%% this file under its original name.
+%%
+%%
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesClass {ltugboat}
+ [1998/09/10 v1.4r
+ TUGboat journal class%
+ ]
+\csname tugstyloaded@\endcsname
+\def\tugstyloaded@{\tugstyinit\endinput}
+\providecommand{\@tugclass}{ltugboat}
+\def\TBInfo{\ClassInfo{\@tugclass}}
+\def\TBError{\ClassError{\@tugclass}}
+\def\TBWarning{\ClassWarning{\@tugclass}}
+\newif\ifpreprint
+\def\preprint{\preprinttrue}
+\DeclareOption{draft}{%
+ \AtEndOfClass{%
+ \setcounter{page}{1001}%
+ \BlackBoxes
+ \def\MakeRegistrationMarks{}%
+ \PrelimDrafttrue
+ }%
+}
+\DeclareOption{preprint}{%
+ \preprinttrue
+}
+\DeclareOption{final}{%
+ \AtEndOfClass{%
+ \UseTrimMarks
+ \NoBlackBoxes
+ \PrelimDraftfalse
+ }%
+}
+\DeclareOption{11pt}{%
+ \TBWarning{The \@tugclass\space class only supports 10pt fonts:
+ \MessageBreak option \CurrentOption\space ignored}%
+}
+\DeclareOption{12pt}{\csname ds@11pt\endcsname}
+\DeclareOption{oneside}{\TBWarning{Option \CurrentOption\space ignored}}
+\DeclareOption{twoside}{\ds@oneside}
+\DeclareOption{onecolumn}{\ds@oneside}
+\DeclareOption{twocolumn}{\ds@oneside}
+\DeclareOption{tugproc}{%
+ \TBWarning{Option \CurrentOption\space ignored: use class ltugproc
+ instead of \@tugclass}%
+}
+\DeclareOption{rawcite}{\let\if@Harvardcite\iffalse}
+\DeclareOption{harvardcite}{\let\if@Harvardcite\iftrue}
+\DeclareOption{extralabel}{\let\UseExtraLabel\@firstofone}
+\DeclareOption{noextralabel}{\let\UseExtraLabel\@gobble}
+\DeclareOption{numbersec}{\let\if@numbersec\iftrue}
+\DeclareOption{nonumber}{\let\if@numbersec\iffalse}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+\ExecuteOptions{draft,extralabel,numbersec,rawcite}
+\ProcessOptions
+\LoadClass[twoside]{article}
+\def\sectitlefont{\fontfamily\sfdefault\fontseries{bx}\fontshape{n}%
+ \fontsize\@xviipt\stbaselineskip\selectfont}
+\def\tensl{\fontseries{m}\fontshape{sl}\fontsize\@xpt\@xiipt
+ \selectfont}
+\def\EdNoteFont{\fontfamily{cmr}\fontseries{m}\fontshape{ui}%
+ \fontsize\@xpt\@xiipt\selectfont}
+\IfFileExists{mflogo.sty}%
+ {\RequirePackage{mflogo}}%
+ {\TBWarning
+ {Package mflogo.sty not available --\MessageBreak
+ Proceeding to emulate mflogo.sty}
+ \DeclareRobustCommand\logofamily{%
+ \not@math@alphabet\logofamily\relax
+ \fontencoding{U}\fontfamily{logo}\selectfont}
+ \DeclareTextFontCommand{\textlogo}{\logofamily}
+ \def\MF{\textlogo{META}\-\textlogo{FONT}\@}
+ \def\MP{\textlogo{META}\-\textlogo{POST}\@}
+ \DeclareFontFamily{U}{logo}{}
+ \DeclareFontShape{U}{logo}{m}{n}{%
+ <8><9>gen*logo%
+ <10><10.95><12><14.4><17.28><20.74><24.88>logo10%
+ }{}
+ \DeclareFontShape{U}{logo}{m}{sl}{%
+ <8><9>gen*logosl%
+ <10><10.95><12><14.4><17.28><20.74><24.88>logosl10%
+ }{}
+ \DeclareFontShape{U}{logo}{m}{it}{%
+ <->ssub*logo/m/sl%
+ }{}%
+ }
+\def\makeescape#1{\catcode`#1=\z@}
+\def\makebgroup#1{\catcode`#1=\@ne}
+\def\makeegroup#1{\catcode`#1=\tw@}
+\def\makemath #1{\catcode`#1=\thr@@}
+\def\makealign #1{\catcode`#1=4 }
+\def\makeeol #1{\catcode`#1=5 }
+\def\makeparm #1{\catcode`#1=6 }
+\def\makesup #1{\catcode`#1=7 }
+\def\makesub #1{\catcode`#1=8 }
+\def\makeignore#1{\catcode`#1=9 }
+\def\makespace #1{\catcode`#1=10 }
+\def\makeletter#1{\catcode`#1=11 }
+\chardef\other=12
+\let\makeother\@makeother
+\def\makeactive#1{\catcode`#1=13 }
+\def\makecomment#1{\catcode`#1=14 }
+\def\savecat#1{%
+ \expandafter\xdef\csname\string#1savedcat\endcsname{\the\catcode`#1}}
+\def\restorecat#1{\catcode`#1=\csname\string#1savedcat\endcsname}
+\def\SaveCS#1{\expandafter\let\csname saved@@#1\expandafter\endcsname
+ \csname#1\endcsname}
+\def\RestoreCS#1{\expandafter\let\csname#1\expandafter\endcsname
+ \csname saved@@#1\endcsname}
+\def\plaintubstyle{plain}
+\def\latextubstyle{latex}
+\providecommand\hb@xt@{\hbox to}
+\providecommand\textsuperscript[1]{\ensuremath{\m@th
+ ^{\mbox{\fontsize\sf@size\z@
+ \selectfont #1}}}}
+\def\AllTeX{(\La\kern-.075em)\kern-.075em\TeX}
+\def\AMS{American Mathematical Society}
+\def\AmS{$\mathcal{A}$\kern-.1667em\lower.5ex\hbox
+ {$\mathcal{M}$}\kern-.125em$\mathcal{S}$}
+\def\AmSLaTeX{\AmS-\LaTeX}
+\def\AmSTeX{\AmS-\TeX}
+\def\aw{A\kern.1em-W}
+\def\AW{Addison\kern.1em-\penalty\z@\hskip\z@skip Wesley}
+\def\BibTeX{\textsc{Bib}\kern-.08em\TeX}
+\def\CandT{\textsl{Computers \& Typesetting}}
+\def\CTAN{\acro{CTAN}}
+\def\DTD{\acro{DTD}}
+\def\DVItoVDU{DVIto\kern-.12em VDU}
+\DeclareRobustCommand\eTeX{\ensuremath{\varepsilon}-\kern-.125em\TeX}
+\def\HTML{\acro{HTML}}
+\def\ISBN{\acro{ISBN}}
+\def\ISSN{\acro{ISSN}}
+\def\JTeX{\leavevmode\hbox{\lower.5ex\hbox{J}\kern-.18em\TeX}}
+\def\JoT{\textsl{The Joy of \TeX}}
+\def\LAMSTeX{L\raise.42ex\hbox{\kern-.3em
+ $\m@th$\fontsize\sf@size\z@\selectfont
+ $\m@th\mathcal{A}$}%
+ \kern-.2em\lower.376ex\hbox{$\m@th\mathcal{M}$}\kern-.125em
+ {$\m@th\mathcal{S}$}-\TeX}
+\newcommand{\La}%
+ {L\kern-.36em
+ {\setbox0\hbox{T}%
+ \vbox to\ht0{\hbox{$\m@th$%
+ \csname S@\f@size\endcsname
+ \fontsize\sf@size\z@
+ \math@fontsfalse\selectfont
+ A}%
+ \vss}%
+ }}
+\def\Mc{\setbox\TestBox=\hbox{M}M\vbox
+ to\ht\TestBox{\hbox{c}\vfil}} % for Robert McGaffey
+\def\mf{\textsc{Metafont}}
+\def\MFB{\textsl{The \MF book}}
+\let\TB@@mp\mp
+\DeclareRobustCommand\mp{\ifmmode\TB@@mp\else MetaPost\fi}
+\DeclareTextSymbol{\textohm}{OT1}{'012}
+\DeclareTextSymbolDefault{\textohm}{OT1}
+\newcommand\OMEGA{\textohm}
+\DeclareRobustCommand{\OTP}{\OMEGA\acro{TP}}
+\def\mtex{T\kern-.1667em\lower.424ex\hbox{\^E}\kern-.125emX\@}
+\DeclareRobustCommand\NTS{$\mathcal{N}$\lower.5ex\hbox
+ {$\mathcal{T}$}$\mathcal{S}$\@}
+\def\pcMF{\leavevmode\raise.5ex\hbox{p\kern-.3\p@ c}MF\@}
+\def\PCTeX{PC\thinspace\TeX}
+\def\pcTeX{\leavevmode\raise.5ex\hbox{p\kern-.3\p@ c}\TeX}
+\def\Pas{Pascal}
+\def\PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC\@}
+\def\PiCTeX{\PiC\kern-.11em\TeX}
+\def\plain{\texttt{plain}}
+\def\POBox{P.\thinspace O.~Box }
+\def\PS{{Post\-Script}}
+\def\SC{Steering Committee}
+\def\SGML{\acro{SGML}}
+\def\SliTeX{\textrm{S\kern-.06em\textsc{l\kern-.035emi}%
+ \kern-.06em\TeX}}
+ \def\slMF{\textsl{\MF}} % should never be used
+ \def\stTeX{\textsc{st}\kern-0.13em\TeX}
+\def\TANGLE{\texttt{TANGLE}\@}
+\def\TB{\textsl{The \TeX book}}
+\def\TP{\textsl{\TeX}: \textsl{The Program}}
+\DeclareRobustCommand\TeX{T\kern-.1667em\lower.424ex\hbox{E}\kern-.125emX\@}
+\def\TeXhax{\TeX hax}
+\def\TeXMaG{\TeX M\kern-.1667em\lower.5ex\hbox{A}%
+ \kern-.2267emG\@}
+\def\TeXtures{\textit{Textures}}
+\let\Textures=\TeXtures
+\def\TeXXeT{\TeX-{}-\XeT}
+\def\ttn{\textsl{TTN}\@}
+\def\TTN{\textsl{\TeX{} and TUG News}}
+\let\texttub\textsl % redefined in other situations
+\def\TUB{\texttub{TUGboat}}
+\def\TUG{\TeX\ \UG}
+\def\tug{\acro{TUG}}
+\def\UG{Users Group}
+\def\UNIX{\acro{UNIX}}
+\def\VAX{V\kern-.12em A\kern-.1em X\@}
+\def\VorTeX{V\kern-2.7\p@\lower.5ex\hbox{O\kern-1.4\p@ R}\kern-2.6\p@\TeX}
+\def\XeT{X\kern-.125em\lower.424ex\hbox{E}\kern-.1667emT\@}
+\def\WEB{\texttt{WEB}\@}
+\def\WEAVE{\texttt{WEAVE}\@}
+\newlinechar=`\^^J
+\normallineskiplimit=\p@
+\clubpenalty=10000
+\widowpenalty=10000
+\def\NoParIndent{\parindent=\z@}
+\newdimen\normalparindent
+\normalparindent=20\p@
+\def\NormalParIndent{\global\parindent=\normalparindent}
+\NormalParIndent
+\def\BlackBoxes{\overfullrule=5\p@}
+\def\NoBlackBoxes{\overfullrule=\z@}
+\def\newline{\hskip\z@\@plus\pagewd\break}
+\edef\allowhyphens{\noexpand\hyphenpenalty\the\hyphenpenalty\relax
+ \noexpand\exhyphenpenalty\the\exhyphenpenalty\relax}
+\def\nohyphens{\hyphenpenalty\@M\exhyphenpenalty\@M}
+\newbox\T@stBox \newbox\TestBox
+\newcount\T@stCount \newcount\TestCount
+\newdimen\T@stDimen \newdimen\TestDimen
+\newif\ifT@stIf \newif\ifTestIf
+\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax }
+\newif\iftop@ \newif\ifbot@
+\def\topsmash{\top@true\bot@false\smash@}
+\def\botsmash{\top@false\bot@true\smash@}
+\def\smash{\top@true\bot@true\smash@}
+\def\smash@{\relax\ifmmode\def\next{\mathpalette\mathsm@sh}%
+ \else\let\next\makesm@sh\fi \next }
+\def\finsm@sh{\iftop@\ht\z@\z@\fi\ifbot@\dp\z@\z@\fi\box\z@}
+\long\def\ulap#1{\vbox to \z@{\vss#1}}
+\long\def\dlap#1{\vbox to \z@{#1\vss}}
+\def\xlap#1{\hb@xt@\z@{\hss#1\hss}}
+\long\def\ylap#1{\vbox to \z@{\vss#1\vss}}
+\long\def\zlap#1{\ylap{\xlap{#1}}}
+\def\basezero{\baselineskip\z@skip \lineskip\z@skip}
+\def\nullhrule{\hrule \@height\z@ \@depth\z@ \@width\z@ }
+\def\nullvrule{\vrule \@height\z@ \@depth\z@ \@width\z@ }
+\def\makestrut[#1;#2]{\vrule \@height#1 \@depth#2 \@width\z@ }
+\def\drawoutlinebox[#1;#2;#3]{\T@stDimen=#3
+ \vbox to#1{\hrule \@height\T@stDimen \@depth\z@
+ \vss\hb@xt@#2{\vrule \@width\T@stDimen
+ \hfil\makestrut[#1;\z@]%
+ \vrule \@width\T@stDimen}\vss
+ \hrule \@height\T@stDimen \@depth\z@}}
+\newcount\hours
+\newcount\minutes
+\def\SetTime{\hours=\time
+ \global\divide\hours by 60
+ \minutes=\hours
+ \multiply\minutes by 60
+ \advance\minutes by-\time
+ \global\multiply\minutes by-1 }
+\SetTime
+\def\now{\number\hours:\ifnum\minutes<10 0\fi\number\minutes}
+\def\Now{\today\ \now}
+\newif\ifPrelimDraft
+\def\midrtitle{\ifPrelimDraft {\textsl{preliminary draft, \Now}}\fi}
+\newdimen\raggedskip \raggedskip=\z@
+\newdimen\raggedstretch \raggedstretch=5em % ems of font set now (10pt)
+\newskip\raggedparfill \raggedparfill=\z@\@plus 1fil
+\def\raggedspaces{\spaceskip=.3333em \relax \xspaceskip=.5em \relax }
+\def\raggedright{%
+ \nohyphens
+ \rightskip=\raggedskip\@plus\raggedstretch \raggedspaces
+ \parfillskip=\raggedparfill }
+\def\raggedleft{%
+ \nohyphens
+ \leftskip=\raggedskip\@plus\raggedstretch \raggedspaces
+ \parfillskip=\z@skip }
+\def\raggedcenter{%
+ \nohyphens
+ \leftskip=\raggedskip\@plus\raggedstretch
+ \rightskip=\leftskip \raggedspaces
+ \parindent=\z@ \parfillskip=\z@skip }
+\def\normalspaces{\spaceskip\z@skip \xspaceskip\z@skip }
+\DeclareRobustCommand{\nobreakspace}{%
+ \unskip\nobreak\ \ignorespaces}
+\def\boxcs#1{\box\csname#1\endcsname}
+\def\setboxcs#1{\setbox\csname#1\endcsname}
+\def\newboxcs#1{\expandafter\newbox\csname#1\endcsname}
+\let\gobble\@gobble
+\def\vellipsis{%
+ \leavevmode\kern0.5em
+ \raise\p@\vbox{\baselineskip6\p@\vskip7\p@\hbox{.}\hbox{.}\hbox{.}}
+ }
+\def\bull{\vrule \@height 1ex \@width .8ex \@depth -.2ex }
+\def\cents{{\rm\raise.2ex\rlap{\kern.05em$\scriptstyle/$}c}}
+\def\Dag{\raise .6ex\hbox{$\scriptstyle\dagger$}}
+\def\careof{\leavevmode\hbox{\raise.75ex\hbox{c}\kern-.15em
+ /\kern-.125em\smash{\lower.3ex\hbox{o}}} \ignorespaces}
+\DeclareRobustCommand\sfrac[1]{\@ifnextchar/{\@sfrac{#1}}%
+ {\@sfrac{#1}/}}
+\def\@sfrac#1/#2{\leavevmode\kern.1em\raise.5ex
+ \hbox{$\m@th\mbox{\fontsize\sf@size\z@
+ \selectfont#1}$}\kern-.1em
+ /\kern-.15em\lower.25ex
+ \hbox{$\m@th\mbox{\fontsize\sf@size\z@
+ \selectfont#2}$}}
+\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+\DeclareRobustCommand\meta[1]{%
+ \ensuremath{\langle}\emph{#1}\ensuremath{\rangle}}
+\DeclareRobustCommand\env[1]{%
+ \cs{begin}\texttt{\char`\{#1\char`\}}}
+\def\thinskip{\hskip 0.16667em\relax}
+\def\endash{--}
+\def\emdash{\endash-}
+\def\d@sh#1#2{\unskip#1\thinskip#2\thinskip\ignorespaces}
+\def\dash{\d@sh\nobreak\endash}
+\def\Dash{\d@sh\nobreak\emdash}
+\def\ldash{\d@sh\empty{\hbox{\endash}\nobreak}}
+\def\rdash{\d@sh\nobreak\endash}
+\def\Ldash{\d@sh\empty{\hbox{\emdash}\nobreak}}
+\def\Rdash{\d@sh\nobreak\emdash}
+\def\hyph{-\penalty\z@\hskip\z@skip }
+\def\slash{/\penalty\z@\hskip\z@skip }
+\def\nth#1{%
+ \def\reserved@a##1##2\@nil{\ifcat##1n%
+ 0%
+ \let\reserved@b\ensuremath
+ \else##1##2%
+ \let\reserved@b\relax
+ \fi}%
+ \TestCount=\reserved@a#1\@nil\relax
+ \ifnum\TestCount <0 \multiply\TestCount by\m@ne \fi % subdue negatives
+ \T@stCount=\TestCount
+ \divide\T@stCount by 100 \multiply\T@stCount by 100
+ \advance\TestCount by-\T@stCount % n mod 100
+ \ifnum\TestCount >20 \T@stCount=\TestCount
+ \divide\T@stCount by 10 \multiply\T@stCount by 10
+ \advance\TestCount by-\T@stCount % n mod 10
+ \fi
+ \reserved@b{#1}%
+ \textsuperscript{\ifcase\TestCount th% 0th
+ \or st% 1st
+ \or nd% 2nd
+ \or rd% 3rd
+ \else th% nth
+ \fi}%
+ }
+\def\Review{\@ifnextchar:{\@Review}{\@Review:}}
+\def\@Review:{\@ifnextchar[%]
+ {\@Rev}%
+ {\@Rev[Book review]}}
+\def\@Rev[#1]#2{{\ignorespaces#1\unskip:\enspace\ignorespaces
+ \slshape\mdseries#2}}
+\def\reviewitem{\addvspace{\BelowTitleSkip}%
+ \def\revauth##1{\def\therevauth{##1, }\ignorespaces}%
+ \def\revtitle##1{\def\therevtitle{{\slshape##1}. }\ignorespaces}%
+ \def\revpubinfo##1{\def\therevpubinfo{##1.}\ignorespaces}%
+ }
+\def\endreviewitem{{\noindent\interlinepenalty=10000
+ \therevauth\therevtitle\therevpubinfo\endgraf}%
+ \vskip\medskipamount
+ }
+\def\booktitle#1{{\slshape#1\/}}
+\newcount\issueseqno \issueseqno=-1
+\def\v@lx{\gdef\volx{Volume~\volno~(\volyr), No.~\issno}}
+\def\volyr{}
+\def\volno{}
+\def\vol #1,#2.{\gdef\volno{#1\unskip}%
+ \gdef\issno{\ignorespaces#2\unskip}%
+ \setbox\TestBox=\hbox{\volyr}%
+ \ifdim \wd\TestBox > .2em \v@lx \fi }
+\def\issdate #1#2 #3.{\gdef\issdt{#1#2 #3}\gdef\volyr{#3}%
+ \gdef\bigissdt{#1{\smc\uppercase{#2}} #3}%
+ \setbox\TestBox=\hbox{\volno}%
+ \ifdim \wd\TestBox > .2em \v@lx \fi }
+\vol 0, 0.
+\issdate Thermidor, 2001.
+\def\tubissue#1{\@ifnextchar(%)
+ {\@tubissue@b{#1}}
+ {\@tubissue@a{#1}}}
+\def\@tubissue@b#1(#2){\@tubissue@a{#1}{#2}}
+\def\@tubissue@a#1#2%
+ {\TUB~#1, no.~#2}
+\def\infil@{\jobname}
+\def\Input #1 {\ifnum\issueseqno<0
+ \def\infil@{#1}%
+ \else
+ \def\infil@{tb\number\issueseqno#1}
+ \fi
+ \edef\jobname{\infil@}\@readFLN
+ \@@input \infil@\relax
+ \if@RMKopen
+ \immediate\closeout\@TBremarkfile\@RMKopenfalse
+ \fi
+}
+\newif\if@RMKopen \@RMKopenfalse
+\newwrite\@TBremarkfile
+\def\@TBremark#1{%
+ \if@RMKopen
+ \else
+ \@RMKopentrue\immediate\openout\@TBremarkfile=\infil@.rmk
+ \fi
+ \toks@={#1}%
+ \immediate\write\@TBremarkfile{^^J\the\toks@}%
+ \immediate\write16{^^JTBremark:: \the\toks@^^J}%
+}
+\let\TBremark=\gobble
+\def\TBEnableRemarks{\let\TBremark\@TBremark}
+\def\TUBedit#1{}
+\def\TUBfilename#1#2{\expandafter\def\csname file@@#1\endcsname{#2}}
+\InputIfFileExists{\jobname.fln}%
+ {\TBInfo{Reading alternative file file \jobname.fln}}{}
+\def\@tubfilename#1{\expandafter\ifx\csname file@@#1\endcsname\relax
+ #1\else\csname file@@#1\endcsname\fi}
+\def\fileinput#1{\@@input\@tubfilename{#1} }
+\def\pagexrefON#1{%
+ \write-1{\def\expandafter\noexpand\csname#1\endcsname{\number\c@page}}%
+ \write\ppoutfile{%
+ \def\expandafter\noexpand\csname#1\endcsname{\number\c@page}}%
+ }
+\def\PageXrefON#1{%
+ \immediate\write-1{\def\expandafter
+ \noexpand\csname#1\endcsname{\number\c@page}}%
+ \immediate\write\ppoutfile{\def\expandafter
+ \noexpand\csname#1\endcsname{\number\c@page}}}
+\def\pagexrefOFF#1{}
+\let\pagexref=\pagexrefOFF
+\def\PageXrefOFF#1{}
+\let\PageXref=\PageXrefOFF
+\def\xreftoON#1{%
+ \ifundefined{#1}%
+ ???\TBremark{Need cross reference for #1.}%
+ \else\csname#1\endcsname\fi}
+\def\xreftoOFF#1{???}
+\let\xrefto=\xreftoOFF
+\let\TBdriver\gobble
+\hyphenation{Eijk-hout Hara-lam-bous man-u-script man-u-scripts}
+\PrelimDrafttrue
+\textheight 54pc
+\textwidth 39pc
+\columnsep 1.5pc
+\columnwidth 18.75pc
+\parindent \normalparindent
+\parskip \z@ % \@plus\p@
+\leftmargini 2em
+\leftmarginv .5em
+\leftmarginvi .5em
+\oddsidemargin \z@
+\evensidemargin \z@
+\topmargin -2.5pc
+\headheight 12\p@
+\headsep 20\p@
+\marginparwidth 48\p@
+\marginparsep 10\p@
+\partopsep=\z@
+\topsep=3\p@\@plus\p@\@minus\p@
+\parsep=3\p@\@plus\p@\@minus\p@
+\itemsep=\parsep
+\twocolumn
+\newdimen\pagewd \pagewd=39pc
+\newdimen\trimwd \trimwd=\pagewd
+\newdimen\trimlgt \trimlgt=11in
+\newdimen\headmargin \headmargin=3.5pc
+\newcommand\DeclareLaTeXLogo[5]{\expandafter\def
+ \csname @LaTeX@#1/#2/#3\endcsname{{#4}{#5}}}
+\def\@LaTeX@default{{.36}{.15}}
+\DeclareLaTeXLogo{cmss}{bx}n{.3}{.15}
+\DeclareLaTeXLogo{cmr}m{it}{.3}{.27}
+\DeclareLaTeXLogo{cmr}{bx}{it}{.3}{.27}
+\DeclareRobustCommand\LaTeX{\expandafter\let\expandafter\reserved@a
+ \csname @LaTeX@\f@family/\f@series/\f@shape\endcsname
+ \ifx\reserved@a\relax\let\reserved@a\@LaTeX@default\fi
+ \expandafter\@LaTeX\reserved@a}
+\newcommand\@LaTeX[2]{L\kern-#1em
+ {\sbox\z@ T%
+ \vbox to\ht0{\hbox{$\m@th$%
+ \csname S@\f@size\endcsname
+ \fontsize\sf@size\z@
+ \math@fontsfalse\selectfont
+ A}%
+ \vss}%
+ }%
+ \kern-#2em%
+ \TeX}
+\def\theauthor#1{\csname theauthor#1\endcsname}
+\def\theaddress#1{\csname theaddress#1\endcsname}
+\def\thenetaddress#1{\csname thenetaddress#1\endcsname}
+\def\thePersonalURL#1{\csname thePersonalURL#1\endcsname}
+\def\@defaultauthorlist{%
+ \count@\authornumber
+ \advance\count@ by -2
+ \@tempcnta0
+ \loop
+ \ifnum\count@>0
+ \advance\@tempcnta by \@ne
+ \ignorespaces\theauthor{\number\@tempcnta}\unskip,
+ \advance\count@ by \m@ne
+ \repeat
+ \count@\authornumber
+ \advance\count@ by -\@tempcnta
+ \ifnum\authornumber>0
+ \ifnum\count@>1
+ \count@\authornumber
+ \advance\count@ by \m@ne
+ \ignorespaces\theauthor{\number\count@}\unskip\ and
+ \fi
+ \ignorespaces\theauthor{\number\authornumber}\unskip
+ \fi
+}
+\def\signature#1{\def\@signature{#1}}
+\def\@signature{\@defaultsignature}
+\def\@defaultsignature{{%
+ \let\thanks\@gobble
+ \ifnum\authornumber<0
+ \medskip
+ \signaturemark
+ \theauthor{\number\authornumber}\\
+ \theaddress{\number\authornumber}\\
+ \allowhyphens
+ \thenetaddress{\number\authornumber}\\
+ \thePersonalURL{\number\authornumber}\\
+ \else
+ \count@=0
+ \loop
+ \ifnum\count@<\authornumber
+ \medskip
+ \advance\count@ by \@ne
+ \signaturemark
+ \theauthor{\number\count@}\\
+ \theaddress{\number\count@}\\
+ {%
+ \allowhyphens
+ \thenetaddress{\number\count@}\\
+ \thePersonalURL{\number\count@}\\
+ }%
+ \repeat
+ \fi
+ }%
+}
+\newdimen\signaturewidth \signaturewidth=12pc
+\newcommand\makesignature[1][\medskipamount]{%
+ \@tempdima\signaturewidth
+ \advance\@tempdima 1.5pc
+ \ifdim \@tempdima>\columnwidth
+ \signaturewidth \columnwidth
+ \advance\signaturewidth -1.5pc
+ \fi
+ \par
+ \penalty9000
+ \vspace{#1}%
+ \rightline{%
+ \vbox{\hsize\signaturewidth \ninepoint \raggedright
+ \parindent \z@ \everypar={\hangindent 1pc }
+ \parskip \z@skip
+ \def\|{\unskip\hfil\break}%
+ \def\\{\endgraf}%
+ \def\phone{\rm Phone: }
+ \rm\@signature}%
+ }%
+ \ifnum\authornumber<0 \endgroup\fi
+}
+\def\signaturemark{\leavevmode\llap{$\diamond$\enspace}}
+\newcount\authornumber
+\authornumber=0
+\def\author{%
+ \global\advance\authornumber\@ne
+ \TB@author
+}
+\def\contributor{%
+ \begingroup
+ \authornumber\m@ne
+ \TB@author
+}
+\def\TB@author#1{%
+ \expandafter\def\csname theauthor\number\authornumber\endcsname
+ {\ignorespaces#1\unskip}%
+ \expandafter\def\csname theaddress\number\authornumber\endcsname
+ {\TBWarning{Address for #1\space missing}\@gobble}%
+ \expandafter\def\csname thenetaddress\number\authornumber\endcsname
+ {\TBWarning{Net address for #1\space missing}\@gobble}%
+ \expandafter\let\csname thePersonalURL\number\authornumber\endcsname
+ \@gobble
+ }
+\def\address#1{%
+ \expandafter\def\csname theaddress\number\authornumber\endcsname
+ {\leavevmode\ignorespaces#1\unskip}}
+\def\network#1{\def\@network{#1: }}
+\newcommand\netaddress[1][\relax]{%
+ \begingroup
+ \def\@network{}%
+ #1\@sanitize\makespace\ \makeactive\@
+ \makeactive\.\makeactive\%\@relay@netaddress}%
+\def\@relay@netaddress#1{%
+ \ProtectNetChars
+ \expandafter\protected@xdef
+ \csname thenetaddress\number\authornumber\endcsname
+ {\protect\leavevmode\textrm{\@network}%
+ {\protect\NetAddrChars\net
+ \ignorespaces#1\unskip}}%
+ \endgroup
+ }
+\def\personalURL{\begingroup
+ \@sanitize\makespace\ \makeactive\@
+ \makeactive\.\makeactive\%\makeactive\/\@personalURL}%
+\def\@personalURL#1{%
+ \ProtectNetChars
+ \expandafter\protected@xdef
+ \csname thePersonalURL\number\authornumber\endcsname{%
+ \protect\leavevmode
+ {%
+ \protect\URLchars\net
+ \ignorespaces#1\unskip
+ }%
+ }%
+ \endgroup
+ }
+{%
+ \makecomment\*
+ \makeactive\@
+ \gdef\netaddrat{\makeactive\@*
+ \def@{\discretionary{\char"40}{}{\char"40}}}
+ \makeactive\%
+ \gdef\netaddrpercent{\makeactive\%*
+ \def%{\discretionary{\char"25}{}{\char"25}}}
+ \makeactive\.
+ \gdef\netaddrdot{\makeactive\.*
+ \def.{\discretionary{\char"2E}{}{\char"2E}}}
+ \gdef\NetAddrChars{\netaddrat \netaddrpercent \netaddrdot}
+ \makeactive\/
+ \gdef\URLchars{*
+ \NetAddrChars
+ \makeactive\/*
+ \def/{\discretionary{\char"2F}{}{\char"2F}}}
+ \gdef\ProtectNetChars{*
+ \def@{\protect@}*
+ \def%{\protect%}*
+ \def.{\protect.}*
+ \def/{\protect/}*
+ }
+}
+\if@compatibility
+ \DeclareRobustCommand\net{\normalfont\ttfamily\mathgroup\symtypewriter}
+\else
+ \DeclareOldFontCommand{\net}{\ttfamily\upshape\mdseries}{\mathtt}
+\fi
+\def\authorlist#1{\def\@author{#1}}
+\def\@author{\@defaultauthorlist}
+\def\maketitle{\par
+ \ifdim\PreTitleDrop > \z@
+ \loop
+ \ifdim \PreTitleDrop > \textheight
+ \vbox{}\vfil\eject
+ \advance\PreTitleDrop by -\textheight
+ \repeat
+ \vbox to \PreTitleDrop{}
+ \global\PreTitleDrop=\z@
+ \fi
+ \begingroup
+ \setcounter{footnote}{0}
+ \def\thefootnote{\fnsymbol{footnote}}
+ \@maketitle
+ \@thanks
+ \endgroup
+ \setcounter{footnote}{0}
+ \gdef\@thanks{}
+ }
+\def\secsep{\vskip 5\baselineskip}
+\newdimen\stbaselineskip \stbaselineskip=18\p@
+\newdimen\stfontheight
+ \settoheight{\stfontheight}{\sectitlefont O}
+\newif\ifSecTitle
+\SecTitlefalse
+\newif\ifWideSecTitle
+\newcommand\sectitle{%
+ \SecTitletrue
+ \@ifstar
+ {\WideSecTitletrue\def\s@ctitle}%
+ {\WideSecTitlefalse\def\s@ctitle}%
+}
+\newdimen\PreTitleDrop \PreTitleDrop=\z@
+\newskip\AboveTitleSkip \AboveTitleSkip=12\p@
+\newskip\BelowTitleSkip \BelowTitleSkip=8\p@
+\newdimen\strulethickness \strulethickness=.6\p@
+\def\@sectitle #1{%
+ \par
+ \penalty-1000
+ \ifWideSecTitle\else\secsep\fi
+ {%
+ \fboxrule\strulethickness
+ \fboxsep\z@
+ \noindent\framebox[\hsize]{%
+ \raggedcenter
+ \def\\{\unskip\break}%
+ \sectitlefont
+ \makestrut[2\stfontheight;\z@]%
+ #1%
+ \makestrut[\z@;\stfontheight]\endgraf
+ }%
+ }%
+ \nobreak
+ \vskip\baselineskip
+}
+\def\@makesectitle{\ifSecTitle
+ \global\SecTitlefalse
+ \ifWideSecTitle
+ \twocolumn[\@sectitle{\s@ctitle}]%
+ \global\WideSecTitlefalse
+ \else
+ \@sectitle{\s@ctitle}%
+ \fi
+ \else
+ \vskip\AboveTitleSkip
+ \kern\topskip
+ \hrule \@height\z@ \@depth\z@ \@width 10\p@
+ \kern-\topskip
+ \kern-\strulethickness
+ \hrule \@height\strulethickness \@depth\z@
+ \kern\medskipamount
+ \nobreak
+ \fi
+}
+\def\@maketitle{\@makesectitle
+ {%
+ \nohyphens \interlinepenalty\@M
+ \setbox0=\hbox{%
+ \let\thanks\@gobble
+ \let\\=\quad
+ \let\and=\quad
+ \ignorespaces\@author}%
+ {%
+ \noindent\bf\raggedright\ignorespaces\@title\endgraf
+ }%
+ \ifdim \wd0 < 5\p@ % omit if author is null
+ \else
+ \nobreak \vskip 4\p@
+ {%
+ \leftskip=\normalparindent
+ \raggedright
+ \def\and{\unskip\\}%
+ \noindent\@author\endgraf
+ }%
+ \fi
+ \nobreak
+ \vskip\BelowTitleSkip
+ }%
+ \global\@afterindentfalse
+ \aftergroup\@afterheading
+}
+\newenvironment{dedication}%
+ {\raggedright\noindent\itshape\ignorespaces}%
+ {\endgraf\medskip}
+\renewenvironment{abstract}%
+ {%
+ \begin{SafeSection}%
+ \section*{Abstract}%
+ }%
+ {\end{SafeSection}}
+\newenvironment{longabstract}%
+ {%
+ \begin{SafeSection}%
+ \section*{Abstract}%
+ \bgroup\small
+ }%
+ {%
+ \endgraf\egroup
+ \end{SafeSection}%
+ \vspace{.25\baselineskip}
+ \begin{center}
+ {$--*--$}
+ \end{center}
+ \vspace{.5\baselineskip}}
+\if@numbersec
+ \def\section{\TB@startsection{{section}%
+ 1%
+ \z@
+ {-8\p@}%
+ {4\p@}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ \def\subsection{\TB@startsection{{subsection}%
+ 2%
+ \z@
+ {-8\p@}%
+ {4\p@}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ \def\subsubsection{\TB@startsection{{subsubsection}%
+ 3%
+ \z@
+ {-8\p@}%
+ {4\p@}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ \def\paragraph{\TB@startsection{{paragraph}%
+ 4%
+ \z@
+ {2.5ex\@plus 1ex}%
+ {-1em}%
+ {\normalsize\bf}}}
+\else
+ \setcounter{secnumdepth}{0}
+ \def\section{\TB@nolimelabel
+ \TB@startsection{{section}%
+ 1%
+ \z@
+ {-8\p@}%
+ {4\p@}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ \def\subsection{\TB@nolimelabel
+ \TB@startsection{{subsection}%
+ 2%
+ \z@
+ {-8\p@}%
+ {-0.5em\@plus-\fontdimen3\font}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ \def\subsubsection{\TB@nolimelabel
+ \TB@startsection{{subsubsection}%
+ 3%
+ \parindent
+ {-8\p@}%
+ {-0.5em\@plus-\fontdimen3\font}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+\fi
+\def\TB@startsection#1{\@ifstar
+ {\TBWarning{*-form of \expandafter\string\csname\@firstofsix#1%
+ \endcsname\space inappropriate}%
+ \@startsection#1}%
+ {\@startsection#1}}
+\def\@firstofsix#1#2#3#4#5#6{#1}
+\def\TB@safe@startsection#1{\@startsection#1}
+\newenvironment{SafeSection}%
+ {\let\TB@startsection\TB@safe@startsection}%
+ {}
+\if@numbersec
+ \def\subparagraph{\TB@nosection\subparagraph\paragraph}
+\else
+ \def\paragraph{\TB@nosection\paragraph\subsubsection}
+ \def\subparagraph{\TB@nosection\subparagraph\subsubsection}
+\fi
+\def\chapter{\TB@nosection\chapter\section}
+\def\part{\TB@nosection\part\section}
+\def\TB@nosection#1#2{\TBWarning{class does not support \string#1,
+ \string#2\space used instead}#2}
+\def\l@section#1#2{\addpenalty{\@secpenalty}%
+ \addvspace{1.0em\@plus\p@}%
+ \@tempdima 1.5em
+ \begingroup
+ \parindent\z@ \rightskip\z@ % article style makes \rightskip > 0
+ \parfillskip\z@
+ \bf\leavevmode\advance\leftskip\@tempdima\hskip-\leftskip#1\nobreak\hfil
+ \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
+ \endgroup}
+\renewcommand\appendix{\par
+ \renewcommand\thesection{\@Alph\c@section}%
+ \setcounter{section}{0}%
+ \if@numbersec
+ \else
+ \setcounter{secnumdepth}{1}%
+ \fi
+ \def\@tempa{appendix}
+ \ifx\@tempa\@currenvir
+ \expandafter\@appendix@env
+ \fi
+}
+\newcommand\app@prefix@section{}
+\newcommand\@appendix@env[1][Appendix]{%
+ \renewcommand\@seccntformat[1]{\csname app@prefix@##1\endcsname
+ \csname the##1\endcsname\quad}%
+ \renewcommand\app@prefix@section{#1 }%
+}
+\let\endappendix\relax
+\def\TB@nolimelabel{\def\@currentlabel{\protect\TBWarning
+ {Invalid label on page \thepage\space used}%
+ \textbf{?!?}}}
+\let\TB@@sect\@sect
+\let\TB@@ssect\@ssect
+\def\@sect#1#2#3#4#5#6[#7]#8{%
+ \def\@currentlabelname{#7}%
+ \TB@@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]{#8}%
+}
+\def\@ssect#1#2#3#4#5{%
+ \def\@currentlabelname{#5}%
+ \TB@@ssect{#1}{#2}{#3}{#4}{#5}%
+}
+\def\label#1{{%
+ \@bsphack
+ \let\label\@gobble
+ \let\index\@gobble
+ \if@filesw
+ \protected@write\@auxout{}%
+ {\string\newlabel{#1}{%
+ {\@currentlabel}{\thepage}{\@currentlabelname}}%
+ }%
+ \fi
+ \@esphack
+ }%
+}
+\let\@currentlabelname\@empty
+\DeclareRobustCommand\ref[1]{\expandafter\@setref
+ \csname r@#1\endcsname\@firstofthree{#1}}
+\DeclareRobustCommand\pageref[1]{\expandafter\@setref
+ \csname r@#1\endcsname\@secondofthree{#1}}
+\DeclareRobustCommand\nameref[1]{\expandafter\@setref
+ \csname r@#1\endcsname\@thirdofthree{#1}}
+\long\def\@firstofthree#1#2#3{#1}
+\long\def\@secondofthree#1#2#3{#2}
+\long\def\@thirdofthree#1#2#3{#3}
+\long\def\@makecaption#1#2{%
+ \vskip\abovecaptionskip
+ \sbox\@tempboxa{#1: #2}%
+ \ifdim \wd\@tempboxa >\hsize
+ \raggedright\hyphenpenalty=\@M
+ #1: #2\par
+ \else
+ \global \@minipagefalse
+ \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \vskip\belowcaptionskip}
+\renewcommand\normalsize{%
+ \@setfontsize\normalsize\@xpt\@xiipt
+ \abovedisplayskip=3\p@\@plus 3\p@\@minus\p@
+ \belowdisplayskip=\abovedisplayskip
+ \abovedisplayshortskip=\z@\@plus 3\p@
+ \belowdisplayshortskip=\p@\@plus 3\p@\@minus\p@
+}
+
+\renewcommand\small{%
+ \@setfontsize\small\@ixpt{11}%
+ \abovedisplayskip=2.5\p@\@plus 2.5\p@\@minus\p@
+ \belowdisplayskip=\abovedisplayskip
+ \abovedisplayshortskip=\z@\@plus 2\p@
+ \belowdisplayshortskip=\p@\@plus 2\p@\@minus\p@
+}
+\renewcommand\footnotesize{%
+ \@setfontsize\footnotesize\@viiipt{9.5}%
+ \abovedisplayskip=3\p@\@plus 3\p@\@minus\p@
+ \belowdisplayskip=\abovedisplayskip
+ \abovedisplayshortskip=\z@\@plus 3\p@
+ \belowdisplayshortskip=\p@\@plus 3\p@\@minus\p@
+}
+\def\@listi{%
+ \leftmargin\leftmargini\parsep=\p@\@plus\p@\@minus\p@
+ \itemsep=\parsep
+ \listparindent=1em
+ }
+
+\def\@listii{%
+ \leftmargin\leftmarginii
+ \labelwidth=\leftmarginii \advance\labelwidth-\labelsep
+ \topsep=2\p@\@plus\p@\@minus\p@
+ \parsep=\p@\@plus\p@\@minus\p@
+ \itemsep=\parsep
+ \listparindent=1em
+ }
+
+\def\@listiii{%
+ \leftmargin=\leftmarginiii
+ \labelwidth=\leftmarginiii \advance\labelwidth-\labelsep
+ \topsep=\p@\@plus\p@\@minus\p@
+ \parsep=\z@
+ \itemsep=\topsep
+ \listparindent=1em
+ }
+\def\quote{\list{}{\rightmargin.5\leftmargin}\item[]}
+\renewcommand{\quotation}{\list{}{\listparindent 1.5em
+ \rightmargin.5\leftmargin\parsep \z@\@plus\p@}\item[]}
+\let\@TBverbatim\verbatim
+\let\@TBendverbatim\endverbatim
+\def\verbatim{\futurelet\reserved@a\@switch@sqbverbatim}
+\def\@switch@sqbverbatim{\ifx\reserved@a[%]
+ \expandafter\@sqbverbatim\else
+ \def\reserved@b{\@sqbverbatim[]}\expandafter\reserved@b\fi}
+\def\@sqbverbatim[#1]{%
+ \def\ruled{\let\if@ruled\iftrue}%
+ #1\@TBverbatim}
+\def\@verbatim{%
+ \if@ruled\trivlist\item\hrule\kern5\p@\nobreak\fi
+ \trivlist \item\relax
+ \if@minipage\else\vskip\parskip\fi
+ \leftskip\@totalleftmargin\rightskip\z@skip
+ \parindent\z@\parfillskip\@flushglue\parskip\z@skip
+ \@@par
+ \@tempswafalse
+ \def\par{%
+ \if@tempswa
+ \leavevmode \null \@@par\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode\@@par\penalty\interlinepenalty\fi
+ \fi}%
+ \obeylines \verbatim@font \@noligs
+ \let\do\@makeother \dospecials
+ \everypar \expandafter{\the\everypar \unpenalty}%
+}%
+\def\endverbatim{\@TBendverbatim
+ \if@ruled\kern5\p@\hrule\endtrivlist\fi}
+{\makeactive<
+ \gdef<#1>{{\reset@font\ensuremath{\langle}%
+ \textit{#1}%
+ \ensuremath{\rangle}}}
+}
+\let\if@ruled\iffalse
+\if@Harvardcite
+\let\@internalcite\cite
+\def\cite{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
+\def\citeNP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
+\def\citeN{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
+ \def\citeauthoryear##1##2##3{##1 (##3}\@citedata}
+\def\citeA{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##1}\@internalcite}
+\def\citeANP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##1}\@internalcite}
+\def\shortcite{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
+\def\shortciteNP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
+\def\shortciteN{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
+ \def\citeauthoryear##1##2##3{##2 (##3}\@citedata}
+\def\shortciteA{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##2}\@internalcite}
+\def\shortciteANP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##2}\@internalcite}
+\def\citeyear{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##3}\@citedata}
+\def\citeyearNP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##3}\@citedata}
+\def\@citedata{%
+ \@ifnextchar [{\@tempswatrue\@citedatax}%
+ {\@tempswafalse\@citedatax[]}%
+}
+
+\def\@citedatax[#1]#2{%
+\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
+ \def\@citea{}\@cite{\@for\@citeb:=#2\do%
+ {\@citea\def\@citea{, }\@ifundefined% by Young
+ {b@\@citeb}{{\bf ?}%
+ \@warning{Citation `\@citeb' on page \thepage \space undefined}}%
+{\csname b@\@citeb\endcsname}}}{#1}}%
+\def\@citex[#1]#2{%
+\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
+ \def\@citea{}\@cite{\@for\@citeb:=#2\do%
+ {\@citea\def\@citea{; }\@ifundefined% by Young
+ {b@\@citeb}{{\bf ?}%
+ \@warning{Citation `\@citeb' on page \thepage \space undefined}}%
+{\csname b@\@citeb\endcsname}}}{#1}}%
+\def\@biblabel#1{}
+\newlength{\bibhang}
+\setlength{\bibhang}{2em}
+\newdimen\bibindent
+\bibindent=1.5em
+\@ifundefined{refname}%
+ {\newcommand{\refname}{References}}%
+ {}%
+\def\thebibliography#1{\let\TB@startsection\TB@safe@startsection
+ \section*{\refname\@mkboth
+ {\uppercase{\refname}}{\uppercase{\refname}}}\list
+ {[\arabic{enumi}]}{%
+ \labelwidth\z@ \labelsep\z@
+ \leftmargin\bibindent
+ \itemindent -\bibindent
+ \listparindent \itemindent
+ \parsep \z@
+ \usecounter{enumi}}
+ \def\newblock{}
+ \sloppy
+ \sfcode`\.=1000\relax}
+\def\etal{et\,al.\@}
+\def\bibentry{\smallskip
+ \hangindent=\parindent
+ \hangafter=1
+ \noindent
+ \sloppy
+ \clubpenalty500 \widowpenalty500
+ \frenchspacing}
+\def\bibliography#1{%
+ \if@filesw\immediate\write\@auxout{\string\bibdata{\@tubfilename{#1}}}\fi
+ \@input{\jobname.bbl}}
+
+\def\bibliographystyle#1{\if@filesw\immediate\write\@auxout
+ {\string\bibstyle{\@tubfilename{#1}}}\fi}
+\else
+\let\TB@save@thebibliography\thebibliography
+\def\thebibliography{\let\TB@startsection\TB@safe@startsection
+ \TB@save@thebibliography}
+\fi
+\def\HorzR@gisterRule{\vrule \@height 0.2\p@ \@depth\z@ \@width 0.5in }
+\def\DownShortR@gisterRule{\vrule \@height 0.2\p@ \@depth 1pc \@width 0.2\p@ }
+\def\UpShortR@gisterRule{\vrule \@height 1pc \@depth\z@ \@width 0.2\p@ }
+\def\ttopregister{\dlap{%
+ \hb@xt@\trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule
+ \HorzR@gisterRule \hfil \HorzR@gisterRule}%
+ \hb@xt@\trimwd{\hfil \DownShortR@gisterRule \hfil}}}
+\def\tbotregister{\ulap{%
+ \hb@xt@\trimwd{\hfil \UpShortR@gisterRule \hfil}%
+ \hb@xt@\trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule
+ \HorzR@gisterRule \hfil \HorzR@gisterRule}}}
+\def\topregister{\ttopregister}
+\def\botregister{\tbotregister}
+\def \rtitlex{\def\texttub##1{{\normalsize\textrm{##1}}}\TUB, \volx }
+
+\def\PrelimDraftfooter{%
+ \dlap{\kern\textheight\kern3pc
+ \rlap{\hb@xt@\pagewd{\midrtitle\hfil\midrtitle}}
+ }}
+
+\def\MakeRegistrationMarks{}
+\def\UseTrimMarks{%
+ \def\MakeRegistrationMarks{%
+ \ulap{\rlap{%
+ \vbox{\dlap{\vbox to\trimlgt{\vfil\botregister}}%
+ \topregister\vskip \headmargin \vskip 10\p@}}}}%
+ }
+
+\def\@oddhead{\MakeRegistrationMarks\PrelimDraftfooter
+ \normalsize\csname normalshape\endcsname\rm
+ \rtitlex\qquad\midrtitle \hfil \thepage}
+\def\@evenhead{\MakeRegistrationMarks\PrelimDraftfooter
+ \normalsize\csname normalshape\endcsname\rm
+ \thepage\hfil\midrtitle\qquad\rtitlex}
+\def\@oddfoot{}
+\def\@evenfoot{}
+\def\ps@headings{}
+\pagestyle{headings}
+\def\@outputdblcol{\if@firstcolumn \global\@firstcolumnfalse
+ \global\setbox\@leftcolumn\box\@outputbox
+ \global\brokenpenalty10000
+ \else \global\@firstcolumntrue
+ \global\brokenpenalty100
+ \setbox\@outputbox\vbox{\hb@xt@\textwidth{\hb@xt@\columnwidth
+ {\box\@leftcolumn \hss}\hfil \vrule \@width\columnseprule\hfil
+ \hb@xt@\columnwidth{\box\@outputbox \hss}}}\@combinedblfloats
+ \@outputpage \begingroup \@dblfloatplacement \@startdblcolumn
+ \@whilesw\if@fcolmade \fi{\@outputpage\@startdblcolumn}\endgroup
+ \fi}
+\newif\ifFirstPar \FirstParfalse
+\def\smc{\sc}
+\def\ninepoint{\small}
+\DeclareRobustCommand\SMC{%
+ \ifx\@currsize\normalsize\small\else
+ \ifx\@currsize\small\footnotesize\else
+ \ifx\@currsize\footnotesize\scriptsize\else
+ \ifx\@currsize\large\normalsize\else
+ \ifx\@currsize\Large\large\else
+ \ifx\@currsize\LARGE\Large\else
+ \ifx\@currsize\scriptsize\tiny\else
+ \ifx\@currsize\tiny\tiny\else
+ \ifx\@currsize\huge\LARGE\else
+ \ifx\@currsize\Huge\huge\else
+ \small\SMC@unknown@warning
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+}
+\newcommand\SMC@unknown@warning{\TBWarning{\string\SMC: unrecognised
+ text font size command -- using \string\small}}
+\newcommand\textSMC[1]{{\SMC #1}}
+\newcommand\acro[1]{\textSMC{#1}\@}
+\def\xEdNote{{\EdNoteFont Editor's note:\enspace }}
+\def \EdNote{\@ifnextchar[%]
+ {%
+ \ifvmode
+ \smallskip\noindent\let\@EdNote@\@EdNote@v
+ \else
+ \unskip\quad\def\@EdNote@{\unskip\quad}%
+ \fi
+ \@EdNote
+ }%
+ \xEdNote
+}
+\long\def\@EdNote[#1]{%
+ [\thinspace\xEdNote\ignorespaces
+ #1%
+ \unskip\thinspace]%
+ \@EdNote@
+}
+\def\@EdNote@v{\par\smallskip}
+\def\SelfDocumenting{%
+ \setlength\textwidth{31pc}
+ \onecolumn
+ \parindent \z@
+ \parskip 2\p@\@plus\p@\@minus\p@
+ \oddsidemargin 8pc
+ \evensidemargin 8pc
+ \marginparwidth 8pc
+ \toks@\expandafter{\@oddhead}%
+ \xdef\@oddhead{\hss\hb@xt@\pagewd{\the\toks@}}%
+ \toks@\expandafter{\@evenhead}%
+ \xdef\@evenhead{\hss\hb@xt@\pagewd{\the\toks@}}%
+ \def\ps@titlepage{}%
+}
+\def\ps@titlepage{}
+
+\long\def\@makefntext#1{\parindent 1em\noindent\hb@xt@2em{}%
+ \llap{\@makefnmark}\null$\mskip5mu$#1}
+
+\def\fnum@figure{{\bf Figure \thefigure}}
+\if@Harvardcite
+ \AtBeginDocument{%
+ \bibliographystyle{ltugbib}%
+ }
+\fi
+\authornumber\z@
+\let\@signature\@defaultsignature
+\InputIfFileExists{ltugboat.cfg}{\TBInfo{Loading ltugboat
+ configuration information}}{}
+\endinput
+%%
+%% End of file `ltugboat.cls'.
diff --git a/Master/texmf-dist/doc/metapost/featpost/latex/macroMan.tex b/Master/texmf-dist/doc/metapost/featpost/latex/macroMan.tex
new file mode 100644
index 00000000000..4e8c9f3a333
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/latex/macroMan.tex
@@ -0,0 +1,1737 @@
+\documentclass[a4paper]{article}
+\newif\ifpdf
+\ifx\pdfoutput\undefined
+ \pdffalse % we do not use PDFLaTeX
+\else
+ \pdfoutput=1 % we use PDFLaTeX
+ \pdftrue
+\fi
+\usepackage{linuxdoc-sgml}
+\usepackage{qwertz}
+\usepackage{url}
+\usepackage[latin1]{inputenc}
+\ifpdf
+ \usepackage[pdftex,colorlinks=true,urlcolor=blue,linkcolor=blue]{hyperref}
+ \pdfcompresslevel=9
+\else
+ \usepackage{t1enc}
+%% \usepackage[dvips]{hyperref}
+\fi
+\usepackage[english]{babel}
+\usepackage{epsfig}
+\usepackage{null}
+\def\addbibtoc{
+\addcontentsline{toc}{section}{\numberline{\mbox{}}\relax\bibname}
+}%end-preamble
+\setcounter{page}{1}
+\urldef{\aaaurl} \url{http://www-math.univ-poitiers.fr/~phan/m3Dplain.html}
+\urldef{\aaburl} \url{http://directory.fsf.org/GNU/3DLDF.html}
+\urldef{\aacurl} \url{http://www.povray.org/}
+\urldef{\aadurl} \url{http://www.blender3d.org/}
+\urldef{\aaeurl} \url{http://jl.photodex.com/dog/}
+\urldef{\aafurl} \url{http://www.flexer.it/galrey/}
+\urldef{\aagurl} \url{http://lince.cii.fc.ul.pt/xcmd/xcmd.html}
+\urldef{\aahurl} \url{http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros/latexmp/}
+\urldef{\aaiurl} \url{http://www.ida.liu.se/~joned/download/mps2eps/}
+\urldef{\aajurl} \url{http://matagalatlante.org/nobre/hyt/technicaldrawfromphoto.html}
+\urldef{\aakurl} \url{http://www.gnuplot.info/}
+\urldef{\aalurl} \url{http://gri.sourceforge.net/}
+\title{FEATPOST macros}
+\author{L. Nobre G., {\ttfamily http://matagalatlante.org}}
+\date{December 2004}
+\abstract{ This document intends to be an explanation of the MetaPost macros defined in the {\ttfamily FEATPOST} package. Its purpose is to draw
+ two or three-dimensional physics diagrams.
+ The {\ttfamily FEATPOST} package is supposed to help you draw figures
+ containing 3D dots, vectors, flat arrows, angles, parametric
+ lines, circles, ellipses, cones, cylinders, spheres, globes, hemispheres, toruses, elliptical frusta,
+ polygons, polyhedra, functional and parametric surfaces, direction fields, field lines
+ and trajectories in vector fields, schematic automobiles, electric charges, etc.
+ The fact that it is a programming language instead of Computer Aided Design (CAD) helps the user to experiment different figure layouts without changing specified geometric relationships among figure elements. Two of the intrinsic MetaPost features which may be important for physics
+ diagrams are: (i) the typesetting power of
+ TeX is easily called when needed and (ii) besides a sufficient
+ number of mathematical operators, geometric relationships may
+ be expressed by linear equations, without explicit assignements.
+ }
+
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+3D in MetaPost is not a new idea. Denis Roegel
+contributed related packages to CTAN some years ago. It was the
+subject of a 1997 TUGboat article (V18, N4, 274-283). Anthony
+Phan has been developing a very elegant package
+called
+{\em m3D} {\tt \aaaurl}
+. Due to his skilled coding, {\ttfamily m3D} can
+handle larger objects and can produce more realistic renderings than
+{\ttfamily FEATPOST}. Another possibilty is
+{\em GNU 3DLDF} {\tt \aaburl}
+.
+In any case we are talking about vector-based abstract diagrams,
+so the functionality of
+these packages is nearer to {\ttfamily GNUPLOT} than to {\ttfamily OpenGL}.
+We could also talk about {\ttfamily
+{\em POV-ray} {\tt \aacurl}
+} or
+{\ttfamily
+{\em blender} {\tt \aadurl}
+} but these
+are focused on ray-traced images, a completely different thing.
+
+Regarding software {\ttfamily FEATPOST} requires only MetaPost but
+reccomends {\ttfamily LaTeX, bash, ImageMagick, ghostscript,
+Linuxdoc, Textutils, dvips, epstopdf, sed, gv, plaympeg,
+{\em dog} {\tt \aaeurl}
+,
+{\em galrey} {\tt \aafurl}
+} and {\ttfamily
+{\em xcmd} {\tt \aagurl}
+}. Also, it is highly beneficial to
+be able to understand and cope with MetaPost error messages as
+{\ttfamily FEATPOST} has no protection against mistaken inputs. One
+probable cause of errors is the use of variables with the name of
+procedures, like
+\begin{tscreen}
+\begin{verbatim}
+X, Y, Z, N, rp, cb, ps
+\end{verbatim}
+\end{tscreen}
+All other procedure names have six or more characters.
+
+The user must be aware that MetaPost has a limited arithmetic power
+and that the author has limited programming skills,
+which may lead to unperfect 3D figures or very long processing time.
+It's advisable not to try very complex diagrams and it's recommended to
+keep 3D coordinates within order 1 (default MetaPost units).
+
+All {\ttfamily FEATPOST} macros are build apon the MetaPost
+{\ttfamily color} variable type. It looks like this:
+\begin{tscreen}
+\begin{verbatim}
+(red,green,blue)
+\end{verbatim}
+\end{tscreen}
+Its components may, nevertheless,
+be arbtitrary numbers, like:
+\begin{tscreen}
+\begin{verbatim}
+(X,Y,Z)
+\end{verbatim}
+\end{tscreen}
+So, the
+{\ttfamily color} type is adequate to define not only colors but
+also 3D points and vectors.
+
+
+\section{Small Tutorial}
+
+One very minimalistic example program could be:
+\begin{tscreen}
+\begin{verbatim}
+beginfig(1);
+ cartaxes(1,1,1);
+endfig;
+end;
+\end{verbatim}
+\end{tscreen}
+where {\ttfamily cartaxes} is a
+{\ttfamily FEATPOST} macro that produces
+the Cartesian referential.
+
+One small example program may be:
+\begin{tscreen}
+\begin{verbatim}
+f := 5.4*(1.5,0.5,1);
+Spread := 30;
+beginfig(1);
+ numeric gridstep, sidenumber, i, j, coord, aa, ab, ac;
+ color pa;
+ gridstep = 0.9;
+ sidenumber = 10;
+ coord = 0.5*sidenumber*gridstep;
+ for i=0 upto sidenumber:
+ for j=0 upto sidenumber:
+ pa := (-coord+j*gridstep,-coord+i*gridstep,0);
+ aa := uniformdeviate(360);
+ ab := uniformdeviate(180);
+ ac := uniformdeviate(90);
+ kindofcube( false, false, pa, aa, ab, ac, 0.4, 0.4, 0.9 );
+ endfor;
+ endfor;
+endfig;
+end.
+\end{verbatim}
+\end{tscreen}
+where {\ttfamily kindofcube}
+is a {\ttfamily FEATPOST} macro that produces
+a rectangular prism (cuboid).
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/kindofcube.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/kindofcube.1.png}}\fi
+\caption{Example that uses {\ttfamily kindofcube}.}
+\end{figure}
+\label{figkindofcube1}
+
+The main variable of any three-dimensional figure is the
+point of view. {\ttfamily FEATPOST} uses the variable {\ttfamily f}
+as the point of view. {\ttfamily Spread} is another global
+variable that controls the size of the projection.
+
+Another example may be:
+\begin{tscreen}
+\begin{verbatim}
+f := (13,7,3.5);
+Spread := 35;
+beginfig(1);
+ numeric i, len, wang, reflen, frac, coordg;
+ numeric fws, NumLines, inray, outay;
+ path conepath, cira, cirb, ella, ellb, tuba, tubb, tubc;
+ color axe, aroc, cubevertex, conecenter, conevertex;
+ color allellaxe, ellaaxe, ellbaxe, pca, pea, pcb, peb;
+ frac := 0.5;
+ len := 0.6;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ reflen := 0.2*fws;
+ outay := 0.45*fws;
+ inray := 0.7*outay;
+ coordg := frac*fws;
+ NumLines := 30;
+ HoriZon := -0.5*fws;
+ setthestage( 0.5*NumLines, 2*fws );
+ cubevertex = (0.12*fws,-0.5*fws,-0.5*fws);
+ kindofcube(false,true,cubevertex,180,0,0,0.65*fws,0.2*fws,fws);
+ aroc := outay*(0,cosd(wang),sind(wang))-0.5*(0,fws,fws);
+ rigorousdisc( inray, true, aroc, outay, axe*len );
+ allellaxe := reflen*( 0.707, 0.707, 0 );
+ ellaaxe := reflen*( 0.707, -0.707, 1.0 );
+ ellbaxe := reflen*( -0.707, 0.707, 1.0 );
+ conecenter = ( coordg, coordg, -0.5*fws );
+ pca := ( coordg, -coordg, -0.5*fws );
+ pcb := ( -coordg, coordg, -0.5*fws );
+ pea := ( coordg, -coordg, 0.9*fws );
+ peb := ( -coordg, coordg, 0.9*fws );
+ cira := goodcirclepath( pca, blue, reflen );
+ cirb := goodcirclepath( pcb, blue, reflen );
+ ella := ellipticpath( pea, allellaxe, ellaaxe );
+ ellb := ellipticpath( peb, allellaxe, ellbaxe );
+ tuba := twocyclestogether( cira, ella );
+ tubb := twocyclestogether( cirb, ellb );
+ tubc := twocyclestogether( ella, ellb );
+ unfill tubb; draw tubb;
+ unfill tubc; draw tubc;
+ unfill tuba; draw tuba;
+ conevertex = conecenter + ( -3.5*reflen, 0, 0.8*fws );
+ verygoodcone(false,conecenter,blue,reflen,conevertex);
+endfig;
+end.
+\end{verbatim}
+\end{tscreen}
+where we find a {\ttfamily rigorousdisc}
+and a {\ttfamily verygoodcone}
+(the nicest {\ttfamily FEATPOST} macros) in addition to
+{\ttfamily setthestage}, {\ttfamily twocyclestogether} and
+{\ttfamily kindofcube}.
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/stageforthree.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/stageforthree.1.png}}\fi
+\caption{Example that uses {\ttfamily rigorousdisc} and {\ttfamily verygoodcone}.}
+\end{figure}
+\label{figstageforthree}
+
+
+\subsection{Mechanics}
+
+The following is the sequence of steps necessary to produce
+the diagrams.
+\begin{enumerate}
+\item To use LaTeX fonts enter the shell command
+\par
+\addvspace{\medskipamount}
+\nopagebreak\hrule
+\begin{verbatim}
+export TEX=latex
+\end{verbatim}
+\nopagebreak\hrule
+\addvspace{\medskipamount}
+\item Make your MetaPost program know {\ttfamily FEATPOST} macros.
+This may be accomplished in two ways:
+\begin{itemize}
+\item Insert the line:
+\begin{tscreen}
+\begin{verbatim}
+input featpost3Dplus2D;
+\end{verbatim}
+\end{tscreen}
+at
+the beginning
+of your program and
+then enter the shell command
+\par
+\addvspace{\medskipamount}
+\nopagebreak\hrule
+\begin{verbatim}
+mpost yourprogram.mp
+\end{verbatim}
+\nopagebreak\hrule
+\addvspace{\medskipamount}
+ or
+\item Pre-compile the macros into a {\ttfamily mem} file,
+for instance:
+\par
+\addvspace{\medskipamount}
+\nopagebreak\hrule
+\begin{verbatim}
+inimpost featpost.mp
+\end{verbatim}
+\nopagebreak\hrule
+\addvspace{\medskipamount}
+ and then run your
+program with
+\par
+\addvspace{\medskipamount}
+\nopagebreak\hrule
+\begin{verbatim}
+mpost -mem featpost yourprogram.mp
+\end{verbatim}
+\nopagebreak\hrule
+\addvspace{\medskipamount}
+\end{itemize}
+\item If your program contains LaTeX text you may insert, at the
+beginning, the lines
+\begin{tscreen}
+\begin{verbatim}
+verbatimtex
+\documentclass{article}
+\begin{document}
+etex
+\end{verbatim}
+\end{tscreen}
+and at the end
+\begin{tscreen}
+\begin{verbatim}
+verbatimtex
+\end{document}
+etex
+\end{verbatim}
+\end{tscreen}
+or make use of the
+
+{\em latexmp} {\tt \aahurl}
+ package.
+\item Pass the produced figure(s) through {\ttfamily dvips}
+if they contain any text. You may do this with the provided
+shell script {\ttfamily laproof}.
+\par
+\addvspace{\medskipamount}
+\nopagebreak\hrule
+\begin{verbatim}
+laproof yourprogram N
+\end{verbatim}
+\nopagebreak\hrule
+\addvspace{\medskipamount}
+ where {\ttfamily N}
+is the figure number. This
+script produces an EPS figure that may be viewed with
+{\ttfamily gv} but that should not be inserted in LaTeX
+documents. Insert the original figure in LaTeX
+documents. Instead of {\ttfamily laproof} you may just as
+well use
+{\em MPS2EPS} {\tt \aaiurl}
+.
+\end{enumerate}
+
+
+
+\subsection{Main Features}
+
+
+\subsubsection{Perspectives}
+
+{\ttfamily FEATPOST} can do three kinds of perspective.
+\begin{tscreen}
+\begin{verbatim}
+f := ( 1.2 , 2.0 , 1.6 );
+Spread := 75;
+
+V1 := (1,1,1);
+V2 := (-1,1,1);
+V3 := (-1,-1,1);
+V4 := (1,-1,1);
+V5 := (1,1,-1);
+V6 := (-1,1,-1);
+V7 := (-1,-1,-1);
+V8 := (1,-1,-1);
+makeface1(1,2,3,4);makeface2(5,6,7,8);
+makeface3(1,2,6,5);makeface4(2,3,7,6);
+makeface5(3,4,8,7);makeface6(4,1,5,8);
+makeline1(1,7);makeline2(2,8);
+makeline3(3,5);makeline4(4,6);
+
+beginfig(1);
+ ParallelProj := true;
+ SphericalDistortion := false;
+ draw_all_test(red,true);
+endfig;
+
+beginfig(2);
+ ParallelProj := false;
+ SphericalDistortion := false;
+ draw_all_test(green,true);
+endfig;
+
+beginfig(3);
+ ParallelProj := false;
+ SphericalDistortion := true;
+ PrintStep := 5;
+ draw_all_test(blue,true);
+endfig;
+
+end;
+\end{verbatim}
+\end{tscreen}
+
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/cubicfigures.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/cubicfigures.1.png}}\fi
+\caption{Orthogonal perspective.}
+\end{figure}
+\label{figcubicfigures1}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/cubicfigures.2,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/cubicfigures.2.png}}\fi
+\caption{Rigorous perspective.}
+\end{figure}
+\label{figcubicfigures2}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/cubicfigures.3,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/cubicfigures.3.png}}\fi
+\caption{Fish-eye perspective.}
+\end{figure}
+\label{figcubicfigures3}
+
+
+\subsubsection{From 3D to 2D}
+
+The most important macro is {\ttfamily rp} that converts 3D points
+to two-dimensional (2D) rigorous, orthogonal
+or fish-eye projections. To draw a line in
+3D-space try
+\begin{tscreen}
+\begin{verbatim}
+draw rp(a)--rp(b);
+\end{verbatim}
+\end{tscreen}
+where
+{\ttfamily a} and {\ttfamily b} are points in space
+(of {\ttfamily color} type).
+But if you're going for fish-eye it's better to
+\begin{tscreen}
+\begin{verbatim}
+draw pathofstraightline(a,b);
+\end{verbatim}
+\end{tscreen}
+If
+you don't know, leave it as
+\begin{tscreen}
+\begin{verbatim}
+drawsegment(a,b,withpen somepen);
+\end{verbatim}
+\end{tscreen}
+
+
+
+\subsubsection{Angles}
+
+When {\ttfamily FEATPOST} was created its main ability was
+to mark and to calculate angles. This is done with the
+macros {\ttfamily angline} and {\ttfamily getangle} as in the
+following program:
+\begin{tscreen}
+\begin{verbatim}
+f := (5,3.5,1);
+beginfig(2);
+ cartaxes(1,1,1);
+ color va, vb, vc, vd;
+ va = (0.29,0.7,1.0);
+ vb = (X(va),Y(va),0);
+ vc = N((-Y(va),X(va),0));
+ vd = (0,Y(vc),0);
+ drawarrow rp(black)--rp(va);
+ draw rp(black)--rp(vb)--rp(va) dashed evenly;
+ draw rp(vc)--rp(vd) dashed evenly;
+ drawarrow rp(black)--rp(vc);
+ squareangline( va, vc, black, 0.15 );
+ angline(va,red,black,0.75,decimal getangle(va,red),lft);
+endfig;
+\end{verbatim}
+\end{tscreen}
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/cartaxes.2,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../allpng/cartaxes.2.gs.png}}\fi
+\caption{Example that uses {\ttfamily cartaxes}, {\ttfamily angline} and {\ttfamily getangle}.}
+\end{figure}
+\label{figcartaxes2}
+
+
+\subsubsection{Intersections}
+
+The most advanced feature of {\ttfamily FEATPOST} is the
+ability to calculate the intersections of planar and
+convex polygons\footnote{Unfortunately, this is also the
+most "bugged" feature.}. It can draw the visible
+part of arbitrary sets of polygons as in
+the following program:
+\begin{tscreen}
+\begin{verbatim}
+numeric phi;
+phi = 0.5*(1+sqrt(5));
+V1 := ( 1, phi,0);V2 := (-1, phi,0);
+V3 := (-1,-phi,0);V4 := ( 1,-phi,0);
+V5 := (0, 1, phi);V6 := (0,-1, phi);
+V7 := (0,-1,-phi);V8 := (0, 1,-phi);
+V9 := ( phi,0, 1);V10:= ( phi,0,-1);
+V11:= (-phi,0,-1);V12:= (-phi,0, 1);
+makeface1(1,2,3,4);makeface2(5,6,7,8);
+makeface3(9,10,11,12);
+beginfig(1);
+ sharpraytrace;
+endfig;
+end
+\end{verbatim}
+\end{tscreen}
+
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/sharpraytrace.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../allpng/sharpraytrace.1.gs.png}}\fi
+\caption{Example that uses {\ttfamily sharpraytrace}.}
+\end{figure}
+\label{figsharpraytrace}
+
+
+\subsubsection{Coming back to 3D from 2D}
+
+It is now possible to do an "automatic perspective tuning"
+with the aid of macro {\ttfamily photoreverse} which is under
+development. Please, refer to example
+{\ttfamily photoreverse.mp} and to
+{\em FeatPost Deeper Technicalities} {\tt \aajurl}
+.
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../alleps/photoreverse.1.eps,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../allpng/photoreverse.1.gs.png}}\fi
+\caption{Example that uses {\ttfamily photoreverse}. It may
+ not work when vertical lines are not vertical in
+ average on the photo.}
+\end{figure}
+\label{figphotoreverse}
+
+
+\paragraph{Coming back to 3D from 1D}
+
+Using the same algorithm of {\ttfamily photoreverse}, the
+macro {\ttfamily improvertex} allows one to approximate a
+point in 3D-space with given distances from three other
+points (an initial guess is required).
+
+
+\section{Reference Manual}
+
+Some words about notation.
+The meaning of macro, function, procedure and routine is the same.
+Global variables are presented like this:
+\begin{tscreen}
+\begin{verbatim}
+vartype var, anothervar
+anothervartype yetanothervar
+\end{verbatim}
+\end{tscreen}
+Explanation of var, anothervar and
+yetanothervar. vartype can be any one of
+MetaPost types but the meaning
+of {\ttfamily color} is a three-dimensional point or vector, not an
+actual color like yellow, black or white. If the meaning is
+an actual color then the type will be {\ttfamily colour}.
+All global variables have default values.
+
+Functions are presented like this:
+\begin{itemize}
+\item returntype {\bfseries function()}
+Explanation of function. returntype can be any one of MetaPost
+types plus global, draw or drawlabel.
+global means that the function
+changes some of the global variables. draw means that
+the function
+changes the currentpicture. drawlabel means that the
+function changes
+the currentpicture and adds text to it.
+\begin{enumerate}
+\item {\ttfamily type1}
+Explanation of the first argument. The type of
+one argument can be any one
+of MetaPost types plus {\ttfamily suffix} or
+{\ttfamily text}.
+\item {\ttfamily type2}
+Explanation of the second argument.
+There is the possibility that the
+function has no arguments. In that case the
+function is presented like
+"returntype {\bfseries function}".
+\item Etc.
+\end{enumerate}
+\end{itemize}
+
+
+
+\subsection{Global variables}
+
+\begin{tscreen}
+\begin{verbatim}
+boolean ParallelProj
+boolean SphericalDistortion
+\end{verbatim}
+\end{tscreen}
+Kind of projection calculated by {\ttfamily rp}.
+By default projections
+are rigorous but if {\ttfamily ParallelProj} is set
+{\ttfamily true} then
+parallel lines remain parallel in the projection.
+It is the same as
+placing the point of view infinitely far without loosing
+sight.
+If {\ttfamily SphericalDistortion} is set {\ttfamily true}
+there will be a
+distortion coming from: (i) the projection being done
+on a sphere of
+center {\ttfamily f} and (ii) this sphere being plaited
+onto the paper page.
+
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/rigorousdiscSD.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/rigorousdiscSD.1.png}}\fi
+\caption{Figure that uses {\ttfamily SphericalDistortion:=true} and {\ttfamily rigorousdisc}.}
+\end{figure}
+\label{sphericaldisc}
+
+\begin{tscreen}
+\begin{verbatim}
+color f, viewcentr
+\end{verbatim}
+\end{tscreen}
+The point of view is {\ttfamily f}. The plane or sphere
+of projection contains
+the center of view {\ttfamily viewcentr}.
+The axis parallel to zz that contains the
+{\ttfamily viewcentr} is projected on a vertical line.
+\begin{tscreen}
+\begin{verbatim}
+numeric Spread
+pair ShiftV, OriginProjPagePos
+numeric PageWidth
+numeric PageHeight
+\end{verbatim}
+\end{tscreen}
+These variables control
+the placement of the projection on the
+paper. {\ttfamily Spread} is the magnification
+and {\ttfamily ShiftV} is the position of the
+{\ttfamily viewcentr} projection on the
+paper. But, if at some point in your program you introduce
+{\ttfamily produce\_auto\_scale} then the
+{\ttfamily currentpicture} will be
+centered at {\ttfamily OriginProjPagePos}
+and scaled to fit inside a rectangle of
+{\ttfamily PageWidth} by {\ttfamily PageHeight}.
+\begin{tscreen}
+\begin{verbatim}
+color V[]
+color L[]p[]
+color F[]p[]
+\end{verbatim}
+\end{tscreen}
+Vertexes, lines and faces.
+The idea here is to draw
+polygons and/or arbitrary lines in 3D space.
+Defining the polygons and
+the lines can be a bit tedious as {\ttfamily FEATPOST} is not
+interactive. First, one defines a list of the
+vertexes ({\ttfamily V[]}) that define the
+polygons and/or the lines.
+There is a list of polygons and a list of
+lines. Each polygon ({\ttfamily F[]p[]}) or
+line ({\ttfamily L[]p[]}) is itself a list of vertexes.
+All vertexes of the same poligon should belong
+to the same plane.
+\begin{tscreen}
+\begin{verbatim}
+numeric NL
+numeric npl[]
+numeric NF
+numeric npf[]
+\end{verbatim}
+\end{tscreen}
+Number of lines, number of vertexes of each line,
+number of faces, number of vertexes of each face.
+\begin{tscreen}
+\begin{verbatim}
+numeric PrintStep
+\end{verbatim}
+\end{tscreen}
+
+{\ttfamily Printstep} is the size of iterative jumps
+along lines. Used by
+{\ttfamily lineraytrace}, {\ttfamily faceraytrace} and
+{\ttfamily pathofstraightline}.
+Big {\ttfamily Printstep}s make fast raytracings.
+\begin{tscreen}
+\begin{verbatim}
+boolean FCD[]
+colour TableC[]
+numeric TableColors
+numeric FC[]
+colour HigColor
+colour SubColor
+color LightSource
+\end{verbatim}
+\end{tscreen}
+{\ttfamily FCD} means "face color defined". The
+{\ttfamily draw\_invisible} macro draws
+polygons in colour, if it is defined. The colour must be
+selected from the table of colours {\ttfamily TableC} that has
+as many as {\ttfamily TableColors}. The colour {\ttfamily FC}
+of each polygon will depend on its position relatively to
+{\ttfamily LightSource} where we suppose there is a lamp that
+emits light coloured {\ttfamily HigColor}. Furthermore the
+colour of each polygon may be modified if it belongs to a
+functional or parametric surface. In this case, if we are
+looking at the polygon from below than {\ttfamily SubColor} is
+subtracted from its colour.
+\begin{tscreen}
+\begin{verbatim}
+numeric RopeColorSeq[]
+numeric RopeColors
+\end{verbatim}
+\end{tscreen}
+
+These are used by {\ttfamily ropepattern}.
+\begin{tscreen}
+\begin{verbatim}
+numeric TDAtiplen
+numeric TDAhalftipbase
+numeric TDAhalfthick
+\end{verbatim}
+\end{tscreen}
+
+These control the shape of Three-Dimensional Arrows.
+\begin{tscreen}
+\begin{verbatim}
+boolean ShadowOn
+numeric HoriZon
+\end{verbatim}
+\end{tscreen}
+
+When {\ttfamily ShadowOn} is set {\ttfamily true}, some objects can
+cast a black shadow on a horizontal plane of {\ttfamily Z}
+coordinate equal to {\ttfamily HoriZon} (an area from
+this plane may be drawn with {\ttfamily setthestage}) as if
+there is a punctual source of light at
+{\ttfamily LightSource}.
+The macros that can produce shadows, in addition to their
+specific production, are
+\begin{itemize}
+\item {\ttfamily emptyline}
+\item {\ttfamily rigorousdisc}
+\item {\ttfamily verygoodcone}
+\item {\ttfamily tropicalglobe}
+\item {\ttfamily whatisthis}
+\item {\ttfamily kindofcube}
+\item {\ttfamily draw\_all\_test}
+\item {\ttfamily fill\_faces}
+\item {\ttfamily positivecharge}
+\end{itemize}
+
+All macros that contain {\bfseries shadow} in their name
+calculate the location of shadows (using {\ttfamily cb}).
+\begin{tscreen}
+\begin{verbatim}
+path VGAborder
+\end{verbatim}
+\end{tscreen}
+
+This path and the macro {\ttfamily produce\_vga\_border} are
+meant to help you clip the {\ttfamily currentpicture} to a 4:3
+rectangle as in a movie frame.
+\begin{tscreen}
+\begin{verbatim}
+pair PhotoPair[]
+color PhotoPoint[]
+numeric PhotoMarks
+\end{verbatim}
+\end{tscreen}
+
+These are used by {\ttfamily photoreverse}.
+\begin{tscreen}
+\begin{verbatim}
+pen ForePen, BackPen
+path CLPath
+numeric NCL
+\end{verbatim}
+\end{tscreen}
+
+These are used by {\ttfamily closedline}.
+
+
+\subsection{Definitions}
+
+\begin{itemize}
+\item global makeline@\#( text1)
+\item global makeface@\#( text1)
+\end{itemize}
+
+Both of these functions ease the task of
+defining lines and polygons. Just
+provide a list of vertexes in the right
+sequence for each polygon and/or
+line. Suppose a tetrahedron
+\begin{tscreen}
+\begin{verbatim}
+V3:=(+1,-1,-1);V2:=(-1,+1,-1);
+V4:=(+1,+1,+1);V1:=(-1,-1,+1);
+makeface2(1,2,3);makeface3(1,2,4);
+makeface1(3,4,1);makeface4(3,4,2);
+\end{verbatim}
+\end{tscreen}
+The
+number in the last makeface or last
+makeline procedure name must be the
+number of polygons or lines. All polygons and lines from 1 upto this
+number must be defined but the sorting may be any of your liking.
+
+
+\subsection{Macros}
+
+
+\subsubsection{Very Basic Macros}
+
+\begin{itemize}
+\item numeric {\bfseries X()}
+Returns the first coordinate of a point or vector (of
+color type). Replaces {\ttfamily redpart}.
+\item numeric {\bfseries Y()}
+Returns the second coordinate of a point or vector.
+Replaces {\ttfamily greenpart}.
+\item numeric {\bfseries Z()}
+Returns the second coordinate of a point or vector.
+Replaces {\ttfamily bluepart}.
+\item draw {\bfseries produce\_auto\_scale}
+The currentpicture is centered in, and adjusted
+to the size of, an A4
+paper page. This avoids the control of {\ttfamily Spread} and
+{\ttfamily ShiftV}.
+\item string {\bfseries cstr()} Converts a color into its
+string. Usefull in combination with {\ttfamily getready}.
+\item string {\bfseries bstr()} Converts a boolean expression into its
+string. Usefull in combination with {\ttfamily getready}.
+\end{itemize}
+
+
+
+\subsubsection{Vector Calculus}
+
+\begin{itemize}
+\item color {\bfseries N()} Unit vector. Returns
+{\ttfamily black} (the null vector) when the argument has
+null norm. The "N" means "normalized".
+\item numeric {\bfseries cdotprod()} Dot product of two
+vectors.
+\item color {\bfseries ccrossprod()} Cross product of two
+vectors.
+\item numeric {\bfseries ndotprod()} Cossine of the angle
+beetween two vectors.
+\item color {\bfseries ncrossprod()} Normalized cross product
+of twovectors.
+\item numeric {\bfseries conorm()} Euclidean norm of a
+vector.
+\item numeric {\bfseries getangle()} Angle beetween two
+vectors.
+\item pair {\bfseries getanglepair()} Orientation angles
+of a vector. The first angle ({\ttfamily xpart}) is
+measured beetween the vector projection on the {\ttfamily XY}
+plane and the {\ttfamily X} axis. The second angle
+({\ttfamily ypart})is measured
+beetween the vector and its projection on the {\ttfamily XY}
+plane. This may be usefull to find the arguments of
+{\ttfamily kindofcube}
+\item color {\bfseries eulerrotation()} Three-dimensional
+rotation of a vector.
+\begin{enumerate}
+\item {\ttfamily numeric} Angle of rotation around the
+{\ttfamily Z} component.
+\item {\ttfamily numeric} Angle of rotation around the
+rotated {\ttfamily Y} component.
+\item {\ttfamily numeric} Angle of rotation around the
+two times rotated {\ttfamily X} component.
+\item {\ttfamily color} Vector to be rotated.
+\end{enumerate}
+\item color {\bfseries randomfear} Generates a randomly
+oriented unit vector.
+\end{itemize}
+
+
+
+\subsubsection{Projection Macros}
+
+\begin{itemize}
+\item pair {\bfseries rp()} Converts spatial positions into
+planar positions on the paper page. The conversion
+considers the values of the following global
+variables: {\ttfamily viewcentr},
+{\ttfamily ParallelProj}, {\ttfamily SphericalDistortion},
+{\ttfamily Spread} and {\ttfamily ShiftV}. When both
+{\ttfamily ParallelProj} and {\ttfamily SphericalDistortion}
+are {\ttfamily false} it won't work if either (i) the
+vectors {\ttfamily f-viewcentr} and {\ttfamily f-R} are
+perpendicular ({\ttfamily R} is the argument) or (ii)
+{\ttfamily f} and {\ttfamily viewcentr} share the same
+{\ttfamily X} and {\ttfamily Y} coordinates.
+\begin{enumerate}
+\item {\ttfamily color} Spatial position.
+\end{enumerate}
+\item color {\bfseries cb()} Calculates the position of the
+shadow of a point. Uses {\ttfamily HoriZon} and
+{\ttfamily LightSource}.
+\begin{enumerate}
+\item {\ttfamily color} Point position.
+\end{enumerate}
+\item color {\bfseries projectpoint()} Calculates the
+intersection beetween a plane and a straight
+line. The plane contains a given point and is
+perpendicular to the line connecting the
+{\ttfamily LightSource} and this same point.
+The line is defined by another given point and the
+{\ttfamily LightSource}. Summary: {\ttfamily projectpoint}
+returns the projection of the second argument on a
+plane that contains the first argument. Can be used to
+draw shadows cast on generic planes.
+\begin{enumerate}
+\item {\ttfamily color} Origin of the projection plane.
+\item {\ttfamily color} Point to be projected.
+\end{enumerate}
+\end{itemize}
+
+
+
+\subsubsection{Plain Basic Macros}
+
+\begin{itemize}
+\item draw {\bfseries signalvertex()} Draws a dot
+sized inversely proportional to its distance from
+the viewpoint {\ttfamily f}.
+\begin{enumerate}
+\item {\ttfamily color} Location.
+\item {\ttfamily numeric} Factor of proportionality
+("size of the dot").
+\item {\ttfamily colour} Colour of the dot.
+\end{enumerate}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/torus.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/torus.1.png}}\fi
+\caption{Figure that uses {\ttfamily signalvertex}.}
+\end{figure}
+\item path {\bfseries pathofstraightline()} When using
+{\ttfamily SphericalDistortion:=true}, straight lines
+look like curves. This macro returns the curved path
+of a straight line beetween two points. This path will
+have a greater {\ttfamily length} ("time") when
+{\ttfamily PrintStep} is made smaller.
+\item drawlabel {\bfseries cartaxes()}
+Cartesean axes with prescribed lenghtes and apropriate labels.
+\begin{enumerate}
+\item {\ttfamily numeric} Length of the {\ttfamily X} axe.
+\item {\ttfamily numeric} Length of the {\ttfamily Y} axe.
+\item {\ttfamily numeric} Length of the {\ttfamily Z} axe.
+\end{enumerate}
+\item draw {\bfseries emptyline()} This procedure produces
+a sort of a tube that can cross over itself. It
+facilitates the drawing of, for instance, thick
+helical curves but it won't
+look right if the curves are drawn getting apart from
+the point of view. Please, accept this inconveniance.
+As like many other {\ttfamily FEATPOST} macros this one
+can produce visually correct diagrams only in limited
+conditions. Can cast a shadow.
+\begin{enumerate}
+\item {\ttfamily boolean} Choose {\ttfamily true} to join
+this line with a previously drawn line.
+\item {\ttfamily numeric} Factor of proportionality
+("diameter of the tube"). The tubes are just
+sequences of dots drawn by {\ttfamily signalvertex}.
+\item {\ttfamily colour} Colour of the tube border.
+\item {\ttfamily colour} Colour of the tube.
+\item {\ttfamily numeric} Total number of dots on the
+tube line.
+\item {\ttfamily numeric} Fraction of the tube diameter
+that is drawn with the tube colour.
+\item {\ttfamily numeric} This is the number of dots
+that are redrawn with the colour of the tube for
+each drawn dot with the color of the tube
+border. Usually 1 or 2 are enough.
+\item {\ttfamily text} This is the name a function
+that returns a 3D point of the line for each value
+of a parameter in beetween 0 and 1.
+\end{enumerate}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/joinedemptylines.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/joinedemptylines.1.png}}\fi
+\caption{Figure that uses {\ttfamily emptyline}.
+ The junction point of two different lines is indicated
+ by an arrow. Note the unperfection on the top
+ right, inside the upper turn. }
+\end{figure}
+\label{joinedemptylines}
+\item draw {\bfseries closedline()} This procedure produces
+a tube that can cross over itself. It
+facilitates the drawing of, for instance, thick
+helical curves but it won't
+look right as its thickness does not change with the
+distance from the point of view. The drawing is
+entirely done in two dimensions, so the tube diameter
+depends on the global variables {\ttfamily ForePen} and
+{\ttfamily BackPen}. There can be more than one closed
+line in a figure but all get the same diameter.
+\begin{enumerate}
+\item {\ttfamily numeric} Total number of path segments
+on the tube line.
+\item {\ttfamily numeric} Use 0.5 or more.
+\item {\ttfamily numeric} Use 0.75 or more.
+\item {\ttfamily text} This is the name a function
+that returns a 3D point of the closed line for each value
+of a parameter in beetween 0 and 1.
+\end{enumerate}
+\item drawlabel {\bfseries angline()}
+Draws an arch beetween two straight lines with a
+common point and places a label
+near the middle of the arch (marks an
+angle).
+\begin{enumerate}
+\item {\ttfamily color} Point of one line.
+\item {\ttfamily color} Point ot the other line.
+\item {\ttfamily color} Common point.
+\item {\ttfamily numeric} Distance beetween the arch and
+the common point.
+\item {\ttfamily picture} Label.
+\item {\ttfamily suffix} Position of the label relatively
+to the middle of the arch. May
+be one of {\ttfamily lft, rt, top, bot, ulft, urt,
+llft} and {\ttfamily lrt}.
+\end{enumerate}
+\item drawlabel {\bfseries anglinen()}
+The same as the previous function but the
+sixth argument is numeric:
+0={\ttfamily rt};
+1={\ttfamily urt};
+2={\ttfamily top};
+3={\ttfamily ulft};
+4={\ttfamily lft};
+5={\ttfamily llft};
+6={\ttfamily bot};
+7={\ttfamily lrt};
+any other number places the label
+on the middle of the arch.
+\item draw {\bfseries squareangline()}
+This is supposed to mark 90 degree angles
+but works for any angle value.
+\begin{enumerate}
+\item {\ttfamily color} Point of one line.
+\item {\ttfamily color} Point ot the other line.
+\item {\ttfamily color} Common point.
+\item {\ttfamily numeric} Distance beetween the "arch"
+and the common point.
+\end{enumerate}
+\item path {\bfseries rigorouscircle()}
+3D circle. The total "time" of this path is 8. This
+small number makes it easy to select parts of the
+path. The circle is drawn using the
+"left-hand-rule". If you put your left-hand thumb
+parallel the circle axe then the other left-hand
+fingers curl in the same sense as the circle
+path. This path allways starts, approching the view
+point, from a point on a diameter of the
+circle that projects orthogonaly to its axe, and
+rotating around the axe in the way of the left-hand-rule.
+\begin{enumerate}
+\item {\ttfamily color} Center of the circle.
+\item {\ttfamily color} Direction orthogonal to the
+circle (circle axe).
+\item {\ttfamily numeric} Radius of the circle.
+\end{enumerate}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/anglinerigorouscircle.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../allpng/anglinerigorouscircle.1.gs.png}}\fi
+\caption{Figure that uses {\ttfamily anglinen} and {\ttfamily rigorouscircle}.}
+\end{figure}
+\item draw {\bfseries tdarrow()} Draws a flat arrow that
+begins at the first argument and ends at the second.
+The shape of the arrow is controled by the global
+variables {\ttfamily TDAtiplen, TDAhalftipbase, TDAhalfthick}.
+\item path {\bfseries twocyclestogether()} This macro
+allows you to draw any solid that has no vertexes
+and that has two, exactly two, planar cyclic edges.
+In fact, it doesn't need to be a solid. Just
+provide the pathes of both cyclic edges as arguments
+but note that the returned path is polygonal.
+In order to complete
+the drawing of this solid you have to choose one of
+the edges to be drawn immediatly afterwards. This is
+done automatically by the {\ttfamily whatisthis} macro
+for the case of two parallel and concentric ellipses.
+\item path {\bfseries ellipticpath()} Produces an elliptic
+path in 3D space.
+\begin{enumerate}
+\item {\ttfamily color} Position of the center.
+\item {\ttfamily color} Major or minor axe.
+\item {\ttfamily color} The other axe.
+\end{enumerate}
+\item drawlabel {\bfseries labelinspace()} Draw some 2D
+{\ttfamily picture} on some 3D plane (only when
+{\ttfamily ParallelProj:=true}).
+\begin{enumerate}
+\item {\ttfamily color} Position for the lower-left
+corner.
+\item {\ttfamily color} Orientation of the picture's
+bottom edge.
+\item {\ttfamily color} Orientation of the picture's
+letf edge.
+\item {\ttfamily text} 2D picture's name.
+\end{enumerate}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/labelinspace.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../allpng/labelinspace.1.gs.png}}\fi
+\caption{Example that uses {\ttfamily labelinspace}.}
+\end{figure}
+\end{itemize}
+
+
+
+\subsubsection{Standard Objects}
+
+\begin{itemize}
+\item path {\bfseries goodcirclepath()}
+Another 3D circle macro. More rigorous
+than {\ttfamily rigorouscircle} but when
+the direction ortogonal to the circle is almost
+orthogonal to the line {\ttfamily viewpoint--center}
+it doesn't work correctly.
+The total "time" of this path is 36.
+\begin{enumerate}
+\item {\ttfamily color} Center of the circle.
+\item {\ttfamily color} Direction ortogonal to
+the circle.
+\item {\ttfamily numeric} Radius of the
+circle.
+\end{enumerate}
+\item draw {\bfseries spatialhalfsfear()} An
+hemisphere. Doesn't work with {\ttfamily f} inside it.
+\begin{enumerate}
+\item {\ttfamily color} Center.
+\item {\ttfamily color} Vector ortogonal to
+the frontier circle and pointing
+out of the concavity.
+\item {\ttfamily numeric} Radius of the
+(hemi)sphere.
+\end{enumerate}
+\item path {\bfseries spatialhalfcircle()}
+And yet another 3D circle macro. Only the visible or the hidden
+part. This is usefull to mark sections of
+cylinders or spherical major circles.
+\begin{enumerate}
+\item {\ttfamily color} Center of the circle.
+\item {\ttfamily color} Direction ortogonal to the
+circle.
+\item {\ttfamily numeric} Radius of the circle.
+\item {\ttfamily boolean} The visible part is selected with
+{\ttfamily true} and the hidden
+with {\ttfamily false}.
+\end{enumerate}
+\item draw {\bfseries rigorousdisc()}
+3D opaque cylinder with/without a hole. Can cast a
+shadow (without the hole).
+\begin{enumerate}
+\item {\ttfamily numeric} Ray of an axial hole.
+\item {\ttfamily boolean} Option for completly opaque cylinder
+({\ttfamily true}) or partial
+pipe ({\ttfamily false}) when there is no hole. When
+the cylinder has an hole this option should be
+{\ttfamily true}.
+\item {\ttfamily color} Center of one circular base.
+\item {\ttfamily numeric} Radius of both circular bases.
+\item {\ttfamily color} Vector that defines the length and
+orientation of the
+cylinder. The addition the third and fifth
+arguments should give the
+position of the center of the other circular base.
+\end{enumerate}
+\item draw {\bfseries verygodcone()} 3D cone. Can cast a shadow.
+\begin{enumerate}
+\item {\ttfamily bolean} Option to draw dashed evenly
+the invisible edge ({\ttfamily true}) or not
+({\ttfamily false}).
+\item {\ttfamily color} Center of the circular base.
+\item {\ttfamily color} Direction ortogonal to the
+circular base.
+\item {\ttfamily numeric} Radius of the circular base.
+\item {\ttfamily color} Position of the vertex
+\end{enumerate}
+\item path {\bfseries rigorousfearpath()}
+3D sphere. Simple but hard.
+\begin{enumerate}
+\item {\ttfamily color} Center position.
+\item {\ttfamily numeric} Radius.
+\end{enumerate}
+\item draw {\bfseries tropicalglobe()} Globe with
+minor circles. Can cast a shadow.
+\begin{enumerate}
+\item {\ttfamily numeric} Number of marked latitudes.
+\item {\ttfamily color} Center position.
+\item {\ttfamily numeric} Radius
+\item {\ttfamily color} Axe orientation.
+\end{enumerate}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/tropicalglobe.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/tropicalglobe.1.png}}\fi
+\caption{Figure that uses {\ttfamily tropicalglobe}.
+ }
+\end{figure}
+\item draw {\bfseries whatisthis()} An elliptic
+frustum. Both edges are elliptic an have the same
+orientation but one may be greater than the other.
+Can cast a shadow.
+\begin{enumerate}
+\item {\ttfamily color} Reference edge center.
+\item {\ttfamily color} Major or minor axe.
+\item {\ttfamily color} The other axe.
+\item {\ttfamily numeric} Length of the original
+cylinder.
+\item {\ttfamily numeric} Edges axes length ratio.
+\end{enumerate}
+\item draw {\bfseries kindofcube()} Polyhedron with six
+orthogonal faces (cuboid).
+\begin{enumerate}
+\item {\ttfamily boolean} Also draw the invisible edges
+{\ttfamily dashed evenly} ({\ttfamily true}) or do not.
+\item {\ttfamily boolean} The reference point may be a
+vertex ({\ttfamily true}) or the center({\ttfamily false}).
+\item {\ttfamily color} Reference point.
+\item {\ttfamily numeric} Alpha1.
+\item {\ttfamily numeric} Alpha2.
+\item {\ttfamily numeric} Alpha3.
+\item {\ttfamily numeric} L1. Length of the first side.
+\item {\ttfamily numeric} L2. Length of the second side.
+\item {\ttfamily numeric} L3. Length of the third side.
+\end{enumerate}
+
+These arguments are represented in the next figure.
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/kindofcube.2,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../allpng/kindofcube.2.gs.png}}\fi
+\caption{Figure that uses and explains {\ttfamily kindofcube}. Note that the three indicated
+ angles may be used as arguments of {\ttfamily eulerrotation}.}
+\end{figure}
+\label{kindofcube2}
+\item draw {\bfseries setthestage()} Produces an horizontal
+square made of squares. Its {\ttfamily Z} coordinate is defined by
+{\ttfamily HoriZon}.
+\begin{enumerate}
+\item {\ttfamily numeric} Number of squares in each side.
+\item {\ttfamily numeric} Size of each side.
+\end{enumerate}
+\item draw {\bfseries setthearena()} Produces an horizontal
+circle made of circles. Its {\ttfamily Z} coordinate is defined by
+{\ttfamily HoriZon}. Due to the fact that the center of a
+circle is not on the center of its central perspective
+projection, this may look a bit strange.
+\begin{enumerate}
+\item {\ttfamily numeric} Number of circles on a
+diameter.
+\item {\ttfamily numeric} Diameter.
+\end{enumerate}
+\item draw {\bfseries smoothtorus()} Toxic donut (not to be
+eaten). Produces an error message when {\ttfamily f} is
+close to the table.
+\begin{enumerate}
+\item {\ttfamily color} Center.
+\item {\ttfamily color} Direction orthogonal to the
+torus plane.
+\item {\ttfamily numeric} Big ray.
+\item {\ttfamily numeric} Small ray.
+\end{enumerate}
+\end{itemize}
+
+
+
+\subsubsection{Composed Objects}
+
+\begin{itemize}
+\item draw {\bfseries positivecharge()} Draws a sphere with a
+plus or minus sign on the surface. The horizontal
+segment of the sign is drawn on the horizontal plane
+that contains the sphere center. The middle point of
+this segment is on a vertical plane containing the
+viewpoint.
+\begin{enumerate}
+\item {\ttfamily boolean} Selects the sign ({\ttfamily true}
+means positive).
+\item {\ttfamily color} Position of the center.
+\item {\ttfamily numeric} Sphere ray.
+\end{enumerate}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/positivecharge.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/positivecharge.1.png}}\fi
+\caption{Figure that uses {\ttfamily positivecharge},
+ {\ttfamily getready} and {\ttfamily doitnow}.
+ }
+\end{figure}
+\item draw {\bfseries simplecar()} Draws a cuboid and four
+discs in a configuration ressembling an automobile. The
+first three arguments of {\ttfamily simplecar} are the same
+as the the last seven arguments of {\ttfamily kindofcube}
+but grouped in colors.
+\begin{enumerate}
+\item {\ttfamily color} Center of the cuboid that
+constitutes the body of the car..
+\item {\ttfamily color} Angles defining the orientation
+of the car (see {\ttfamily kindofcube}).
+\item {\ttfamily color} Dimensions of the car.
+\item {\ttfamily color} Characteristics of the front
+wheels. {\ttfamily redpart}-distance from the
+front. {\ttfamily greenpart}-width of the front wheels (length
+of the cylinders). {\ttfamily bluepart}-wheel ray.
+\item {\ttfamily color} Same as above for the rear wheels
+\end{enumerate}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/simplecar.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/simplecar.1.png}}\fi
+\caption{Figure that uses {\ttfamily setthearena} and
+ {\ttfamily simplecar}. }
+\end{figure}
+\end{itemize}
+
+
+
+\subsubsection{Shadow Pathes}
+
+\begin{itemize}
+\item draw {\bfseries signalshadowvertex()} Draws the
+shadow of a {\ttfamily signalvertex} dot.
+\begin{enumerate}
+\item {\ttfamily color} Location of the light-blocking dot.
+\item {\ttfamily numeric} Factor of proportionality
+("size of the dot").
+\item {\ttfamily colour} Colour of the dot.
+\end{enumerate}
+\item path {\bfseries ellipticshadowpath()} Produces the
+shadow of an elliptic path.
+\begin{enumerate}
+\item {\ttfamily color} Position of the center.
+\item {\ttfamily color} Major or minor axe.
+\item {\ttfamily color} The other axe.
+\end{enumerate}
+\item path {\bfseries circleshadowpath()} Produces the
+shadow of a circle.
+\begin{enumerate}
+\item {\ttfamily color} Center of the circle.
+\item {\ttfamily color} Direction ortogonal to
+the circle.
+\item {\ttfamily numeric} Radius of the
+circle.
+\end{enumerate}
+\item path {\bfseries rigorousfearshadowpath()}
+3D sphere shadow.
+\begin{enumerate}
+\item {\ttfamily color} Center position.
+\item {\ttfamily numeric} Radius.
+\end{enumerate}
+\end{itemize}
+
+
+
+\subsubsection{Differential Equations}
+
+Before we proceed, be aware that solving differential
+equations (DE) is mainly an experimental activity. The most
+probable result of a procedure that atempts to solve a DE
+is garbage. The procedure may be unstable, the solution
+may be littered with singularities or something may go
+wrong. If you don't have a basic understanding of
+differential equations then skip this section, please.
+
+\begin{itemize}
+\item path {\bfseries fieldlinepath()} A vectorial field line is
+everywhere tangent to the field vectors.
+Two different parallel fields
+have the same field lines. So the field only
+constrains the direction of the field lines, not any kind
+of "speed" and, therefore, it is recommended to
+normalize the field before using this macro that
+contains a second-order Runge-Kutta method
+implementation.
+\begin{enumerate}
+\item {\ttfamily numeric} Total number of steps.
+\item {\ttfamily color} Initial position.
+\item {\ttfamily numeric} Step (arc)length.
+\item {\ttfamily text} Name of the function that
+returns a field vector for each 3D position.
+\end{enumerate}
+\item path {\bfseries trajectorypath()} The acceleration of a
+particle in a conservative force field is equal to the
+ratio (conservative force)/(particle mass). The
+acceleration is also equal to the second order time
+derivative of the particle position. This produces a
+second order differential equation that we solve using a
+second-order Runge-Kutta method implementation.
+\begin{enumerate}
+\item {\ttfamily numeric} Total number of steps.
+\item {\ttfamily color} Initial position.
+\item {\ttfamily color} Initial velocity.
+\item {\ttfamily numeric} Time step.
+\item {\ttfamily text} Name of the function that
+returns a (force/mass) vector for each 3D position.
+\end{enumerate}
+\item path {\bfseries magnetictrajectorypath()} The
+acceleration of a
+charged particle in a magnetic field is equal to the
+ratio (magnetic force)/(particle mass) but the magnetic
+force depends on both the velocity and the magnetic field. The
+acceleration is also equal to the second order time
+derivative of the particle position. This produces a
+second order differential equation that we solve using a
+fourth-order Runge-Kutta method implementation.
+\begin{enumerate}
+\item {\ttfamily numeric} Total number of steps.
+\item {\ttfamily color} Initial position.
+\item {\ttfamily color} Initial velocity.
+\item {\ttfamily numeric} Time step.
+\item {\ttfamily text} Name of the function that
+returns a (charge)*(magnetic field)/(partcle mass)
+vector for each 3D position.
+\end{enumerate}
+\end{itemize}
+
+
+
+\subsubsection{Renderers}
+
+\begin{itemize}
+\item draw {\bfseries sharpraytrace} Heavy procedure that
+draws only the visible part of all edges of all defined
+faces. There's no point in using this procedure when
+there are no intersections beetween faces. Any how
+this will not work for non-convex faces nor when
+{\ttfamily SphericalDistortion:=true}.
+\item draw {\bfseries lineraytrace()} Draws only the
+visible part of all defined lines using sequences of dots
+({\ttfamily signalvertex} and {\ttfamily PrintStep}).
+\begin{enumerate}
+\item {\ttfamily numeric} Dot size.
+\item {\ttfamily colour} Dot colour.
+\end{enumerate}
+\item draw {\bfseries faceraytrace()} Draws only the
+visible part of all edges of all defined faces
+using sequences of dots
+({\ttfamily signalvertex} and {\ttfamily PrintStep}).
+\begin{enumerate}
+\item {\ttfamily numeric} Dot size.
+\item {\ttfamily colour} Dot colour.
+\end{enumerate}
+\item draw {\bfseries draw\_all\_test()} Draws all defined
+edges (and lines) in a correct way independently of
+the kind of projection used. Can cast a shadow (but
+the shadow is not correct when
+{\ttfamily SphericalDistortion:=true}).
+\begin{enumerate}
+\item {\ttfamily colour} Colour of the segments.
+\item {\ttfamily boolean} If {\ttfamily true} the lines
+are also drawn.
+\end{enumerate}
+\item draw {\bfseries fill\_faces()} Unfills and draws all
+faces in the order they were defined (without
+sorting). Can cast a shadow.
+\begin{enumerate}
+\item {\ttfamily text} Like the argument of
+{\ttfamily drawoptions} but used only inside this
+macro and only for the edges.
+\end{enumerate}
+\item draw {\bfseries draw\_invisible()} This is a fast way
+of removing hidden lines that doesn't
+allow for intersecting polygons nor
+polygons of very different area. It works by
+sorting all polygons by
+distance to {\ttfamily f} and then by "filling" the
+polygons. This routine may be used to draw graphs
+of 3D surfaces.
+\begin{enumerate}
+\item {\ttfamily boolean} If {\ttfamily true} polygons are
+sorted relatively to
+nearest vertex and, if {\ttfamily false}, relatively to their
+mass center. Choose {\ttfamily false} for surface
+plots.
+\item {\ttfamily boolean} If {\ttfamily false} then the
+polygons are painted with their {\ttfamily FC} colour
+modified by {\ttfamily LightSource}. If {\ttfamily true}
+then the next two arguments are used and the
+polygons are darkened proportionaly to their
+distance from {\ttfamily f}.
+\item {\ttfamily colour} Colour of faces.
+\item {\ttfamily colour} Colour of the edges.
+\end{enumerate}
+\item global {\bfseries getready()} When you don't want to
+edit the source of the MetaPost program, to resort the
+objects so they'll be drawn correctly, use this macro
+and the next.
+\begin{enumerate}
+\item {\ttfamily string} Command line that would draw
+some object. For instance:
+{\ttfamily "rigorousfearpath(black,1);"}.
+\item {\ttfamily color} Reference position of that
+object.
+\end{enumerate}
+\item draw {\bfseries doitnow} The reference positions
+given as arguments of previous {\ttfamily getready} calls
+are used to sort and draw the objects also given as
+string arguments to previous {\ttfamily getready}
+calls. Remember to initialize {\ttfamily Nobjects:=0;}
+before a second figure.
+\end{itemize}
+
+
+
+\subsubsection{Nematics (Direction Fields)}
+
+Nematics are the least ordered liquid crystals. Their
+configurations can be described by direction fields
+(vector fields without arrows). The two following routines
+ease the task of representing their configurations.
+
+\begin{itemize}
+\item global {\bfseries generatedirline()} Defines a single
+straight line segment in a given position and with a
+given orientation.
+\begin{enumerate}
+\item {\ttfamily numeric} Line index number.
+\item {\ttfamily numeric} Angle beetween the {\ttfamily X}
+axe and the projection of the line on the
+{\ttfamily XY} plane.
+\item {\ttfamily numeric} Angle beetween the line
+and the {\ttfamily XY} plane.
+\item {\ttfamily numeric} Line (arc)length.
+\item {\ttfamily color} Position of the line middle
+point.
+\end{enumerate}
+\item draw {\bfseries director\_invisible()} This is a
+direction field renderer that can sort direction
+lines. This routine
+draws straight lines of given "thickness" beetween the
+first all the points
+of all the {\ttfamily L[]p[]} lines. It is supposed to
+help you draw vector fields
+without arrows but taking care of invisibility.
+The lines may be
+generated by {\ttfamily generatedirline} or by other macros.
+\begin{enumerate}
+\item {\ttfamily boolean} When there is no need to sort
+lines you may use {\ttfamily false} here.
+\item {\ttfamily numeric} "Thickness" of the
+direction lines
+\item {\ttfamily boolean} Use {\ttfamily true} for cyclic
+"direction" lines.
+\end{enumerate}
+\end{itemize}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/twistflat.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/twistflat.1.png}}\fi
+\caption{Figure that uses {\ttfamily director\_invisible} and {\ttfamily generatedirline}.}
+\end{figure}
+
+
+
+\subsubsection{Surface Plots}
+
+Many powerfull plotting packages like
+{\ttfamily
+{\em gnuplot} {\tt \aakurl}
+} and
+{\ttfamily
+{\em gri} {\tt \aalurl}
+}
+are freely available. Because of this, {\ttfamily FEATPOST}
+surface plots are geared towards unusual features like
+equilateral triangular grid, hexagonal domain and merging
+together functional and parametric surface descriptions.
+
+\begin{itemize}
+\item draw {\bfseries hexagonaltrimesh()} Plots a
+functional surface on a triangular or hexagonal
+domain. Uses the {\ttfamily LightSource}.
+\begin{enumerate}
+\item {\ttfamily boolean} Select the kind of
+domain. {\ttfamily true} for hexagonal and
+{\ttfamily false} for triangular. The domain is
+centered on the origin ({\ttfamily black}). When the
+domain is hexagonal two of its corners are on the
+{\ttfamily -YY} axe. When the
+domain is triangular one of its corners is on the
+{\ttfamily X} axe.
+\item {\ttfamily numeric} Number of small triangles on
+each side of the triangular domain or three times
+the number of small triangles on
+each side of the hexagonal domain.
+\item {\ttfamily numeric} Length of the triangular
+domain side or three times the hexagonal domain
+side.
+\item {\ttfamily text} Name of the function that
+returns the {\ttfamily Z} coordinate of a surface
+point of coordinates {\ttfamily X} and {\ttfamily Y}.
+\end{enumerate}
+
+\begin{figure}[tbp]
+\ifpdf
+
+\else
+\centerline{\epsfig{file=../allps/hexagonaltrimesh.1,height=5cm,angle=0}}\fi
+\ifpdf
+\centerline{\epsfig{file=../nontextualpng/hexagonaltrimesh.1.png}}\fi
+\caption{Figure that uses {\ttfamily hexagonaltrimesh}.
+ }
+\end{figure}
+\item global {\bfseries partrimesh()} Defines a parametric
+surface that can be drawn with
+{\ttfamily draw\_invisible}. In the following descriptions
+{\ttfamily S} and {\ttfamily T} are the parameters. Remember
+to initialize {\ttfamily NF}. The surface is defined so
+that quadrangles are used whenever possible. If
+impossible, two triangles are used but their
+orientation is selected to maximize the surface
+smoothness. Also note that, unlike
+{\ttfamily hexagonaltrimesh()}, the spatial range you
+require to be visible is always first reshaped into a
+cube and second compressed or extended vertically. How
+much the cube is compressed or extended depends on the
+last {\ttfamily numeric} argument, the compression factor
+for {\ttfamily Z}, meaning that the final height of the
+cube is 2/(compression factor). Thanks to Sebastian
+Sturm for pointing the need to explain this.
+\begin{enumerate}
+\item {\ttfamily numeric} Number of {\ttfamily T} steps.
+\item {\ttfamily numeric} Number of {\ttfamily S} steps.
+\item {\ttfamily numeric} Minimal {\ttfamily T} value.
+\item {\ttfamily numeric} Maximal {\ttfamily T} value.
+\item {\ttfamily numeric} Minimal {\ttfamily S} value.
+\item {\ttfamily numeric} Maximal {\ttfamily S} value.
+\item {\ttfamily numeric} Minimal {\ttfamily X} value.
+\item {\ttfamily numeric} Maximal {\ttfamily X} value.
+\item {\ttfamily numeric} Minimal {\ttfamily Y} value.
+\item {\ttfamily numeric} Maximal {\ttfamily Y} value.
+\item {\ttfamily numeric} Minimal {\ttfamily Z} value.
+\item {\ttfamily numeric} Maximal {\ttfamily Z} value.
+\item {\ttfamily numeric} Compression factor for {\ttfamily Z}
+values.
+\item {\ttfamily text} Name of the function that
+returns a surface point (of {\ttfamily color} type)
+for each pair ({\ttfamily S},{\ttfamily T}).
+\end{enumerate}
+\end{itemize}
+
+
+\end{document}
diff --git a/Master/texmf-dist/doc/metapost/featpost/latex/mflogohack.sty b/Master/texmf-dist/doc/metapost/featpost/latex/mflogohack.sty
new file mode 100644
index 00000000000..7bf5f31aac8
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/latex/mflogohack.sty
@@ -0,0 +1,31 @@
+%%
+%% This is file `mflogohack.sty',
+%%
+%% Copyright (C) 1994--1999 Ulrik Vieth
+%% Hacked without right 2004 L. Nobre G.
+%%
+%% This file is part of the `featpost' package.
+%%
+%% This program is free software; you can redistribute it and/or
+%% modify it under the terms of the LaTeX Project Public License
+%% as described in lppl.txt in the base LaTeX distribution; either
+%% version 1 of the License, or (at your option) any later version.
+%%
+%% This program is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+%%
+\NeedsTeXFormat{LaTeX2e}[1994/06/01]
+\ProvidesPackage{mflogohack}
+[2004/01/29 LaTeX package for Metafont, MetaPost, FeatPost and ANEEMATE logos]
+\DeclareRobustCommand\logofamily{%
+ \not@math@alphabet\logofamily\relax
+ \fontencoding{U}\fontfamily{logo}\selectfont}
+\DeclareTextFontCommand{\textlogo}{\logofamily}
+\def\MF{\textlogo{META}\@dischyph\textlogo{FONT}\@}
+\def\MP{\textlogo{META}\@dischyph\textlogo{POST}\@}
+\def\FP{\textlogo{FEAT}\@dischyph\textlogo{POST}\@}
+\def\AM{\textlogo{ANEE}\@dischyph\textlogo{MATE}\@}
+\endinput
+%%
+%% End of file `mflogohack.sty'.
diff --git a/Master/texmf-dist/doc/metapost/featpost/latex/null.sty b/Master/texmf-dist/doc/metapost/featpost/latex/null.sty
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/latex/null.sty
diff --git a/Master/texmf-dist/doc/metapost/featpost/latex/qwertz.sty b/Master/texmf-dist/doc/metapost/featpost/latex/qwertz.sty
new file mode 100644
index 00000000000..aeade62b172
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/latex/qwertz.sty
@@ -0,0 +1,19 @@
+
+% qwertz TeX macros
+
+\catcode`\"=12
+\sloppy
+\newtheorem{definition}{Definition}
+\newtheorem{proposition}{Proposition}
+\newtheorem{lemma}{Lemma}
+\newtheorem{corollary}{Corollary}
+\newtheorem{theorem}{Theorem}
+\newcommand{\mch}[1]{{\ifmmode#1 \else\(#1\)\fi}}
+\newcommand{\lt}{{\ifmmode{<}\else{\verb+<+}\fi}}
+\newcommand{\gt}{{\ifmmode{>}\else{\verb+>+}\fi}}
+\newcommand{\verbar}{{\ifmmode{|}\else{\tt|}\fi}}
+\newcommand{\idx}[1]{#1\index{#1}}
+\newcommand{\cdx}[1]{#1\index{#1@{\tt #1}}}
+\newcommand{\nidx}[1]{\index{#1}}
+\newcommand{\ncdx}[1]{\index{#1@{\tt #1}}}
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/macro/README.macro b/Master/texmf-dist/doc/metapost/featpost/macro/README.macro
new file mode 100644
index 00000000000..e0ee0478491
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/macro/README.macro
@@ -0,0 +1,13 @@
+The first thing to do here is
+
+ inimpost featpost
+
+But it would be more standard
+putting "featpost3Dplus2D.mp"
+inside /usr/share/texmf/metapost/misc/,
+launching the command "texhash"
+and than uncommenting the line
+
+ %input featpost3Dplus2D;
+
+in the example files.
diff --git a/Master/texmf-dist/doc/metapost/featpost/nontextualpng/cylimple.1.png b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/cylimple.1.png
new file mode 100644
index 00000000000..812f8d4487b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/cylimple.1.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/nontextualpng/globe.1.png b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/globe.1.png
new file mode 100644
index 00000000000..9b016f22a45
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/globe.1.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/nontextualpng/rigorouscone.1.png b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/rigorouscone.1.png
new file mode 100644
index 00000000000..18081be89cd
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/rigorouscone.1.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/nontextualpng/rigorousfearpath.1.png b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/rigorousfearpath.1.png
new file mode 100644
index 00000000000..eab2f9397b6
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/rigorousfearpath.1.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/nontextualpng/rotatnlc.1.png b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/rotatnlc.1.png
new file mode 100644
index 00000000000..41dcb61fa9c
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/rotatnlc.1.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/nontextualpng/stageforthree.2.png b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/stageforthree.2.png
new file mode 100644
index 00000000000..78536f22e49
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/stageforthree.2.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/nontextualpng/torus.5.png b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/torus.5.png
new file mode 100644
index 00000000000..8b10502aef5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/torus.5.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/nontextualpng/torus.6.png b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/torus.6.png
new file mode 100644
index 00000000000..a306e87699f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/torus.6.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/nontextualpng/triangulartrimesh.1.png b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/triangulartrimesh.1.png
new file mode 100644
index 00000000000..b60d9ddc666
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/nontextualpng/triangulartrimesh.1.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/border140.png b/Master/texmf-dist/doc/metapost/featpost/png/border140.png
new file mode 100644
index 00000000000..00fce80f1ce
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/border140.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/borderframetest.png b/Master/texmf-dist/doc/metapost/featpost/png/borderframetest.png
new file mode 100644
index 00000000000..c74f9aba96b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/borderframetest.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/composite.png b/Master/texmf-dist/doc/metapost/featpost/png/composite.png
new file mode 100644
index 00000000000..ac67893127d
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/composite.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/downloadicon.png b/Master/texmf-dist/doc/metapost/featpost/png/downloadicon.png
new file mode 100644
index 00000000000..7ef2e9f90bf
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/downloadicon.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/experfilminifram.png b/Master/texmf-dist/doc/metapost/featpost/png/experfilminifram.png
new file mode 100644
index 00000000000..5578049414a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/experfilminifram.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/featpost2.png b/Master/texmf-dist/doc/metapost/featpost/png/featpost2.png
new file mode 100644
index 00000000000..44b5f8ede98
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/featpost2.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/inifram.png b/Master/texmf-dist/doc/metapost/featpost/png/inifram.png
new file mode 100644
index 00000000000..b936a20286a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/inifram.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/lcdistortsallinifram.png b/Master/texmf-dist/doc/metapost/featpost/png/lcdistortsallinifram.png
new file mode 100644
index 00000000000..319c96c7564
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/lcdistortsallinifram.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/metapostlace.png b/Master/texmf-dist/doc/metapost/featpost/png/metapostlace.png
new file mode 100644
index 00000000000..de39b3c09e5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/metapostlace.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/png/myicon.png b/Master/texmf-dist/doc/metapost/featpost/png/myicon.png
new file mode 100644
index 00000000000..17a2a2376c2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/png/myicon.png
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/featpost/typesetinspace/README.mpy b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/README.mpy
new file mode 100644
index 00000000000..a5903bcd0ec
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/README.mpy
@@ -0,0 +1,21 @@
+The files contained in this directory are, probably, obsolete copies
+of the files with the same name that you should retrieve from
+
+http://www.pragma-ade.com/context/current/cont-tmf.zip
+
+unless you already have CONTEXT installed. These files are provided
+here as an unwarranted short-cut to start experimenting typography
+in three-dimensional space with the aid of FeatPost macro
+"closedpathinspace". See featpost/example/standard/eemcsblabla.mp
+
+Run
+ mpost example.mp
+ perl makempy.pl example --noclean
+
+This will produce the MetaPost program
+ mpy-example.tmp
+that contains the text of example.mp as paths.
+
+These instructions may be found at the end of
+http://matagalatlante.org/nobre/hyt/technicaldrawfromphoto.html
+
diff --git a/Master/texmf-dist/doc/metapost/featpost/typesetinspace/example.mp b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/example.mp
new file mode 100644
index 00000000000..befdb336304
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/example.mp
@@ -0,0 +1,17 @@
+input mp-grph ;
+
+% graphictextformat := "context" ;
+% graphictextformat := "plain" ;
+graphictextformat := "latex" ;
+graphictextdirective "\documentclass[]{article}\usepackage{mathpazo}" ;
+
+beginfig(1);
+ graphictext
+ "\vbox{\hsize10cm $E=mc^2$, bl\'{a}-bl\'{a}.}"
+ scaled 8
+ withdrawcolor blue
+ withfillcolor red
+ withpen pencircle scaled 2pt ;
+endfig;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/featpost/typesetinspace/exampleminimal.mp b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/exampleminimal.mp
new file mode 100644
index 00000000000..639ac3b5d20
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/exampleminimal.mp
@@ -0,0 +1,7 @@
+input mp-grph ;
+beginfig(1);
+ string it;
+ it = "N\~{a}o d\'{a}!";
+ graphictext it;
+endfig;
+end.
diff --git a/Master/texmf-dist/doc/metapost/featpost/typesetinspace/makempy.pl b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/makempy.pl
new file mode 100644
index 00000000000..5b52ee0bb11
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/makempy.pl
@@ -0,0 +1,365 @@
+eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $argv:q'
+ if 0;
+
+#D \module
+#D [ file=makempy.pl,
+#D version=2000.12.14,
+#D title=\METAFUN,
+#D subtitle=\METAPOST\ Text Graphics,
+#D author=Hans Hagen,
+#D date=\currentdate,
+#D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+#C
+#C This module is part of the \CONTEXT\ macro||package and is
+#C therefore copyrighted by \PRAGMA. See licen-en.pdf for
+#C details.
+
+# Tobias Burnus provided the code needed to proper testing
+# of binaries on UNIX as well as did some usefull suggestions
+# to improve the functionality.
+
+# This script uses GhostScript and PStoEdit as well as
+# pdfTeX, and if requested TeXEdit and ConTeXt.
+
+# todo: we can nowadays do without the intermediate step, because GS
+# can now handle PDF quite good
+
+use Getopt::Long ;
+use Config ;
+use strict ;
+
+$Getopt::Long::passthrough = 1 ; # no error message
+$Getopt::Long::autoabbrev = 1 ; # partial switch accepted
+
+my $help = 0 ;
+my $silent = 0 ;
+my $force = 0 ;
+my $noclean = 0 ;
+
+my $amethod = my $pmethod = my $gmethod = 0 ;
+
+my $format = "plain" ; # can be "context" for plain users too
+
+&GetOptions
+ ( "help" => \$help ,
+ "silent" => \$silent ,
+ "force" => \$force ,
+ "pdftops" => \$pmethod ,
+ "xpdf" => \$pmethod ,
+ "acrobat" => \$amethod ,
+ "reader" => \$amethod ,
+ "gs" => \$gmethod ,
+ "ghostscript" => \$gmethod ,
+ "noclean" => \$noclean ) ;
+
+my $mpochecksum = 0 ;
+
+my %tex ; my %start ; my %stop ;
+
+$tex{plain} = "pdftex" ;
+$tex{latex} = "pdflatex" ;
+$tex{context} = "texexec --batch --once --interface=en --pdf" ;
+
+$start{plain} = '' ;
+$stop{plain} = '\end' ;
+
+$start{latex} = '\begin{document}' ;
+$stop{latex} = '\end{document}' ;
+
+$start{context} = '\starttext' ;
+$stop{context} = '\stoptext' ;
+
+my $ghostscript = "" ;
+my $pstoedit = "" ;
+my $pdftops = "" ;
+my $acroread = "" ;
+
+my $wereondos = ($Config{'osname'} =~ /dos|mswin/io) ;
+
+# Unix only: assume that "gs" in the path. We could also
+# use $ghostscipt = system "which gs" but this would require
+# that which is installedd on the system.
+
+sub checkenv
+ { my ($var, $env) = @_ ;
+ if ($var)
+ { return $var }
+ elsif ($ENV{$env})
+ { return $ENV{$env} }
+ else
+ { return $var } }
+
+$ghostscript = checkenv ($ghostscript, "GS_PROG" ) ;
+$ghostscript = checkenv ($ghostscript, "GS" ) ;
+$pstoedit = checkenv ($pstoedit , "PSTOEDIT") ;
+$pdftops = checkenv ($pdftops , "PDFTOPS" ) ;
+$acroread = checkenv ($acroread , "ACROREAD") ;
+
+sub setenv
+ { my ($var, $unix, $win) = @_ ;
+ if ($var)
+ { return $var }
+ elsif ($wereondos)
+ { return $win }
+ else
+ { return $unix } }
+
+$ghostscript = setenv($ghostscript, "gs" , "gswin32c") ;
+$pstoedit = setenv($pstoedit , "pstoedit", "pstoedit") ;
+$pdftops = setenv($pdftops , "pdftops" , "pdftops" ) ;
+$acroread = setenv($acroread , "acroread", "" ) ;
+
+# Force a method if unknown.
+
+unless ($pmethod||$amethod||$gmethod)
+ { if ($wereondos) { $pmethod = 1 } else { $amethod = 1 } }
+
+# Set the error redirection used under Unix:
+# stderr -> stdout
+
+my $logredirection = '>>' ;
+
+# This unfortunally doesn't work with the ksh and simple sh
+#
+# if (!$wereondos)
+# { $logredirection = '2>&1 >>' ; # Bash
+# $logredirection = '>>&' ; # tcsh, Bash
+# default $logredirection. }
+
+# Some TeX Code Snippets.
+
+my $macros = '
+
+% auxiliary macros
+
+\input supp-mis.tex
+
+\def\startTEXpage[scale=#1]%
+ {\output{}
+ \batchmode
+ \pdfoutput=1
+ \pdfcompresslevel=9
+ \hoffset=-1in
+ \voffset=\hoffset
+ \scratchcounter=#1
+ \divide\scratchcounter1000
+ \edef\TEXscale{\the\scratchcounter\space}
+ \forgetall
+ \setbox0=\vbox\bgroup}
+
+\def\stopTEXpage
+ {\egroup
+ \dimen0=\ht0 \advance\dimen0 \dp0
+ \setbox2=\vbox to 10\dimen0
+ {\pdfliteral{\TEXscale 0 0 \TEXscale 0 0 cm}
+ \copy0
+ \pdfliteral{1 0 0 1 0 0 cm}
+ \vfill}
+ \wd2=10\wd0
+ \pdfpageheight=\ht2
+ \pdfpagewidth=\wd2
+ \ScaledPointsToBigPoints{\number\pdfpageheight}\pdfcropheight
+ \ScaledPointsToBigPoints{\number\pdfpagewidth }\pdfcropwidth
+ \expanded{\pdfpageattr{/CropBox [0 0 \pdfcropwidth \space \pdfcropheight]}}
+ \shipout\hbox{\box2}}
+
+% end of auxiliary macros' ;
+
+sub report
+ { return if $silent ;
+ my $str = shift ;
+ if ($str =~ /(.*?)\s+([\:\/])\s+(.*)/o)
+ { if ($1 eq "") { $str = " " } else { $str = $2 }
+ print sprintf("%22s $str %s\n",$1,$3) } }
+
+sub error
+ { report("processing aborted : " . shift) ;
+ exit }
+
+sub process
+ { report("generating : " . shift) }
+
+sub banner
+ { return if $silent ;
+ print "\n" ;
+ report ("MakeMPY 1.1 - MetaFun / PRAGMA ADE 2000-2004") ;
+ print "\n" }
+
+my $metfile = "" ; # main metapost file
+my $mpofile = "" ; # metapost text specifiation file (provided)
+my $mpyfile = "" ; # metapost text picture file (generated)
+my $texfile = "" ; # temporary tex file
+my $pdffile = "" ; # temporary pdf file
+my $tmpfile = "" ; # temporary metapost file
+my $posfile = "" ; # temporary postscript file
+my $logfile = "" ; # temporary log file
+my $errfile = "" ; # final log file (with suffix log)
+
+sub show_help_info
+ { banner ;
+ report ("--help : this message" ) ;
+ report ("--noclean : don't remove temporary files" ) ;
+ report ("--force : force processing (ignore checksum)" ) ;
+ report ("--silent : don't show messages" ) ;
+ print "\n" ;
+ report ("--acrobat : use acrobat (reader) for pdf->ps (on unix)") ;
+ report ("--pdftops : use pdftops (xpdf) pdf->ps") ;
+ report ("--ghostscript : use ghostscript (gs) for pdf->ps") ;
+ print "\n" ;
+ report ("input file : metapost file with graphics") ;
+ report ("programs needed : texexec and english context") ;
+ report (" : pdftops from the xpdf suite, or") ; # page size buggy
+ report (" : pdf2ps and ghostscript, or") ;
+ report (" : acrobat reader for unix, and") ;
+ report (" : pstoedit and ghostscript") ;
+ report ("output file : metapost file with pictures") ;
+ exit }
+
+sub check_input_file
+ { my $file = $ARGV[0] ;
+ if ((!defined($file))||($file eq ""))
+ { banner ; error("no filename given") }
+ else
+ { $file =~ s/\.mp.*$//o ;
+ $metfile = "$file.mp" ;
+ $mpofile = "$file.mpo" ;
+ $mpyfile = "$file.mpy" ;
+ $logfile = "$file.log" ;
+ $texfile = "mpy-$file.tex" ;
+ $pdffile = "mpy-$file.pdf" ;
+ $posfile = "mpy-$file.pos" ;
+ $tmpfile = "mpy-$file.tmp" ;
+ $errfile = "mpy-$file.log" ;
+ if (! -f $metfile)
+ { banner ; error("$metfile is empty") }
+ elsif (-s $mpofile < 32)
+ { unlink $mpofile ; # may exist with zero length
+ unlink $mpyfile ; # get rid of left overs
+ exit }
+ else
+ { banner ; report("processing file : $mpofile") } } }
+
+sub verify_check_sum # checksum calculation from perl documentation
+ { return unless (open (MPO,"$mpofile")) ;
+ $mpochecksum = do { local $/ ; unpack("%32C*",<MPO>) % 65535 } ;
+ close (MPO) ;
+ return unless open (MPY,"$mpyfile") ;
+ my $str = <MPY> ; chomp $str ;
+ close (MPY) ;
+ if ($str =~ /^\%\s*mpochecksum\s*\:\s*(\d+)/o)
+ { if ($mpochecksum eq $1)
+ { report("mpo checksum : $mpochecksum / unchanged") ;
+ exit unless $force }
+ else
+ { report("mpo checksum : $mpochecksum / changed") } } }
+
+sub cleanup_files
+ { my @files = <mpy-*.*> ;
+ foreach (@files) { unless (/\.log/o) { unlink $_ } } }
+
+sub construct_tex_file
+ { my $n = 0 ;
+ unless (open (MPO, "<$mpofile"))
+ { error("unable to open $mpofile") }
+ unless (open (TEX, ">$texfile"))
+ { error("unable to open $texfile") }
+ my $textext = "" ;
+ while (<MPO>)
+ { s/\s*$//mois ;
+ if (/\%\s*format=(\w+)/)
+ { $format = $1 }
+ else # if (!/^\%/)
+ { if (/startTEXpage/o)
+ { ++$n ;
+ $textext .= "$start{$format}\n" ;
+ $start{$format} = "" }
+ $textext .= "$_\n" } }
+ unless (defined($tex{$format})) { $format = "plain" }
+ if ($format eq "context") { $macros = "" }
+ # print TEX "$start{$format}\n$macros\n$textext\n$stop{$format}\n" ;
+ print TEX "$start{$format}\n\n" if $start{$format} ;
+ print TEX "$macros\n" if $macros ;
+ print TEX "$textext\n" if $textext ;
+ print TEX "$stop{$format}\n" if $stop{$format} ;
+ close (MPO) ;
+ close (TEX) ;
+ report("tex format : $format") ;
+ report("requested texts : $n") }
+
+sub construct_mpy_file
+ { unless (open (TMP, "<$tmpfile"))
+ { error("unable to open $tmpfile file") }
+ unless (open (MPY, ">$mpyfile"))
+ { error("unable to open $mpyfile file") }
+ print MPY "% mpochecksum : $mpochecksum\n" ;
+ my $copying = my $n = 0 ;
+ while (<TMP>)
+ { if (s/beginfig/begingraphictextfig/o)
+ { print MPY $_ ; $copying = 1 ; ++$n }
+ elsif (s/endfig/endgraphictextfig/o)
+ { print MPY $_ ; $copying = 0 }
+ elsif ($copying)
+ { print MPY $_ } }
+ close (TMP) ;
+ close (MPY) ;
+ report("processed texts : $n") ;
+ report("produced file : $mpyfile") }
+
+sub run
+ { my ($resultfile, $program,$arguments) = @_ ;
+ my $result = system("$program $arguments $logredirection $logfile") ;
+ unless (-f $resultfile) { error("invalid `$program' run") } }
+
+sub make_pdf_pages
+ { process ("pdf file") ;
+ run ($pdffile, "$tex{$format}", "$texfile") }
+
+sub make_mp_figures
+ { process ("postscript file") ;
+ if ($pmethod) { run($posfile, "$pdftops",
+ "-paper match $pdffile $posfile") }
+ if ($gmethod) { run($posfile, "$ghostscript",
+ "-q -sOutputFile=$posfile -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pswrite $pdffile") }
+ if ($amethod) { run($posfile, "$acroread",
+ "-toPostScript -pairs $pdffile $posfile") } }
+
+sub make_mp_pictures_ps
+ { process ("metapost file") ;
+ run ($tmpfile, "$pstoedit", "-ssp -dt -f mpost $posfile $tmpfile") }
+
+sub make_mp_pictures_pdf
+ { process ("metapost file") ;
+ run ($tmpfile, "$pstoedit", "-ssp -dt -f mpost $pdffile $tmpfile") }
+
+if ($help) { show_help_info }
+
+check_input_file ;
+verify_check_sum ;
+cleanup_files ;
+construct_tex_file ;
+make_pdf_pages ;
+if (1)
+ { make_mp_pictures_pdf ; }
+else
+ { make_mp_figures ;
+ make_mp_pictures_ps ; }
+construct_mpy_file ; # less save : rename $tmpfile, $mpyfile ;
+unless ($noclean) { cleanup_files }
+
+# a simple test file (needs context)
+#
+# % output=pdftex
+#
+# \starttext
+#
+# \startMPpage
+# graphictext
+# "\bf MAKE"
+# scaled 8
+# zscaled (1,2)
+# withdrawcolor \MPcolor{blue}
+# withfillcolor \MPcolor{gray}
+# withpen pencircle scaled 5pt ;
+# \stopMPpage
+#
+# \stoptext
diff --git a/Master/texmf-dist/doc/metapost/featpost/typesetinspace/mp-grph.mp b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/mp-grph.mp
new file mode 100644
index 00000000000..18c43c57b53
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/mp-grph.mp
@@ -0,0 +1,295 @@
+%D \module
+%D [ file=mp-grph.mp,
+%D version=2000.12.14,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=graphic text support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
+%C details.
+
+%D Under construction.
+
+if unknown context_tool : input mp-tool ; fi ;
+if known context_grph : endinput ; fi ;
+
+boolean context_grph ; context_grph := true ;
+
+string CRLF ; CRLF := char 10 & char 13 ;
+
+picture _currentpicture_ ;
+
+def beginfig (expr c) =
+ begingroup
+ charcode := c ;
+ resetfig ;
+ scantokens extra_beginfig ;
+enddef ;
+
+def resetfig =
+ clearxy ;
+ clearit ;
+ clearpen ;
+ pickup defaultpen ;
+ interim linecap := linecap ;
+ interim linejoin := linejoin ;
+ interim miterlimit := miterlimit ;
+ save _background_ ; color _background_ ; _background_ := background ;
+ save background ; color background ; background := _background_ ;
+ drawoptions () ;
+enddef ;
+
+def protectgraphicmacros =
+ save showtext ;
+ save beginfig ; let beginfig = begingraphictextfig ;
+ save endfig ; let endfig = endgraphictextfig ;
+ save end ; let end = relax ;
+ interim prologues := prologues ;
+ resetfig ; % resets currentpicture
+enddef ;
+
+numeric currentgraphictext ; currentgraphictext := 0 ;
+string graphictextformat ; graphictextformat := "plain" ;
+string graphictextstring ; graphictextstring := "" ;
+string graphictextfile ; graphictextfile := "dummy.mpo" ;
+
+def savegraphictext (expr str) =
+ graphictextfile := jobname & ".mpo" ;
+ if (graphictextstring<>"") :
+ write graphictextstring to graphictextfile ;
+ graphictextstring := "" ;
+ fi ;
+ write str to graphictextfile ;
+ let erasegraphictextfile = relax ;
+enddef ;
+
+def erasegraphictextfile =
+ graphictextfile := jobname & ".mpo" ;
+ write EOF to graphictextfile ;
+ let erasegraphictextfile = relax ;
+enddef ;
+
+extra_beginfig := extra_beginfig & " erasegraphictextfile ;" ;
+
+def begingraphictextfig (expr n) =
+ foundpicture := n ; scratchpicture := nullpicture ;
+enddef ;
+
+def endgraphictextfig =
+ if foundpicture = currentgraphictext :
+ expandafter endinput
+ else :
+ scratchpicture := nullpicture ;
+ fi ;
+enddef ;
+
+def loadfigure primary filename =
+ doloadfigure (filename)
+enddef ;
+
+def doloadfigure (expr filename) text figureattributes =
+ begingroup ;
+ save figurenumber, figurepicture, number, fixedplace ;
+ numeric figurenumber ; figurenumber := 0 ;
+ boolean figureshift ; figureshift := true ;
+ picture figurepicture ; figurepicture := currentpicture ;
+ def number primary n = hide(figurenumber := n) enddef ;
+ def fixedplace = hide(figureshift := false) enddef ;
+ protectgraphicmacros ;
+ % defaults
+ interim linecap := rounded ;
+ interim linejoin := rounded ;
+ interim miterlimit := 10 ;
+ %
+ currentpicture := nullpicture ;
+ draw fullcircle figureattributes ; % expand number
+ currentpicture := nullpicture ;
+ def beginfig (expr n) =
+ currentpicture := nullpicture ;
+ if (figurenumber=n) or (figurenumber=0) :
+ let endfig = endinput ;
+ fi ;
+ enddef ;
+ let endfig = relax ;
+ readfile(filename) ;
+ if figureshift :
+ currentpicture := currentpicture shifted -llcorner currentpicture ;
+ fi ;
+ addto figurepicture also currentpicture figureattributes ;
+ currentpicture := figurepicture ;
+ endgroup ;
+enddef ;
+
+def graphictext primary t =
+ dographictext(t)
+enddef ;
+
+def dographictext (expr t) =
+ begingroup ;
+ save figurepicture ; picture figurepicture ;
+ figurepicture := currentpicture ; currentpicture := nullpicture ;
+ if graphictextformat<>"" :
+ graphictextstring :=
+ "% format=" & graphictextformat & CRLF & graphictextstring ;
+ graphictextformat := "" ;
+ fi ;
+ currentgraphictext := currentgraphictext + 1 ;
+ savegraphictext ("\startTEXpage[scale=10000]" & t & "\stopTEXpage") ;
+ dofinishgraphictext
+enddef ;
+
+def redographictext primary t =
+ regraphictext(t)
+enddef ;
+
+def regraphictext (expr t) =
+ begingroup ;
+ save figurepicture ; picture figurepicture ;
+ figurepicture := currentpicture ; currentpicture := nullpicture ;
+ save currentgraphictext ; numeric currentgraphictext ;
+ currentgraphictext := t ;
+ dofinishgraphictext
+enddef ;
+
+%D Believe it or not, but it took me half a day to uncover
+%D the following neccessity:
+%D
+%D \starttypen
+%D save withfillcolor, withdrawcolor ;
+%D \stoptypen
+%D
+%D When we have more than one graphictext, these will be
+%D defined after the first graphic. For some obscure reason,
+%D this means that in the next graphic they will be called, but
+%D afterwards the data and boolean are not set. Don't ask me
+%D why.
+
+def dofinishgraphictext text x_op_x =
+ protectgraphicmacros ; % resets currentpicture
+ interim linecap := butt ; % normally rounded
+ interim linejoin := mitered ; % normally rounded
+ interim miterlimit := 10 ; % todo
+ let normalwithshade = withshade ;
+ save foundpicture, scratchpicture, str ;
+ save fill, draw, withshade, reversefill, outlinefill ;
+ save withfillcolor, withdrawcolor ; % quite important
+ numeric foundpicture ; picture scratchpicture ; string str ;
+ def draw expr p =
+ % the first, naive implementation was:
+ % addto scratchpicture doublepath p withpen currentpen ;
+ % but it is better to turn lines into fills
+ addto scratchpicture contour boundingbox
+ image (addto currentpicture doublepath p withpen currentpen) ;
+ enddef ;
+ def fill expr p =
+ addto scratchpicture contour p withpen currentpen ;
+ enddef ;
+ def f_op_f = enddef ; boolean f_color ; f_color := false ;
+ def d_op_d = enddef ; boolean d_color ; d_color := false ;
+ def s_op_s = enddef ; boolean s_color ; s_color := false ;
+ boolean reverse_fill ; reverse_fill := false ;
+ boolean outline_fill ; outline_fill := false ;
+ def reversefill =
+ hide(reverse_fill := true )
+ enddef ;
+ def outlinefill =
+ hide(outline_fill := true )
+ enddef ;
+ def withshade primary c =
+ hide(def s_op_s = normalwithshade c enddef ; s_color := true )
+ enddef ;
+ def withfillcolor primary c =
+ hide(def f_op_f = withcolor c enddef ; f_color := true )
+ enddef ;
+ def withdrawcolor primary c =
+ hide(def d_op_d = withcolor c enddef ; d_color := true )
+ enddef ;
+ scratchpicture := nullpicture ;
+ addto scratchpicture doublepath origin x_op_x ; % pre-roll
+ for i within scratchpicture : % Below here is a dirty tricky test!
+ if (urcorner dashpart i) = origin : outline_fill := false ; fi ;
+ endfor ;
+ scratchpicture := nullpicture ;
+ readfile(jobname & ".mpy") ;
+ scratchpicture := (scratchpicture shifted -llcorner scratchpicture) scaled (1/10) ;
+ if not d_color and not f_color : d_color := true ; fi
+ if s_color : d_color := false ; f_color := false ; fi ;
+ currentpicture := figurepicture ;
+ if d_color and not reverse_fill :
+ for i within scratchpicture :
+ if f_color and outline_fill :
+ addto currentpicture doublepath pathpart i _op_ x_op_x f_op_f
+ dashed nullpicture ;
+ fi ;
+ if filled i :
+ addto currentpicture doublepath pathpart i _op_ x_op_x d_op_d ;
+ fi ;
+ endfor ;
+ fi ;
+ if f_color :
+ for i within scratchpicture :
+ if filled i :
+ addto currentpicture contour pathpart i _op_ x_op_x f_op_f
+ withpen pencircle scaled 0 ;
+ fi ;
+ endfor ;
+ fi ;
+ if d_color and reverse_fill :
+ for i within scratchpicture :
+ if filled i :
+ addto currentpicture doublepath pathpart i _op_ x_op_x d_op_d ;
+ fi ;
+ endfor ;
+ fi ;
+ if s_color :
+ for i within scratchpicture :
+ if filled i :
+ addto currentpicture contour pathpart i _op_ x_op_x s_op_s ;
+ fi ;
+ endfor ;
+ else :
+ for i within scratchpicture :
+ if stroked i :
+ addto currentpicture doublepath pathpart i _op_ x_op_x d_op_d ;
+ fi ;
+ endfor ;
+ fi ;
+ endgroup ;
+enddef ;
+
+def resetgraphictextdirective =
+ graphictextstring := "" ;
+enddef ;
+
+def graphictextdirective text t =
+ graphictextstring := graphictextstring & t & CRLF ;
+enddef ;
+
+endinput
+
+% example
+
+input mp-grph ;
+
+ graphictextformat := "context" ;
+% graphictextformat := "plain" ;
+% graphictextformat := "latex" ; graphictextdirective "\documentclass[]{article}" ;
+
+beginfig (1) ;
+ graphictext
+ "\vbox{\hsize10cm \input tufte }"
+ scaled 8
+ withdrawcolor blue
+ withfillcolor red
+ withpen pencircle scaled 2pt ;
+endfig ;
+
+beginfig(1) ;
+ loadfigure "gracht.mp" rotated 20 ;
+ loadfigure "koe.mp" number 1 scaled 2 ;
+endfig ;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/featpost/typesetinspace/mp-tool.mp b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/mp-tool.mp
new file mode 100644
index 00000000000..925b9ca4449
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/typesetinspace/mp-tool.mp
@@ -0,0 +1,2366 @@
+%D \module
+%D [ file=mp-tool.mp,
+%D version=1998.02.15,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=auxiliary macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% a cleanup is needed, like using image and alike
+% use a few more "newinternal"'s
+
+%D This module is rather preliminary and subjected to
+%D changes.
+
+if known context_tool : endinput ; fi ;
+
+boolean context_tool ; context_tool := true ;
+
+%D New, version number testing:
+%D
+%D \starttyping
+%D fill fullcircle scaled 2cm withcolor if mpversiongt("0.6") : red else : green fi ;
+%D fill fullcircle scaled 1cm withcolor if mpversionlt(0.6) : blue else : white fi ;
+%D \stoptyping
+
+if not known mpversion : string mpversion ; mpversion := "0.641" ; fi ;
+
+% vardef mpversiongt(expr s) =
+% scantokens (mpversion & " > " & if numeric s : decimal s else : s fi)
+% enddef ;
+% vardef mpversionlt(expr s) =
+% scantokens (mpversion & " < " & if numeric s : decimal s else : s fi)
+% enddef ;
+% vardef mpversioneq(expr s) =
+% scantokens (mpversion & " = " & if numeric s : decimal s else : s fi)
+% enddef ;
+
+%D More interesting:
+%D
+%D \starttyping
+%D fill fullcircle scaled 4cm withcolor if mpversiongt("0.6") : red else : green fi ;
+%D fill fullcircle scaled 2cm withcolor if mpversionlt(0.6) : blue else : white fi ;
+%D fill fullcircle scaled 1cm withcolor if mpversioncmp(0.6,">=") : yellow else : black fi ;
+%D \stoptyping
+
+vardef mpversioncmp(expr s, c) =
+ scantokens (mpversion & c & if numeric s : decimal s else : s fi)
+enddef ;
+
+vardef mpversionlt (expr s) = mpversioncmp(s, "<") enddef ;
+vardef mpversioneq (expr s) = mpversioncmp(s, "=") enddef ;
+vardef mpversiongt (expr s) = mpversioncmp(s, ">") enddef ;
+
+%D We always want \EPS\ conforming output, so we say:
+
+prologues := 2 ; % 1 = troff, 2 = tex
+warningcheck := 0 ;
+
+%D Namespace handling:
+
+% let exclamationmark = ! ;
+% let questionmark = ? ;
+%
+% def unprotect =
+% let ! = relax ;
+% let ? = relax ;
+% enddef ;
+%
+% def protect =
+% let ! = exclamationmark ;
+% let ? = questionmark ;
+% enddef ;
+%
+% unprotect ;
+%
+% mp!some!module = 10 ; show mp!some!module ; show somemodule ;
+%
+% protect ;
+
+%D A semicolor to be used in specials: ? ? ?
+
+string semicolor ; semicolor := char 59 ;
+
+%D By including this module, \METAPOST\ automatically writes a
+%D high resolution boundingbox to the \POSTSCRIPT\ file. This
+%D hack is due to John Hobby himself.
+
+% When somehow the first one gets no HiRes, then make sure
+% that the format matches the mem sizes in the config file.
+
+% eerste " " er uit
+
+string space ; space = char 32 ;
+
+vardef ddecimal primary p =
+ decimal xpart p & " " & decimal ypart p
+enddef ;
+
+extra_endfig := extra_endfig
+ & "special "
+ & "("
+ & ditto
+ & "%%HiResBoundingBox: "
+ & ditto
+ & "&ddecimal llcorner currentpicture"
+ & "&space"
+ & "&ddecimal urcorner currentpicture"
+ & ");";
+
+%D Also handy (when we flush colors):
+
+vardef dddecimal primary c =
+ decimal redpart c & " " & decimal greenpart c & " " & decimal bluepart c
+enddef ;
+
+%D We have standardized data file names:
+
+if not known _data_prefix_ :
+
+ string _data_prefix_ ; _data_prefix_ = "mpd-" ;
+ string _data_suffix_ ; _data_suffix_ = ".tmp" ;
+
+fi ;
+
+def data_file =
+ _data_prefix_ & decimal charcode & _data_suffix_
+enddef ;
+
+%D Because \METAPOST\ has a hard coded limit of 4~datafiles,
+%D we need some trickery when we have multiple files.
+
+if unknown collapse_data :
+ boolean collapse_data ; collapse_data := false ;
+fi ;
+
+boolean savingdata ; savingdata := false ;
+
+def savedata expr txt =
+ if collapse_data :
+ write if savingdata : txt else :
+ "\MPdata{" & decimal charcode & "}{" & txt & "}"
+ fi
+ & "%" to jobname & _data_suffix_ ;
+ else :
+ write txt to data_file ;
+ fi ;
+enddef ;
+
+def startsavingdata =
+ savingdata := true ;
+ if collapse_data :
+ write
+ "\MPdata{" & decimal charcode & "}{%"
+ to
+ jobname & _data_suffix_ ;
+ fi ;
+enddef ;
+
+def stopsavingdata =
+ savingdata := false ;
+ if collapse_data :
+ write "}%" to jobname & _data_suffix_ ;
+ fi ;
+enddef ;
+
+%D Instead of a keystroke eating save and allocation
+%D sequence, you can use the \citeer {new} alternatives to
+%D save and allocate in one command.
+
+def newcolor text v = forsuffixes i=v : save i ; color i ; endfor ; enddef ;
+def newnumeric text v = forsuffixes i=v : save i ; numeric i ; endfor ; enddef ;
+def newboolean text v = forsuffixes i=v : save i ; boolean i ; endfor ; enddef ;
+def newtransform text v = forsuffixes i=v : save i ; transform i ; endfor ; enddef ;
+def newpath text v = forsuffixes i=v : save i ; path i ; endfor ; enddef ;
+def newpicture text v = forsuffixes i=v : save i ; picture i ; endfor ; enddef ;
+def newstring text v = forsuffixes i=v : save i ; string i ; endfor ; enddef ;
+
+%D Sometimes we don't want parts of the graphics add to the
+%D bounding box. One way of doing this is to save the bounding
+%D box, draw the graphics that may not count, and restore the
+%D bounding box.
+%D
+%D \starttypen
+%D push_boundingbox currentpicture;
+%D pop_boundingbox currentpicture;
+%D \stoptypen
+%D
+%D The bounding box can be called with:
+%D
+%D \starttypen
+%D boundingbox currentpicture
+%D inner_boundingbox currentpicture
+%D outer_boundingbox currentpicture
+%D \stoptypen
+%D
+%D Especially the latter one can be of use when we include
+%D the graphic in a document that is clipped to the bounding
+%D box. In such occasions one can use:
+%D
+%D \starttypen
+%D set_outer_boundingbox currentpicture;
+%D \stoptypen
+%D
+%D Its counterpart is:
+%D
+%D \starttypen
+%D set_inner_boundingbox p
+%D \stoptypen
+
+path pushed_boundingbox;
+
+def push_boundingbox text p =
+ pushed_boundingbox := boundingbox p;
+enddef;
+
+def pop_boundingbox text p =
+ setbounds p to pushed_boundingbox;
+enddef;
+
+vardef boundingbox primary p =
+ if (path p) or (picture p) :
+ llcorner p -- lrcorner p -- urcorner p -- ulcorner p
+ else :
+ origin
+ fi -- cycle
+enddef;
+
+vardef inner_boundingbox primary p =
+ top rt llcorner p --
+ top lft lrcorner p --
+ bot lft urcorner p --
+ bot rt ulcorner p -- cycle
+enddef;
+
+vardef outer_boundingbox primary p =
+ bot lft llcorner p --
+ bot rt lrcorner p --
+ top rt urcorner p --
+ top lft ulcorner p -- cycle
+enddef;
+
+def innerboundingbox = inner_boundingbox enddef ;
+def outerboundingbox = outer_boundingbox enddef ;
+
+vardef set_inner_boundingbox text q =
+ setbounds q to inner_boundingbox q;
+enddef;
+
+vardef set_outer_boundingbox text q =
+ setbounds q to outer_boundingbox q;
+enddef;
+
+%D Some missing functions can be implemented rather
+%D straightforward:
+
+numeric Pi ; Pi := 3.1415926 ;
+
+vardef sqr primary x = (x*x) enddef ;
+vardef log primary x = (if x=0: 0 else: mlog(x)/mlog(10) fi) enddef ;
+vardef ln primary x = (if x=0: 0 else: mlog(x)/256 fi) enddef ;
+vardef exp primary x = ((mexp 256)**x) enddef ;
+vardef inv primary x = (if x=0: 0 else: x**-1 fi) enddef ;
+
+vardef pow (expr x,p) = (x**p) enddef ;
+
+vardef asin primary x = (x+(x**3)/6+3(x**5)/40) enddef ;
+vardef acos primary x = (asin(-x)) enddef ;
+vardef atan primary x = (x-(x**3)/3+(x**5)/5-(x**7)/7) enddef ;
+vardef tand primary x = (sind(x)/cosd(x)) enddef ;
+
+%D Here are Taco Hoekwater's alternatives (but
+%D vardef'd and primaried).
+
+pi := 3.1415926 ; radian := 180/pi ; % 2pi*radian = 360 ;
+
+vardef tand primary x = (sind(x)/cosd(x)) enddef ;
+vardef cotd primary x = (cosd(x)/sind(x)) enddef ;
+
+vardef sin primary x = (sind(x*radian)) enddef ;
+vardef cos primary x = (cosd(x*radian)) enddef ;
+vardef tan primary x = (sin(x)/cos(x)) enddef ;
+vardef cot primary x = (cos(x)/sin(x)) enddef ;
+
+vardef asin primary x = angle((1+-+x,x)) enddef ;
+vardef acos primary x = angle((x,1+-+x)) enddef ;
+
+vardef invsin primary x = ((asin(x))/radian) enddef ;
+vardef invcos primary x = ((acos(x))/radian) enddef ;
+
+vardef acosh primary x = ln(x+(x+-+1)) enddef ;
+vardef asinh primary x = ln(x+(x++1)) enddef ;
+
+vardef sinh primary x = save xx ; xx = exp x ; (xx-1/xx)/2 enddef ;
+vardef cosh primary x = save xx ; xx = exp x ; (xx+1/xx)/2 enddef ;
+
+%D We provide two macros for drawing stripes across a shape.
+%D The first method (with the n suffix) uses another method,
+%D slower in calculation, but more efficient when drawn. The
+%D first macro divides the sides into n equal parts. The
+%D first argument specifies the way the lines are drawn, while
+%D the second argument identifier the way the shape is to be
+%D drawn.
+%D
+%D \starttypen
+%D stripe_path_n
+%D (dashed evenly withcolor blue)
+%D (filldraw)
+%D fullcircle xscaled 100 yscaled 40 shifted (50,50) withpen pencircle scaled 4;
+%D \stoptypen
+%D
+%D The a (or angle) alternative supports arbitrary angles and
+%D is therefore more versatile.
+%D
+%D \starttypen
+%D stripe_path_a
+%D (withpen pencircle scaled 2 withcolor red)
+%D (draw)
+%D fullcircle xscaled 100 yscaled 40 withcolor blue;
+%D \stoptypen
+%D
+%D The first alternative obeys:
+
+stripe_n := 10;
+stripe_slot := 3;
+
+%D When no pen dimensions are passed, the slot determines
+%D the spacing.
+%D
+%D The angle alternative is influenced by:
+
+stripe_gap := 5;
+stripe_angle := 45;
+
+def stripe_path_n (text s_spec) (text s_draw) expr s_path =
+ do_stripe_path_n (s_spec) (s_draw) (s_path)
+enddef;
+
+def do_stripe_path_n (text s_spec) (text s_draw) (expr s_path) text s_text =
+ begingroup
+ save curpic, newpic, bb, pp, ww;
+ picture curpic, newpic;
+ path bb, pp;
+ pp := s_path;
+ curpic := currentpicture;
+ currentpicture := nullpicture;
+ s_draw pp s_text;
+ bb := boundingbox currentpicture;
+ newpic := currentpicture;
+ currentpicture := nullpicture;
+ ww := min(ypart urcorner newpic - ypart llcorner newpic,
+ xpart urcorner newpic - xpart llcorner newpic);
+ ww := ww/(stripe_slot*stripe_n);
+ for i=1/stripe_n step 1/stripe_n until 1:
+ draw point (1+i) of bb -- point (3-i) of bb
+ withpen pencircle scaled ww s_spec ;
+ endfor;
+ for i=0 step 1/stripe_n until 1:
+ draw point (3+i) of bb -- point (1-i) of bb
+ withpen pencircle scaled ww s_spec;
+ endfor;
+ clip currentpicture to pp;
+ addto newpic also currentpicture;
+ currentpicture := curpic;
+ addto currentpicture also newpic;
+ endgroup
+enddef;
+
+def stripe_path_a (text s_spec) (text s_draw) expr s_path =
+ do_stripe_path_a (s_spec) (s_draw) (s_path)
+enddef;
+
+def do_stripe_path_a (text s_spec) (text s_draw) (expr s_path) text s_text =
+ begingroup
+ save curpic, newpic, pp; picture curpic, newpic; path pp ;
+ pp := s_path ;
+ curpic := currentpicture;
+ currentpicture := nullpicture;
+ s_draw pp s_text ;
+ def do_stripe_rotation (expr p) =
+ (currentpicture rotatedaround(center p,stripe_angle))
+ enddef ;
+ s_max := max
+ (xpart llcorner do_stripe_rotation(currentpicture),
+ xpart urcorner do_stripe_rotation(currentpicture),
+ ypart llcorner do_stripe_rotation(currentpicture),
+ ypart urcorner do_stripe_rotation(currentpicture));
+ newpic := currentpicture;
+ currentpicture := nullpicture;
+ for i=-s_max-.5stripe_gap step stripe_gap until s_max:
+ draw (-s_max,i)--(s_max,i) s_spec;
+ endfor;
+ currentpicture := do_stripe_rotation(newpic);
+ clip currentpicture to pp ;
+ addto newpic also currentpicture;
+ currentpicture := curpic;
+ addto currentpicture also newpic;
+ endgroup
+enddef;
+
+%D A few normalizing macros:
+%D
+%D \starttypen
+%D xscale_currentpicture ( width )
+%D yscale_currentpicture ( height )
+%D xyscale_currentpicture ( width, height )
+%D scale_currentpicture ( width, height )
+%D \stoptypen
+
+% def xscale_currentpicture(expr the_width) =
+% natural_width := xpart urcorner currentpicture - xpart llcorner currentpicture;
+% currentpicture := currentpicture scaled (the_width/natural_width) ;
+% enddef;
+%
+% def yscale_currentpicture(expr the_height ) =
+% natural_height := ypart urcorner currentpicture - ypart llcorner currentpicture;
+% currentpicture := currentpicture scaled (the_height/natural_height) ;
+% enddef;
+%
+% def xyscale_currentpicture(expr the_width, the_height) =
+% natural_width := xpart urcorner currentpicture - xpart llcorner currentpicture;
+% natural_height := ypart urcorner currentpicture - ypart llcorner currentpicture;
+% currentpicture := currentpicture
+% xscaled (the_width/natural_width)
+% yscaled (the_height/natural_height) ;
+% enddef;
+%
+% def scale_currentpicture(expr the_width, the_height) =
+% xscale_currentpicture(the_width) ;
+% yscale_currentpicture(the_height) ;
+% enddef;
+
+% nog eens uitbreiden zodat path en pic worden afgehandeld.
+
+% natural_width := xpart urcorner currentpicture - xpart llcorner currentpicture;
+% currentpicture := currentpicture scaled (the_width/natural_width) ;
+
+% TODO TODO TODO TODO, not yet ok
+
+primarydef p xsized w =
+ (p if (bbwidth (p)>0) and (w>0) : scaled (w/bbwidth (p)) fi)
+enddef ;
+
+primarydef p ysized h =
+ (p if (bbheight(p)>0) and (h>0) : scaled (h/bbheight(p)) fi)
+enddef ;
+
+primarydef p xysized s =
+ begingroup ;
+ save wh, w, h ; pair wh ; numeric w, h ;
+ wh := paired (s) ; w := bbwidth(p) ; h := bbheight(p) ;
+ (p if (w>0) and (h>0) :
+ if xpart wh > 0 : xscaled (xpart wh/w) fi
+ if ypart wh > 0 : yscaled (ypart wh/h) fi
+ fi)
+ endgroup
+enddef ;
+
+primarydef p sized wh =
+ (p xysized wh)
+enddef ;
+
+def xscale_currentpicture(expr w) =
+ currentpicture := currentpicture xsized w ;
+enddef;
+
+def yscale_currentpicture(expr h) =
+ currentpicture := currentpicture ysized h ;
+enddef;
+
+def xyscale_currentpicture(expr w, h) =
+ currentpicture := currentpicture xysized (w,h) ;
+enddef;
+
+def scale_currentpicture(expr w, h) =
+ currentpicture := currentpicture xsized w ;
+ currentpicture := currentpicture ysized h ;
+enddef;
+
+%D A full circle is centered at the origin, while a unitsquare
+%D is located in the first quadrant. Now guess what kind of
+%D path fullsquare and unitcircle do return.
+
+path fullsquare, unitcircle ;
+
+fullsquare := unitsquare shifted - center unitsquare ;
+unitcircle := fullcircle shifted urcorner fullcircle ;
+
+%D Some more paths:
+
+path urcircle, ulcircle, llcircle, lrcircle ;
+
+urcircle := origin--(+.5,0)&(+.5,0){up} ..(0,+.5)&(0,+.5)--cycle ;
+ulcircle := origin--(0,+.5)&(0,+.5){left} ..(-.5,0)&(-.5,0)--cycle ;
+llcircle := origin--(-.5,0)&(-.5,0){down} ..(0,-.5)&(0,-.5)--cycle ;
+lrcircle := origin--(0,-.5)&(0,-.5){right}..(+.5,0)&(+.5,0)--cycle ;
+
+path tcircle, bcircle, lcircle, rcircle ;
+
+tcircle = origin--(+.5,0)&(+.5,0){up} ..(0,+.5)..{down} (-.5,0)--cycle ;
+bcircle = origin--(-.5,0)&(-.5,0){down} ..(0,-.5)..{up} (+.5,0)--cycle ;
+lcircle = origin--(0,+.5)&(0,+.5){left} ..(-.5,0)..{right}(0,-.5)--cycle ;
+rcircle = origin--(0,-.5)&(0,-.5){right}..(+.5,0)..{left} (0,+.5)--cycle ;
+
+path urtriangle, ultriangle, lltriangle, lrtriangle ;
+
+urtriangle := origin--(+.5,0)--(0,+.5)--cycle ;
+ultriangle := origin--(0,+.5)--(-.5,0)--cycle ;
+lltriangle := origin--(-.5,0)--(0,-.5)--cycle ;
+lrtriangle := origin--(0,-.5)--(+.5,0)--cycle ;
+
+path unitdiamond, fulldiamond ;
+
+unitdiamond := (.5,0)--(1,.5)--(.5,1)--(0,.5)--cycle ;
+fulldiamond := unitdiamond shifted - center unitdiamond ;
+
+%D More robust:
+
+% let normalscaled = scaled ;
+% let normalxscaled = xscaled ;
+% let normalyscaled = yscaled ;
+%
+% def scaled expr s = normalscaled (s) enddef ;
+% def xscaled expr s = normalxscaled (s) enddef ;
+% def yscaled expr s = normalyscaled (s) enddef ;
+
+%D Shorter
+
+primarydef p xyscaled q =
+ begingroup ; save qq ; pair qq ; qq = paired(q) ;
+ ( p
+ if xpart qq<>0 : xscaled (xpart qq) fi
+ if ypart qq<>0 : yscaled (ypart qq) fi )
+ endgroup
+enddef ;
+
+%D Experimenteel, zie folder-3.tex.
+
+def set_grid(expr w, h, nx, ny) =
+ boolean grid[][] ; boolean grid_full ;
+ grid_w := w ;
+ grid_h := h ;
+ grid_nx := nx ;
+ grid_ny := ny ;
+ grid_x := round(w/grid_nx) ; % +.5) ;
+ grid_y := round(h/grid_ny) ; % +.5) ;
+ grid_left := (1+grid_x)*(1+grid_y) ;
+ grid_full := false ;
+ for i=0 upto grid_x:
+ for j=0 upto grid_y:
+ grid[i][j] := false ;
+ endfor ;
+ endfor ;
+enddef ;
+
+vardef new_on_grid(expr _dx_, _dy_) =
+ dx := _dx_ ;
+ dy := _dy_ ;
+ ddx := min(round(dx/grid_nx),grid_x) ; % +.5),grid_x) ;
+ ddy := min(round(dy/grid_ny),grid_y) ; % +.5),grid_y) ;
+ if not grid_full and not grid[ddx][ddy]:
+ grid[ddx][ddy] := true ;
+ grid_left := grid_left-1 ;
+ grid_full := (grid_left=0) ;
+ true
+ else:
+ false
+ fi
+enddef ;
+
+%D usage: \type{innerpath peepholed outerpath}.
+%D
+%D beginfig(1);
+%D def fullsquare = (unitsquare shifted -center unitsquare) enddef ;
+%D fill (fullsquare scaled 200) withcolor red ;
+%D path p ; p := (fullcircle scaled 100) ; bboxmargin := 0 ;
+%D fill p peepholed bbox p ;
+%D endfig;
+
+secondarydef p peepholed q =
+ begingroup ;
+ save start ; pair start ; start := point 0 of p ;
+ if xpart start >= xpart center p :
+ if ypart start >= ypart center p :
+ urcorner q -- ulcorner q -- llcorner q -- lrcorner q --
+ reverse p -- lrcorner q -- cycle
+ else :
+ lrcorner q -- urcorner q -- ulcorner q -- llcorner q --
+ reverse p -- llcorner q -- cycle
+ fi
+ else :
+ if ypart start > ypart center p :
+ ulcorner q -- llcorner q -- lrcorner q -- urcorner q --
+ reverse p -- urcorner q -- cycle
+ else :
+ llcorner q -- lrcorner q -- urcorner q -- ulcorner q --
+ reverse p -- ulcorner q -- cycle
+ fi
+ fi
+ endgroup
+enddef ;
+
+boolean intersection_found ;
+
+secondarydef p intersection_point q =
+ begingroup
+ save x_, y_ ;
+ (x_,y_) = p intersectiontimes q ;
+ if x_<0 :
+ intersection_found := false ;
+ center p % origin
+ else :
+ intersection_found := true ;
+ .5[point x_ of p, point y_ of q]
+ fi
+ endgroup
+enddef ;
+
+%D New, undocumented, experimental:
+
+vardef tensecircle (expr width, height, offset) =
+ ((-width/2,-height/2) ... (0,-height/2-offset) ...
+ (+width/2,-height/2) ... (+width/2+offset,0) ...
+ (+width/2,+height/2) ... (0,+height/2+offset) ...
+ (-width/2,+height/2) ... (-width/2-offset,0) ... cycle)
+enddef ;
+
+%vardef tensecircle (expr width, height, offset) =
+% ((-width/2,-height/2)..(0,-height/2-offset)..(+width/2,-height/2) &
+% (+width/2,-height/2)..(+width/2+offset,0)..(+width/2,+height/2) &
+% (+width/2,+height/2)..(0,+height/2+offset)..(-width/2,+height/2) &
+% (-width/2,+height/2)..(-width/2-offset,0)..(-width/2,-height/2)..cycle)
+%enddef ;
+
+vardef roundedsquare (expr width, height, offset) =
+ ((offset,0)--(width-offset,0){right} ..
+ (width,offset)--(width,height-offset){up} ..
+ (width-offset,height)--(offset,height){left} ..
+ (0,height-offset)--(0,offset){down} .. cycle)
+enddef ;
+
+%D Some colors.
+
+color cyan ; cyan = (0,1,1) ;
+color magenta ; magenta = (1,0,1) ;
+color yellow ; yellow = (1,1,0) ;
+
+%D Well, this is the dangerous and naive version:
+
+def drawfill text t =
+ fill t ;
+ draw t ;
+enddef;
+
+%D This two step approach saves the path first, since it can
+%D be a function. Attributes must not be randomized.
+
+def drawfill expr c =
+ path _c_ ; _c_ := c ;
+ do_drawfill
+enddef ;
+
+def do_drawfill text t =
+ draw _c_ t ;
+ fill _c_ t ;
+enddef;
+
+def undrawfill expr c =
+ drawfill c withcolor background
+enddef ;
+
+%D Moved from mp-char.mp
+
+vardef paired (expr d) =
+ if pair d : d else : (d,d) fi
+enddef ;
+
+vardef tripled (expr d) =
+ if color d : d else : (d,d,d) fi
+enddef ;
+
+primarydef p enlarged d =
+ (p llmoved d -- p lrmoved d -- p urmoved d -- p ulmoved d -- cycle)
+enddef;
+
+primarydef p llenlarged d =
+ (p llmoved d -- lrcorner p -- urcorner p -- ulcorner p -- cycle)
+enddef ;
+
+primarydef p lrenlarged d =
+ (llcorner p -- p lrmoved d -- urcorner p -- ulcorner p -- cycle)
+enddef ;
+
+primarydef p urenlarged d =
+ (llcorner p -- lrcorner p -- p urmoved d -- ulcorner p -- cycle)
+enddef ;
+
+primarydef p ulenlarged d =
+ (llcorner p -- lrcorner p -- urcorner p -- p ulmoved d -- cycle)
+enddef ;
+
+primarydef p llmoved d =
+ ((llcorner p) shifted (-xpart paired(d),-ypart paired(d)))
+enddef ;
+
+primarydef p lrmoved d =
+ ((lrcorner p) shifted (+xpart paired(d),-ypart paired(d)))
+enddef ;
+
+primarydef p urmoved d =
+ ((urcorner p) shifted (+xpart paired(d),+ypart paired(d)))
+enddef ;
+
+primarydef p ulmoved d =
+ ((ulcorner p) shifted (-xpart paired(d),+ypart paired(d)))
+enddef ;
+
+primarydef p leftenlarged d =
+ ((llcorner p) shifted (-d,0) -- lrcorner p --
+ urcorner p -- (ulcorner p) shifted (-d,0) -- cycle)
+enddef ;
+
+primarydef p rightenlarged d =
+ (llcorner p -- (lrcorner p) shifted (d,0) --
+ (urcorner p) shifted (d,0) -- ulcorner p -- cycle)
+enddef ;
+
+primarydef p topenlarged d =
+ (llcorner p -- lrcorner p --
+ (urcorner p) shifted (0,d) -- (ulcorner p) shifted (0,d) -- cycle)
+enddef ;
+
+primarydef p bottomenlarged d =
+ (llcorner p shifted (0,-d) -- lrcorner p shifted (0,-d) --
+ urcorner p -- ulcorner p -- cycle)
+enddef ;
+
+%D Handy for testing/debugging:
+
+primarydef p crossed d =
+ (center p shifted (-d, 0) -- llcorner p --
+ center p shifted ( 0,-d) -- lrcorner p --
+ center p shifted (+d, 0) -- urcorner p --
+ center p shifted ( 0,+d) -- ulcorner p -- cycle)
+enddef ;
+
+%D Saves typing:
+
+% vardef bottomboundary primary p = (llcorner p -- lrcorner p) enddef ;
+% vardef rightboundary primary p = (lrcorner p -- urcorner p) enddef ;
+% vardef topboundary primary p = (urcorner p -- ulcorner p) enddef ;
+% vardef leftboundary primary p = (ulcorner p -- llcorner p) enddef ;
+
+vardef bottomboundary primary p =
+ if pair p : p else : (llcorner p -- lrcorner p) fi
+enddef ;
+
+vardef rightboundary primary p =
+ if pair p : p else : (lrcorner p -- urcorner p) fi
+enddef ;
+
+vardef topboundary primary p =
+ if pair p : p else : (urcorner p -- ulcorner p) fi
+enddef ;
+
+vardef leftboundary primary p =
+ if pair p : p else : (ulcorner p -- llcorner p) fi
+enddef ;
+
+%D Nice too:
+
+primarydef p superellipsed s =
+ superellipse
+ (.5[lrcorner p,urcorner p],
+ .5[urcorner p,ulcorner p],
+ .5[ulcorner p,llcorner p],
+ .5[llcorner p,lrcorner p],
+ s)
+enddef ;
+
+primarydef p squeezed s =
+ ((llcorner p .. .5[llcorner p,lrcorner p] shifted ( 0, ypart paired(s)) .. lrcorner p) &
+ (lrcorner p .. .5[lrcorner p,urcorner p] shifted (-xpart paired(s), 0) .. urcorner p) &
+ (urcorner p .. .5[urcorner p,ulcorner p] shifted ( 0,-ypart paired(s)) .. ulcorner p) &
+ (ulcorner p .. .5[ulcorner p,llcorner p] shifted ( xpart paired(s), 0) .. llcorner p) & cycle)
+enddef ;
+
+primarydef p randomshifted s =
+ begingroup ; save ss ; pair ss ; ss := paired(s) ;
+ p shifted (-.5xpart ss + uniformdeviate xpart ss,
+ -.5ypart ss + uniformdeviate ypart ss)
+ endgroup
+enddef ;
+
+%primarydef p randomized s =
+% for i=0 upto length(p)-1 :
+% ((point i of p) randomshifted s) .. controls
+% ((postcontrol i of p) randomshifted s) and
+% ((precontrol (i+1) of p) randomshifted s) ..
+% endfor cycle
+%enddef ;
+
+primarydef p randomized s =
+ (if path p :
+ for i=0 upto length(p)-1 :
+ ((point i of p) randomshifted s) .. controls
+ ((postcontrol i of p) randomshifted s) and
+ ((precontrol (i+1) of p) randomshifted s) ..
+ endfor
+ if cycle p :
+ cycle
+ else :
+ ((point length(p) of p) randomshifted s)
+ fi
+ elseif pair p :
+ p randomshifted s
+ elseif color p :
+ if color s :
+ (uniformdeviate redpart s * redpart p,
+ uniformdeviate greenpart s * greenpart p,
+ uniformdeviate bluepart s * bluepart p)
+ elseif pair s :
+ ((xpart s + uniformdeviate (ypart s - xpart s)) * p)
+ else :
+ (uniformdeviate s * p)
+ fi
+ else :
+ p + uniformdeviate s
+ fi)
+enddef ;
+
+%D Not perfect (alternative for interpath)
+
+vardef interpolated(expr s, p, q) =
+ save m ; m := max(length(p),length(q)) ;
+ (if path p :
+ for i=0 upto m-1 :
+ s[point (i /m) along p,
+ point (i /m) along q] .. controls
+ s[postcontrol (i /m) along p,
+ postcontrol (i /m) along q] and
+ s[precontrol ((i+1)/m) along p,
+ precontrol ((i+1)/m) along q] ..
+ endfor
+ if cycle p :
+ cycle
+ else :
+ s[point infinity of p,
+ point infinity of q]
+ fi
+ else :
+ a[p,q]
+ fi)
+enddef ;
+
+%D Interesting too:
+
+% primarydef p parallel s =
+% begingroup ; save q, b ; path q ; numeric b ;
+% b := xpart (lrcorner p - llcorner p) ;
+% q := p if b>0 : scaled ((b+2s)/b) fi ;
+% (q shifted (center p-center q))
+% endgroup
+% enddef ;
+
+%primarydef p parallel s =
+% begingroup ; save q, w,h ; path q ; numeric w, h ;
+% w := bbwidth(p) ; h := bbheight(p) ;
+% q := p if (w>0) and (h>0) :
+% xyscaled ((w+2*xpart paired(s))/w,(h+2*ypart paired(s))/h) fi ;
+% (q shifted (center p-center q))
+% endgroup
+%enddef ;
+
+vardef punked primary p =
+ (point 0 of p for i=1 upto length(p)-1 : -- point i of p endfor
+ if cycle p : -- cycle else : -- point length(p) of p fi)
+enddef ;
+
+vardef curved primary p =
+ (point 0 of p for i=1 upto length(p)-1 : .. point i of p endfor
+ if cycle p : .. cycle else : .. point length(p) of p fi)
+enddef ;
+
+primarydef p blownup s =
+ begingroup
+ save _p_ ; path _p_ ; _p_ := p xysized
+ (bbwidth (p)+2(xpart paired(s)),
+ bbheight(p)+2(ypart paired(s))) ;
+ (_p_ shifted (center p - center _p_))
+ endgroup
+enddef ;
+
+%D Rather fundamental.
+
+% vardef rightpath expr p =
+% save q, t, b ; path q ; pair t, b ;
+% t := (ulcorner p -- urcorner p) intersection_point p ;
+% b := (llcorner p -- lrcorner p) intersection_point p ;
+% if xpart directionpoint t of p < 0 : p := reverse p ; fi ;
+% q := p cutbefore b ;
+% q := q if xpart point 0 of p > 0 : & p fi cutafter t ;
+% q
+% enddef ;
+%
+% vardef leftpath expr p =
+% save q, t, b ; path q ; pair t, b ;
+% t := (ulcorner p -- urcorner p) intersection_point p ;
+% b := (llcorner p -- lrcorner p) intersection_point p ;
+% if xpart directionpoint t of p < 0 : p := reverse p ; fi ;
+% q := p cutbefore t ;
+% q := q if xpart point 0 of p > 0 : & p fi cutafter b ;
+% q
+% enddef ;
+
+def leftrightpath(expr p, l) =
+ save q, t, b ; path q ; pair t, b ;
+ t := (ulcorner p -- urcorner p) intersection_point p ;
+ b := (llcorner p -- lrcorner p) intersection_point p ;
+ if xpart directionpoint t of p < 0 : p := reverse p ; fi ;
+ q := p cutbefore if l: t else: b fi ;
+ q := q if xpart point 0 of p > 0 : &
+ p fi cutafter if l: b else: t fi ;
+ q
+enddef ;
+
+vardef leftpath expr p = leftrightpath(p,true ) enddef ;
+vardef rightpath expr p = leftrightpath(p,false) enddef ;
+
+%D Drawoptions
+
+def saveoptions =
+ save _op_ ; def _op_ = enddef ;
+enddef ;
+
+%D Tracing.
+
+let normaldraw = draw ;
+let normalfill = fill ;
+
+def drawlineoptions (text t) = def _lin_opt_ = t enddef ; enddef ;
+def drawpointoptions (text t) = def _pnt_opt_ = t enddef ; enddef ;
+def drawcontroloptions(text t) = def _ctr_opt_ = t enddef ; enddef ;
+def drawlabeloptions (text t) = def _lab_opt_ = t enddef ; enddef ;
+def draworiginoptions (text t) = def _ori_opt_ = t enddef ; enddef ;
+def drawboundoptions (text t) = def _bnd_opt_ = t enddef ; enddef ;
+def drawpathoptions (text t) = def _pth_opt_ = t enddef ; enddef ;
+
+def resetdrawoptions =
+ drawlineoptions (withpen pencircle scaled 1pt withcolor .5white) ;
+ drawpointoptions (withpen pencircle scaled 4pt withcolor black) ;
+ drawcontroloptions(withpen pencircle scaled 2.5pt withcolor black) ;
+ drawlabeloptions () ;
+ draworiginoptions (withpen pencircle scaled 1pt withcolor .5white) ;
+ drawboundoptions (dashed evenly _ori_opt_) ;
+ drawpathoptions (withpen pencircle scaled 5pt withcolor .8white) ;
+enddef ;
+
+resetdrawoptions ;
+
+%D Path.
+
+def drawpath expr p =
+ normaldraw p _pth_opt_
+enddef ;
+
+%D Arrow.
+
+vardef drawarrowpath expr p =
+ save autoarrows ; boolean autoarrows ; autoarrows := true ;
+ drawarrow p _pth_opt_
+enddef ;
+
+%def drawarrowpath expr p =
+% begingroup ;
+% save autoarrows ; boolean autoarrows ; autoarrows := true ;
+% save arrowpath ; path arrowpath ; arrowpath := p ;
+% _drawarrowpath_
+%enddef ;
+%
+%def _drawarrowpath_ text t =
+% drawarrow arrowpath _pth_opt_ t ;
+% endgroup ;
+%enddef ;
+
+def midarrowhead expr p =
+ arrowhead p cutafter
+ (point length(p cutafter point .5 along p)+ahlength on p)
+enddef ;
+
+vardef arrowheadonpath (expr p, s) =
+ save autoarrows ; boolean autoarrows ; autoarrows := true ;
+ arrowhead p if s<1 : cutafter (point (s*arclength(p)+.5ahlength) on p) fi
+enddef ;
+
+%D Points.
+
+def drawpoint expr c =
+ if string c :
+ string _c_ ; _c_ := "(" & c & ")" ;
+ dotlabel.urt(_c_, scantokens _c_) ;
+ drawdot scantokens _c_
+ else :
+ dotlabel.urt("(" & decimal xpart c & "," & decimal ypart c & ")", c) ;
+ drawdot c
+ fi _pnt_opt_
+enddef ;
+
+%D PathPoints.
+
+def drawpoints expr c = path _c_ ; _c_ := c ; do_drawpoints enddef ;
+def drawcontrolpoints expr c = path _c_ ; _c_ := c ; do_drawcontrolpoints enddef ;
+def drawcontrollines expr c = path _c_ ; _c_ := c ; do_drawcontrollines enddef ;
+def drawpointlabels expr c = path _c_ ; _c_ := c ; do_drawpointlabels enddef ;
+
+def do_drawpoints text t =
+ for _i_=0 upto length(_c_) :
+ normaldraw point _i_ of _c_ _pnt_opt_ t ;
+ endfor ;
+enddef;
+
+def do_drawcontrolpoints text t =
+ for _i_=0 upto length(_c_) :
+ normaldraw precontrol _i_ of _c_ _ctr_opt_ t ;
+ normaldraw postcontrol _i_ of _c_ _ctr_opt_ t ;
+ endfor ;
+enddef;
+
+def do_drawcontrollines text t =
+ for _i_=0 upto length(_c_) :
+ normaldraw point _i_ of _c_ -- precontrol _i_ of _c_ _lin_opt_ t ;
+ normaldraw point _i_ of _c_ -- postcontrol _i_ of _c_ _lin_opt_ t ;
+ endfor ;
+enddef;
+
+boolean swappointlabels ; swappointlabels := false ;
+
+def do_drawpointlabels text t =
+ for _i_=0 upto length(_c_) :
+ pair _u_ ; _u_ := unitvector(direction _i_ of _c_)
+ rotated if swappointlabels : - fi 90 ;
+ pair _p_ ; _p_ := (point _i_ of _c_) ;
+ _u_ := 12 * defaultscale * _u_ ;
+ normaldraw thelabel ( decimal _i_,
+ _p_ shifted if cycle _c_ and (_i_=0) : - fi _u_ ) _lab_opt_ t ;
+ endfor ;
+enddef;
+
+%D Bounding box.
+
+def drawboundingbox expr p =
+ normaldraw boundingbox p _bnd_opt_
+enddef ;
+
+%D Origin.
+
+numeric originlength ; originlength := .5cm ;
+
+def draworigin text t =
+ normaldraw (origin shifted (0, originlength) --
+ origin shifted (0,-originlength)) _ori_opt_ t ;
+ normaldraw (origin shifted ( originlength,0) --
+ origin shifted (-originlength,0)) _ori_opt_ t ;
+enddef;
+
+%D Axis.
+
+numeric tickstep ; tickstep := 5mm ;
+numeric ticklength ; ticklength := 2mm ;
+
+def drawxticks expr c = path _c_ ; _c_ := c ; do_drawxticks enddef ;
+def drawyticks expr c = path _c_ ; _c_ := c ; do_drawyticks enddef ;
+def drawticks expr c = path _c_ ; _c_ := c ; do_drawticks enddef ;
+
+% Adding eps prevents disappearance due to rounding errors.
+
+def do_drawxticks text t =
+ for i=0 step -tickstep until xpart llcorner _c_ - eps :
+ if (i<=xpart lrcorner _c_) :
+ normaldraw (i,-ticklength)--(i,ticklength) _ori_opt_ t ;
+ fi ;
+ endfor ;
+ for i=0 step tickstep until xpart lrcorner _c_ + eps :
+ if (i>=xpart llcorner _c_) :
+ normaldraw (i,-ticklength)--(i,ticklength) _ori_opt_ t ;
+ fi ;
+ endfor ;
+ normaldraw (llcorner _c_ -- ulcorner _c_)
+ shifted (-xpart llcorner _c_,0) _ori_opt_ t ;
+enddef ;
+
+def do_drawyticks text t =
+ for i=0 step -tickstep until ypart llcorner _c_ - eps :
+ if (i<=ypart ulcorner _c_) :
+ normaldraw (-ticklength,i)--(ticklength,i) _ori_opt_ t ;
+ fi ;
+ endfor ;
+ for i=0 step tickstep until ypart ulcorner _c_ + eps :
+ if (i>=ypart llcorner _c_) :
+ normaldraw (-ticklength,i)--(ticklength,i) _ori_opt_ t ;
+ fi ;
+ endfor ;
+ normaldraw (llcorner _c_ -- lrcorner _c_)
+ shifted (0,-ypart llcorner _c_) _ori_opt_ t ;
+enddef ;
+
+def do_drawticks text t =
+ drawxticks _c_ t ;
+ drawyticks _c_ t ;
+enddef ;
+
+%D All of it except axis.
+
+def drawwholepath expr p =
+ draworigin ;
+ drawpath p ;
+ drawcontrollines p ;
+ drawcontrolpoints p ;
+ drawpoints p ;
+ drawboundingbox p ;
+ drawpointlabels p ;
+enddef ;
+
+%D Tracing.
+
+def visualizeddraw expr c =
+ if picture c : normaldraw c else : path _c_ ; _c_ := c ; do_visualizeddraw fi
+enddef ;
+
+def visualizedfill expr c =
+ if picture c : normalfill c else : path _c_ ; _c_ := c ; do_visualizedfill fi
+enddef ;
+
+def do_visualizeddraw text t =
+ draworigin ;
+ drawpath _c_ t ;
+ drawcontrollines _c_ ;
+ drawcontrolpoints _c_ ;
+ drawpoints _c_ ;
+ drawboundingbox _c_ ;
+ drawpointlabels _c_ ;
+enddef ;
+
+def do_visualizedfill text t =
+ if cycle _c_ : normalfill _c_ t fi ;
+ draworigin ;
+ drawcontrollines _c_ ;
+ drawcontrolpoints _c_ ;
+ drawpoints _c_ ;
+ drawboundingbox _c_ ;
+ drawpointlabels _c_ ;
+enddef ;
+
+def visualizepaths =
+ let fill = visualizedfill ;
+ let draw = visualizeddraw ;
+enddef ;
+
+def naturalizepaths =
+ let fill = normalfill ;
+ let draw = normaldraw ;
+enddef ;
+
+extra_endfig := extra_endfig & " naturalizepaths ; " ;
+
+%D Normally, arrowheads don't scale well. So we provide a
+%D hack.
+
+boolean autoarrows ; autoarrows := false ;
+numeric ahfactor ; ahfactor := 2.5 ;
+
+def set_ahlength (text t) =
+ ahlength := (ahfactor*pen_size(_op_ t)) ; % _op_ added
+enddef ;
+
+vardef pen_size (text t) =
+ save p ; picture p ; p := nullpicture ;
+ addto p doublepath (top origin -- bot origin) t ;
+ (ypart urcorner p - ypart lrcorner p)
+enddef ;
+
+%D The next two macros are adapted versions of plain
+%D \METAPOST\ definitions.
+
+def _finarr text t =
+ if autoarrows : set_ahlength (t) fi ;
+ draw _apth t ;
+ filldraw arrowhead _apth t ;
+enddef;
+
+def _findarr text t =
+ if autoarrows : set_ahlength (t) fi ;
+ draw _apth t ;
+ fill arrowhead _apth withpen currentpen t ;
+ fill arrowhead reverse _apth withpen currentpen t ;
+enddef ;
+
+%D Handy too ......
+
+vardef pointarrow (expr pat, loc, len, off) =
+ save l, r, s, t ; path l, r ; numeric s ; pair t ;
+ t := if pair loc : loc else : point loc along pat fi ;
+% draw t withpen pencircle scaled 10 withcolor .5white ;
+ s := len/2 - off ; if s<=0 : s := 0 elseif s>len : s := len fi ;
+ r := pat cutbefore t ;
+ r := (r cutafter point (arctime s of r) of r) ;
+ s := len/2 + off ; if s<=0 : s := 0 elseif s>len : s := len fi ;
+ l := reverse (pat cutafter t) ;
+ l := (reverse (l cutafter point (arctime s of l) of l)) ;
+ (l..r)
+enddef ;
+
+def rightarrow (expr pat,tim,len) = pointarrow(pat,tim,len,-len) enddef ;
+def leftarrow (expr pat,tim,len) = pointarrow(pat,tim,len,+len) enddef ;
+def centerarrow (expr pat,tim,len) = pointarrow(pat,tim,len, 0) enddef ;
+
+%D The \type {along} and \type {on} operators can be used
+%D as follows:
+%D
+%D \starttypen
+%D drawdot point .5 along somepath ;
+%D drawdot point 3cm on somepath ;
+%D \stoptypen
+%D
+%D The number denotes a percentage (fraction).
+
+primarydef pct along pat = % also negative
+ (arctime (pct * (arclength pat)) of pat) of pat
+enddef ;
+
+% primarydef len on pat =
+% (arctime len of pat) of pat
+% enddef ;
+
+primarydef len on pat =
+ (arctime if len>0 : len else : (arclength(pat)+len) fi of pat) of pat
+enddef ;
+
+% this cuts of a piece from both ends
+
+% tertiarydef pat cutends len =
+% begingroup ; save tap ; path tap ;
+% tap := pat cutbefore (point len on pat) ;
+% (tap cutafter (point -len on tap))
+% endgroup
+% enddef ;
+
+tertiarydef pat cutends len =
+ begingroup ; save tap ; path tap ;
+ tap := pat cutbefore (point (xpart paired(len)) on pat) ;
+ (tap cutafter (point -(ypart paired(len)) on tap))
+ endgroup
+enddef ;
+
+%D To be documented.
+
+path freesquare ;
+
+freesquare := ((-1,0)--(-1,-1)--(0,-1)--(+1,-1)--
+ (+1,0)--(+1,+1)--(0,+1)--(-1,+1)--cycle) scaled .5 ;
+
+numeric freelabeloffset ; freelabeloffset := 3pt ;
+numeric freedotlabelsize ; freedotlabelsize := 3pt ;
+
+vardef thefreelabel (expr str, loc, ori) =
+ save s, p, q, l ; picture s ; path p, q ; pair l ;
+ interim labeloffset := freelabeloffset ;
+ s := if string str : thelabel(str,loc) else : str shifted -center str shifted loc fi ;
+ setbounds s to boundingbox s enlarged freelabeloffset ;
+ p := fullcircle scaled (2*length(loc-ori)) shifted ori ;
+ q := freesquare xyscaled (urcorner s - llcorner s) ;
+% l := point (xpart (p intersectiontimes (ori--loc))) of q ;
+ l := point xpart (p intersectiontimes
+ (ori--((1+eps)*arclength(ori--loc)*unitvector(loc-ori)))) of q ;
+ setbounds s to boundingbox s enlarged -freelabeloffset ; % new
+ %draw boundingbox s shifted -l withpen pencircle scaled .5pt withcolor red ;
+ (s shifted -l)
+enddef ;
+
+% better?
+
+vardef thefreelabel (expr str, loc, ori) =
+ save s, p, q, l ; picture s ; path p, q ; pair l ;
+ interim labeloffset := freelabeloffset ;
+ s := if string str : thelabel(str,loc) else : str shifted -center str shifted loc fi ;
+ setbounds s to boundingbox s enlarged freelabeloffset ;
+ p := fullcircle scaled (2*length(loc-ori)) shifted ori ;
+ q := freesquare xyscaled (urcorner s - llcorner s) ;
+ l := point xpart (p intersectiontimes (ori--loc shifted (loc-ori))) of q ;
+ setbounds s to boundingbox s enlarged -freelabeloffset ; % new
+ %draw boundingbox s shifted -l withpen pencircle scaled .5pt withcolor red ;
+ (s shifted -l)
+enddef ;
+
+vardef freelabel (expr str, loc, ori) =
+ draw thefreelabel(str,loc,ori) ;
+enddef ;
+
+vardef freedotlabel (expr str, loc, ori) =
+ interim linecap:=rounded ;
+ draw loc withpen pencircle scaled freedotlabelsize ;
+ draw thefreelabel(str,loc,ori) ;
+enddef ;
+
+%D \starttypen
+%D drawarrow anglebetween(line_a,line_b,somelabel) ;
+%D \stoptypen
+
+% angleoffset ; angleoffset := 0pt ;
+numeric anglelength ; anglelength := 20pt ;
+numeric anglemethod ; anglemethod := 1 ;
+
+% vardef anglebetween (expr a, b, str) = % path path string
+% save pointa, pointb, common, middle, offset ;
+% pair pointa, pointb, common, middle, offset ;
+% save curve ; path curve ;
+% save where ; numeric where ;
+% if round point 0 of a = round point 0 of b :
+% common := point 0 of a ;
+% else :
+% common := a intersectionpoint b ;
+% fi ;
+% pointa := point anglelength on a ;
+% pointb := point anglelength on b ;
+% where := turningnumber (common--pointa--pointb--cycle) ;
+% middle := ((common--pointa) rotatedaround (pointa,-where*90))
+% intersectionpoint
+% ((common--pointb) rotatedaround (pointb, where*90)) ;
+% if anglemethod = 0 :
+% curve := pointa{unitvector(middle-pointa)}.. pointb;
+% middle := point .5 along curve ;
+% curve := common ;
+% elseif anglemethod = 1 :
+% curve := pointa{unitvector(middle-pointa)}.. pointb;
+% middle := point .5 along curve ;
+% elseif anglemethod = 2 :
+% middle := common rotatedaround(.5[pointa,pointb],180) ;
+% curve := pointa--middle--pointb ;
+% elseif anglemethod = 3 :
+% curve := pointa--middle--pointb ;
+% elseif anglemethod = 4 :
+% curve := pointa..controls middle..pointb ;
+% middle := point .5 along curve ;
+% fi ;
+% draw thefreelabel(str, middle, common) withcolor black ;
+% curve
+% enddef ;
+
+vardef anglebetween (expr a, b, str) = % path path string
+ save pointa, pointb, common, middle, offset ;
+ pair pointa, pointb, common, middle, offset ;
+ save curve ; path curve ;
+ save where ; numeric where ;
+ if round point 0 of a = round point 0 of b :
+ common := point 0 of a ;
+ else :
+ common := a intersectionpoint b ;
+ fi ;
+ pointa := point anglelength on a ;
+ pointb := point anglelength on b ;
+ where := turningnumber (common--pointa--pointb--cycle) ;
+ middle := (reverse(common--pointa) rotatedaround (pointa,-where*90))
+ intersection_point
+ (reverse(common--pointb) rotatedaround (pointb, where*90)) ;
+ if not intersection_found :
+ middle := point .5 along
+ ((reverse(common--pointa) rotatedaround (pointa,-where*90)) --
+ ( (common--pointb) rotatedaround (pointb, where*90))) ;
+ fi ;
+ if anglemethod = 0 :
+ curve := pointa{unitvector(middle-pointa)}.. pointb;
+ middle := point .5 along curve ;
+ curve := common ;
+ elseif anglemethod = 1 :
+ curve := pointa{unitvector(middle-pointa)}.. pointb;
+ middle := point .5 along curve ;
+ elseif anglemethod = 2 :
+ middle := common rotatedaround(.5[pointa,pointb],180) ;
+ curve := pointa--middle--pointb ;
+ elseif anglemethod = 3 :
+ curve := pointa--middle--pointb ;
+ elseif anglemethod = 4 :
+ curve := pointa..controls middle..pointb ;
+ middle := point .5 along curve ;
+ fi ;
+ draw thefreelabel(str, middle, common) ; % withcolor black ;
+ curve
+enddef ;
+
+% Stack
+
+picture currentpicturestack[] ;
+numeric currentpicturedepth ; currentpicturedepth := 0 ;
+
+def pushcurrentpicture =
+ currentpicturedepth := currentpicturedepth + 1 ;
+ currentpicturestack[currentpicturedepth] := currentpicture ;
+ currentpicture := nullpicture ;
+enddef ;
+
+def popcurrentpicture text t = % optional text
+ if currentpicturedepth > 0 :
+ addto currentpicturestack[currentpicturedepth] also currentpicture t ;
+ currentpicture := currentpicturestack[currentpicturedepth] ;
+ currentpicturedepth := currentpicturedepth - 1 ;
+ fi ;
+enddef ;
+
+%D colorcircle(size, red, green, blue) ;
+
+% vardef colorcircle (expr size, red, green, blue) =
+% save r, g, b, rr, gg, bb, cc, mm, yy ; save radius ;
+% path r, g, b, rr, bb, gg, cc, mm, yy ; numeric radius ;
+%
+% radius := 5cm ; pickup pencircle scaled (radius/25) ;
+%
+% r := g := b := fullcircle scaled radius shifted (0,radius/4) ;
+%
+% r := r rotatedaround (origin, 15) ;
+% g := g rotatedaround (origin,135) ;
+% b := b rotatedaround (origin,255) ;
+%
+% r := r rotatedaround(center r,-90) ;
+% g := g rotatedaround(center g, 90) ;
+%
+% gg := buildcycle(buildcycle(reverse r,b),g) ;
+% cc := buildcycle(buildcycle(b,reverse g),r) ;
+%
+% rr := gg rotatedaround(origin,120) ;
+% bb := gg rotatedaround(origin,240) ;
+%
+% yy := cc rotatedaround(origin,120) ;
+% mm := cc rotatedaround(origin,240) ;
+%
+% pushcurrentpicture ;
+%
+% fill fullcircle scaled radius withcolor white ;
+%
+% fill rr withcolor red ; fill cc withcolor white-red ;
+% fill gg withcolor green ; fill mm withcolor white-green ;
+% fill bb withcolor blue ; fill yy withcolor white-blue ;
+%
+% for i = rr,gg,bb,cc,mm,yy : draw i withcolor .5white ; endfor ;
+%
+% currentpicture := currentpicture xsized size ;
+%
+% popcurrentpicture ;
+% enddef ;
+
+% vardef colorcircle (expr size, red, green, blue) =
+% save r, g, b, rr, gg, bb, cc, mm, yy ; save radius ;
+% path r, g, b, rr, bb, gg, cc, mm, yy ; numeric radius ;
+%
+% radius := 5cm ; pickup pencircle scaled (radius/25) ;
+%
+% transform t ; t := identity rotatedaround(origin,120) ;
+%
+% r := fullcircle scaled radius
+% shifted (0,radius/4) rotatedaround(origin,15) ;
+%
+% g := r transformed t ; b := g transformed t ;
+%
+% r := r rotatedaround(center r,-90) ;
+% g := g rotatedaround(center g, 90) ;
+%
+% gg := buildcycle(buildcycle(reverse r,b),g) ;
+% cc := buildcycle(buildcycle(b,reverse g),r) ;
+%
+% rr := gg transformed t ; bb := rr transformed t ;
+% yy := cc transformed t ; mm := yy transformed t ;
+%
+% pushcurrentpicture ;
+%
+% fill fullcircle scaled radius withcolor white ;
+%
+% fill rr withcolor red ; fill cc withcolor white-red ;
+% fill gg withcolor green ; fill mm withcolor white-green ;
+% fill bb withcolor blue ; fill yy withcolor white-blue ;
+%
+% for i = rr,gg,bb,cc,mm,yy : draw i withcolor .5white ; endfor ;
+%
+% currentpicture := currentpicture xsized size ;
+%
+% popcurrentpicture ;
+% enddef ;
+
+vardef colorcircle (expr size, red, green, blue) =
+ save r, g, b, c, m, y, w ; save radius ;
+ path r, g, b, c, m, y, w ; numeric radius ;
+
+ radius := 5cm ; pickup pencircle scaled (radius/25) ;
+
+ transform t ; t := identity rotatedaround(origin,120) ;
+
+ r := fullcircle rotated 90 scaled radius
+ shifted (0,radius/4) rotatedaround(origin,135) ;
+
+ b := r transformed t ; g := b transformed t ;
+
+ c := buildcycle(subpath(1,7) of g,subpath(1,7) of b) ;
+ y := c transformed t ; m := y transformed t ;
+
+ w := buildcycle(subpath(3,5) of r, subpath(3,5) of g,subpath(3,5) of b) ;
+
+ pushcurrentpicture ;
+
+ fill r withcolor red ;
+ fill g withcolor green ;
+ fill b withcolor blue ;
+ fill c withcolor white-red ;
+ fill m withcolor white-green ;
+ fill y withcolor white-blue ;
+ fill w withcolor white ;
+
+ for i = r,g,b,c,m,y : draw i withcolor .5white ; endfor ;
+
+ currentpicture := currentpicture xsized size ;
+
+ popcurrentpicture ;
+enddef ;
+
+% penpoint (i,2) of somepath -> inner / outer point
+
+vardef penpoint expr pnt of p =
+ save n, d ; numeric n, d ;
+ (n,d) = if pair pnt : pnt else : (pnt,1) fi ;
+ (point n of p shifted ((penoffset direction n of p of currentpen) scaled d))
+enddef ;
+
+% nice: currentpicture := inverted currentpicture ;
+
+primarydef p uncolored c =
+ if color p :
+ c - p
+ else :
+ image
+ (for i within p :
+ addto currentpicture
+ if stroked i or filled i :
+ if filled i : contour else : doublepath fi pathpart i
+ dashed dashpart i withpen penpart i
+ else :
+ also i
+ fi
+ withcolor c-(redpart i, greenpart i, bluepart i) ;
+ endfor ; )
+ fi
+enddef ;
+
+vardef inverted primary p =
+ (p uncolored white)
+enddef ;
+
+% primarydef p softened c =
+% if color p :
+% tripled(c) * p
+% else :
+% image
+% (save cc ; color cc ; cc := tripled(c) ;
+% for i within p :
+% addto currentpicture
+% if stroked i or filled i :
+% if filled i : contour else : doublepath fi pathpart i
+% dashed dashpart i withpen penpart i
+% else :
+% also i
+% fi
+% withcolor (redpart cc * redpart i,
+% greenpart cc * greenpart i,
+% bluepart cc * bluepart i) ;
+% endfor ;)
+% fi
+% enddef ;
+
+primarydef p softened c =
+ begingroup
+ save cc ; color cc ; cc := tripled(c) ;
+ if color p :
+ (redpart cc * redpart p,
+ greenpart cc * greenpart p,
+ bluepart cc * bluepart p)
+ else :
+ image
+ (for i within p :
+ addto currentpicture
+ if stroked i or filled i :
+ if filled i : contour else : doublepath fi pathpart i
+ dashed dashpart i withpen penpart i
+ else :
+ also i
+ fi
+ withcolor (redpart cc * redpart i,
+ greenpart cc * greenpart i,
+ bluepart cc * bluepart i) ;
+ endfor ;)
+ fi
+ endgroup
+enddef ;
+
+vardef grayed primary p =
+ if color p :
+ tripled(.30redpart p+.59greenpart p+.11bluepart p)
+ else :
+ image
+ (for i within p :
+ addto currentpicture
+ if stroked i or filled i :
+ if filled i : contour else : doublepath fi pathpart i
+ dashed dashpart i withpen penpart i
+ else :
+ also i
+ fi
+ withcolor tripled(.30redpart i+.59greenpart i+.11bluepart i) ;
+ endfor ; )
+ fi
+enddef ;
+
+% yes or no: "text" infont "cmr12" at 24pt ;
+
+% let normalinfont = infont ;
+%
+% numeric lastfontsize ; lastfontsize = fontsize defaultfont ;
+%
+% def infont primary name = % no vardef, no expr
+% hide(lastfontsize := fontsize name) % no ;
+% normalinfont name
+% enddef ;
+%
+% def scaledat expr size =
+% scaled (size/lastfontsize)
+% enddef ;
+%
+% let at = scaledat ;
+
+% like decimal
+
+def condition primary b = if b : "true" else : "false" fi enddef ;
+
+% undocumented
+
+primarydef p stretched s =
+ begingroup
+% save pp ; path pp ; pp := p scaled s ;
+ save pp ; path pp ; pp := p xyscaled s ;
+ (pp shifted ((point 0 of p) - (point 0 of pp)))
+ endgroup
+enddef ;
+
+% yes or no, untested -)
+
+def xshifted expr dx = shifted(dx,0) enddef ;
+def yshifted expr dy = shifted(0,dy) enddef ;
+
+% also handy
+
+% right: str = readfrom ("abc" & ".def" ) ;
+% wrong: str = readfrom "abc" & ".def" ;
+
+% Every 62th read fails so we need to try again!
+
+% def readfile (expr name) =
+% if (readfrom (name) <> EOF) :
+% scantokens("input " & name & ";") ;
+% elseif (readfrom (name) <> EOF) :
+% scantokens("input " & name & ";") ;
+% fi ;
+% closefrom (name) ;
+% enddef ;
+%
+% this sometimes fails on the elseif, so :
+%
+
+def readfile (expr name) =
+ begingroup ; save ok ; boolean ok ;
+ if (readfrom (name) <> EOF) :
+ ok := false ;
+ elseif (readfrom (name) <> EOF) :
+ ok := false ;
+ else :
+ ok := true ;
+ fi ;
+ if not ok :
+ scantokens("input " & name & " ") ;
+ fi ;
+ closefrom (name) ;
+ endgroup ;
+enddef ;
+
+% permits redefinition of end in macro
+
+inner end ;
+
+% real fun
+
+let normalwithcolor = withcolor ;
+
+def remapcolors =
+ def withcolor primary c = normalwithcolor remappedcolor(c) enddef ;
+enddef ;
+
+def normalcolors =
+ let withcolor = normalwithcolor ;
+enddef ;
+
+def resetcolormap =
+ color color_map[][][] ;
+ normalcolors ;
+enddef ;
+
+resetcolormap ;
+
+% color_map_resolution := 1000 ;
+%
+% def r_color primary c = round(color_map_resolution*redpart c) enddef ;
+% def g_color primary c = round(color_map_resolution*greenpart c) enddef ;
+% def b_color primary c = round(color_map_resolution*bluepart c) enddef ;
+
+def r_color primary c = redpart c enddef ;
+def g_color primary c = greenpart c enddef ;
+def b_color primary c = bluepart c enddef ;
+
+def remapcolor(expr old, new) =
+ color_map[r_color old][g_color old][b_color old] := new ;
+enddef ;
+
+def remappedcolor(expr c) =
+ if known color_map[r_color c][g_color c][b_color c] :
+ color_map[r_color c][g_color c][b_color c]
+ else :
+ c
+ fi
+enddef ;
+
+% def refill suffix c = do_repath (1) (c) enddef ;
+% def redraw suffix c = do_repath (2) (c) enddef ;
+% def recolor suffix c = do_repath (0) (c) enddef ;
+%
+% color refillbackground ; refillbackground := (1,1,1) ;
+%
+% def do_repath (expr mode) (suffix c) text t = % can it be stroked and filled at the same time ?
+% begingroup ;
+% if mode=0 : save withcolor ; remapcolors ; fi ;
+% save _c_, _cc_, _f_, _b_ ; picture _c_, _cc_ ; color _f_ ; path _b_ ;
+% _c_ := c ; _b_ := boundingbox c ; c := nullpicture ;
+% for i within _c_ :
+% _f_ := (redpart i, greenpart i, bluepart i) ;
+% if bounded i :
+% setbounds c to pathpart i ;
+% elseif clipped i :
+% clip c to pathpart i ;
+% elseif stroked i :
+% addto c doublepath pathpart i
+% dashed dashpart i withpen penpart i
+% withcolor _f_ % (redpart i, greenpart i, bluepart i)
+% if mode=2 : t fi ;
+% elseif filled i :
+% addto c contour pathpart i
+% withcolor _f_
+% if (mode=1) and (_f_<>refillbackground) : t fi ;
+% else :
+% addto c also i ;
+% fi ;
+% endfor ;
+% setbounds c to _b_ ;
+% endgroup ;
+% enddef ;
+
+% Thanks to Jens-Uwe Morawski for pointing out that we need
+% to treat bounded and clipped components as local pictures.
+
+def recolor suffix p = p := repathed (0,p) enddef ;
+def refill suffix p = p := repathed (1,p) enddef ;
+def redraw suffix p = p := repathed (2,p) enddef ;
+def retext suffix p = p := repathed (3,p) enddef ;
+def untext suffix p = p := repathed (4,p) enddef ;
+
+% primarydef p recolored t = repathed(0,p) t enddef ;
+% primarydef p refilled t = repathed(1,p) t enddef ;
+% primarydef p redrawn t = repathed(2,p) t enddef ;
+% primarydef p retexted t = repathed(3,p) t enddef ;
+% primarydef p untexted t = repathed(4,p) t enddef ;
+
+color refillbackground ; refillbackground := (1,1,1) ;
+
+% vardef repathed (expr mode, p) text t =
+% begingroup ;
+% if mode=0 : save withcolor ; remapcolors ; fi ;
+% save _p_, _pp_, _f_, _b_, _t_ ;
+% picture _p_, _pp_ ; color _f_ ; path _b_ ; transform _t_ ;
+% _b_ := boundingbox p ; _p_ := nullpicture ;
+% for i within p :
+% _f_ := (redpart i, greenpart i, bluepart i) ;
+% if bounded i :
+% _pp_ := repathed(mode,i) t ;
+% setbounds _pp_ to pathpart i ;
+% addto _p_ also _pp_ ;
+% elseif clipped i :
+% _pp_ := repathed(mode,i) t ;
+% clip _pp_ to pathpart i ;
+% addto _p_ also _pp_ ;
+% elseif stroked i :
+% addto _p_ doublepath pathpart i
+% dashed dashpart i withpen penpart i
+% withcolor _f_ % (redpart i, greenpart i, bluepart i)
+% if mode=2 : t fi ;
+% elseif filled i :
+% addto _p_ contour pathpart i
+% withcolor _f_
+% if (mode=1) and (_f_<>refillbackground) : t fi ;
+% elseif textual i : % textpart i <> "" :
+% if mode <> 4 :
+% % transform _t_ ;
+% % (xpart _t_, xxpart _t_, xypart _t_) = (xpart i, xxpart i, xypart i) ;
+% % (ypart _t_, yypart _t_, yxpart _t_) = (ypart i, yypart i, yxpart i) ;
+% % addto _p_ also
+% % textpart i infont fontpart i % todo : other font
+% % transformed _t_
+% % withpen penpart i
+% % withcolor _f_
+% % if mode=3 : t fi ;
+% addto _p_ also i if mode=3 : t fi ;
+% fi ;
+% else :
+% addto _p_ also i ;
+% fi ;
+% endfor ;
+% setbounds _p_ to _b_ ;
+% _p_
+% endgroup
+% enddef ;
+
+def restroke suffix p = p := repathed (21,p) enddef ; % keep attributes
+def reprocess suffix p = p := repathed (22,p) enddef ; % no attributes
+
+% also 11 and 12
+
+vardef repathed (expr mode, p) text t =
+ begingroup ;
+ if mode=0 : save withcolor ; remapcolors ; fi ;
+ save _p_, _pp_, _ppp_, _f_, _b_, _t_ ;
+ picture _p_, _pp_, _ppp_ ; color _f_ ; path _b_ ; transform _t_ ;
+ _b_ := boundingbox p ; _p_ := nullpicture ;
+ for i within p :
+ _f_ := (redpart i, greenpart i, bluepart i) ;
+ if bounded i :
+ _pp_ := repathed(mode,i) t ;
+ setbounds _pp_ to pathpart i ;
+ addto _p_ also _pp_ ;
+ elseif clipped i :
+ _pp_ := repathed(mode,i) t ;
+ clip _pp_ to pathpart i ;
+ addto _p_ also _pp_ ;
+ elseif stroked i :
+ if mode=21 :
+ _ppp_ := i ; % indirectness is needed
+ addto _p_ also image(scantokens(t & " pathpart _ppp_")
+ dashed dashpart i withpen penpart i
+ withcolor _f_ ; ) ;
+ elseif mode=22 :
+ _ppp_ := i ; % indirectness is needed
+ addto _p_ also image(scantokens(t & " pathpart _ppp_")) ;
+ else :
+ addto _p_ doublepath pathpart i
+ dashed dashpart i withpen penpart i
+ withcolor _f_ % (redpart i, greenpart i, bluepart i)
+ if mode=2 : t fi ;
+ fi ;
+ elseif filled i :
+ if mode=11 :
+ _ppp_ := i ; % indirectness is needed
+ addto _p_ also image(scantokens(t & " pathpart _ppp_")
+ withcolor _f_ ; ) ;
+ elseif mode=12 :
+ _ppp_ := i ; % indirectness is needed
+ addto _p_ also image(scantokens(t & " pathpart _ppp_")) ;
+ else :
+ addto _p_ contour pathpart i
+ withcolor _f_
+ if (mode=1) and (_f_<>refillbackground) : t fi ;
+ fi ;
+ elseif textual i : % textpart i <> "" :
+ if mode <> 4 :
+ % transform _t_ ;
+ % (xpart _t_, xxpart _t_, xypart _t_) = (xpart i, xxpart i, xypart i) ;
+ % (ypart _t_, yypart _t_, yxpart _t_) = (ypart i, yypart i, yxpart i) ;
+ % addto _p_ also
+ % textpart i infont fontpart i % todo : other font
+ % transformed _t_
+ % withpen penpart i
+ % withcolor _f_
+ % if mode=3 : t fi ;
+ addto _p_ also i if mode=3 : t fi ;
+ fi ;
+ else :
+ addto _p_ also i ;
+ fi ;
+ endfor ;
+ setbounds _p_ to _b_ ;
+ _p_
+ endgroup
+enddef ;
+
+% After a question of Denis on how to erase a z variable, Jacko
+% suggested to assign whatever to x and y. So a clearz
+% variable can be defined as:
+%
+% vardef clearz@# =
+% x@# := whatever ;
+% y@# := whatever ;
+% enddef ;
+%
+% but Jacko suggested a redefinition of clearxy:
+%
+% def clearxy text s =
+% clearxy_index_:=0;
+% for $:=s:
+% clearxy_index_:=clearxy_index_+1; endfor;
+% if clearxy_index_=0:
+% save x,y;
+% else:
+% forsuffixes $:=s: x$:=whatever; y$:=whatever; endfor;
+% fi
+% enddef;
+%
+% which i decided to simplify to:
+
+def clearxy text s =
+ if false for $ := s : or true endfor :
+ forsuffixes $ := s : x$ := whatever ; y$ := whatever ; endfor ;
+ else :
+ save x, y ;
+ fi
+enddef ;
+
+% so now we can say: clearxy ; as well as clearxy 1, 2, 3 ;
+
+% show x0 ; z0 = (10,10) ;
+% show x0 ; x0 := whatever ; y0 := whatever ;
+% show x0 ; z0 = (20,20) ;
+% show x0 ; clearxy 0 ;
+% show x0 ; z0 = (30,30) ;
+
+primarydef p smoothed d =
+ (p llmoved (-xpart paired(d),0) -- p lrmoved (-xpart paired(d),0) {right} ..
+ p lrmoved (0,-ypart paired(d)) -- p urmoved (0,-ypart paired(d)) {up} ..
+ p urmoved (-xpart paired(d),0) -- p ulmoved (-xpart paired(d),0) {left} ..
+ p ulmoved (0,-ypart paired(d)) -- p llmoved (0,-ypart paired(d)) {down} .. cycle)
+enddef ;
+
+primarydef p cornered c =
+ ((point 0 of p) shifted (c*(unitvector(point 1 of p - point 0 of p))) --
+ for i=1 upto length(p) :
+ (point i-1 of p) shifted (c*(unitvector(point i of p - point i-1 of p))) --
+ (point i of p) shifted (c*(unitvector(point i-1 of p - point i of p))) ..
+ controls point i of p ..
+ endfor cycle)
+enddef ;
+
+% cmyk color support
+
+vardef cmyk(expr c,m,y,k) =
+ (1-c-k,1-m-k,1-y-k)
+enddef ;
+
+% handy
+
+vardef bbwidth (expr p) =
+ (if known p :
+ if path p or picture p :
+ xpart (lrcorner p - llcorner p)
+ else : 0 fi else : 0
+ fi )
+enddef ;
+
+vardef bbheight (expr p) =
+ (if known p : if path p or picture p :
+ ypart (urcorner p - lrcorner p)
+ else : 0 fi else : 0
+ fi)
+enddef ;
+
+color nocolor ; numeric noline ; % both unknown signals
+
+def dowithpath (expr p, lw, lc, bc) =
+ if known p :
+ if known bc :
+ fill p withcolor bc ;
+ fi ;
+ if known lw and known lc :
+ draw p withpen pencircle scaled lw withcolor lc ;
+ elseif known lw :
+ draw p withpen pencircle scaled lw ;
+ elseif known lc :
+ draw p withcolor lc ;
+ fi ;
+ fi ;
+enddef ;
+
+% result from metafont discussion list (denisr/boguslawj)
+
+def ]] = ] ] enddef ; def ]]] = ] ] ] enddef ;
+def [[ = [ [ enddef ; def [[[ = [ [ [ enddef ;
+
+% not perfect, but useful since it removes redundant points.
+
+% vardef dostraightened(expr sign, p) =
+% if length(p)>2 : % was 1, but straight lines are ok
+% save pp ; path pp ;
+% pp := point 0 of p ;
+% for i=1 upto length(p)-1 :
+% if round(point i of p) <> round(point length(pp) of pp) :
+% pp := pp -- point i of p ;
+% fi ;
+% endfor ;
+% save n, ok ; numeric n ; boolean ok ;
+% n := length(pp) ; ok := false ;
+% if n>2 :
+% for i=0 upto n : % evt hier ook round
+% if unitvector(round(point i of pp -
+% point if i=0 : n else : i-1 fi of pp)) <>
+% sign * unitvector(round(point if i=n : 0 else : i+1 fi of pp -
+% point i of pp)) :
+% if ok : -- else : ok := true ; fi point i of pp
+% fi
+% endfor
+% if ok and (cycle p) : -- cycle fi
+% else :
+% pp
+% fi
+% else :
+% p
+% fi
+% enddef ;
+
+% vardef simplified expr p =
+% (reverse dostraightened(+1,dostraightened(+1,reverse p)))
+% enddef ;
+
+% vardef unspiked expr p =
+% (reverse dostraightened(-1,dostraightened(-1,reverse p)))
+% enddef ;
+
+% simplified : remove same points as well as redundant points
+% unspiked : remove same points as well as areas with zero distance
+
+vardef dostraightened(expr sign, p) =
+ save _p_, _q_ ; path _p_, _q_ ;
+ _p_ := p ;
+ forever :
+ _q_ := dodostraightened(sign, _p_) ;
+ exitif length(_p_) = length(_q_) ;
+ _p_ := _q_ ;
+ endfor ;
+ _q_
+enddef ;
+
+vardef dodostraightened(expr sign, p) =
+ if length(p)>2 : % was 1, but straight lines are ok
+ save pp ; path pp ;
+ pp := point 0 of p ;
+ for i=1 upto length(p)-1 :
+ if round(point i of p) <> round(point length(pp) of pp) :
+ pp := pp -- point i of p ;
+ fi ;
+ endfor ;
+ save n, ok ; numeric n ; boolean ok ;
+ n := length(pp) ; ok := false ;
+ if n>2 :
+ for i=0 upto n : % evt hier ook round
+ if unitvector(round(point i of pp -
+ point if i=0 : n else : i-1 fi of pp)) <>
+ sign * unitvector(round(point if i=n : 0 else : i+1 fi of pp -
+ point i of pp)) :
+ if ok : -- else : ok := true ; fi point i of pp
+ fi
+ endfor
+ if ok and (cycle p) : -- cycle fi
+ else :
+ pp
+ fi
+ else :
+ p
+ fi
+enddef ;
+
+% vardef simplified expr p =
+% dostraightened(+1,p)
+% enddef ;
+
+% vardef unspiked expr p =
+% dostraightened(-1,p)
+% enddef ;
+
+vardef simplified expr p =
+ (reverse dostraightened(+1,dostraightened(+1,reverse p)))
+enddef ;
+
+vardef unspiked expr p =
+ (reverse dostraightened(-1,dostraightened(-1,reverse p)))
+enddef ;
+
+% path p ;
+% p := (2cm,1cm) -- (2cm,1cm) -- (2cm,1cm) -- (3cm,1cm) --
+% (4cm,1cm) -- (4cm,2cm) -- (4cm,2.5cm) -- (4cm,3cm) --
+% (3cm,3cm) -- (2cm,3cm) -- (1cm,3cm) -- (-1cm,3cm) --
+% .5[(-1cm,3cm),(1cm,1cm)] -- (1cm,1cm) -- cycle ;
+%
+% p := unitcircle scaled 4cm ;
+%
+% drawpath p ; drawpoints p ; drawpointlabels p ;
+% p := p shifted (4cm,0) ; p := straightened p ;
+% drawpath p ; drawpoints p ; drawpointlabels p ;
+% p := p shifted (4cm,0) ; p := straightened p ;
+% drawpath p ; drawpoints p ; drawpointlabels p ;
+
+% new
+
+path originpath ; originpath := origin -- cycle ;
+
+vardef unitvector primary z =
+ if abs z = abs origin : z else : z/abs z fi
+enddef;
+
+% also new
+
+vardef anchored@#(expr p, z) =
+ p shifted (z + (labxf@#*lrcorner p + labyf@#*ulcorner p
+ + (1-labxf@#-labyf@#)*llcorner p))
+enddef ;
+
+% epsed(1.2345)
+
+vardef epsed (expr e) =
+ e if e>0 : + eps elseif e<0 : - eps fi
+enddef ;
+
+% handy
+
+def withgray primary g =
+ withcolor (g,g,g)
+enddef ;
+
+% for metafun
+
+if unknown darkred : color darkred ; darkred := .625(1,0,0) fi ;
+if unknown darkyellow : color darkyellow ; darkyellow := .625(1,1,0) fi ;
+if unknown darkgray : color darkgray ; darkgray := .625(1,1,1) fi ;
+if unknown lightgray : color lightgray ; lightgray := .875(1,1,1) fi ;
+
+% an improved plain mp macro
+
+vardef center primary p =
+ if pair p : p else : .5[llcorner p, urcorner p] fi
+enddef;
+
+% new, yet undocumented
+
+vardef rangepath (expr p, d, a) =
+ (if length p>0 :
+ (d*unitvector(direction 0 of p) rotated a)
+ shifted point 0 of p
+ -- p --
+ (d*unitvector(direction length(p) of p) rotated a)
+ shifted point length(p) of p
+ else :
+ p
+ fi)
+enddef ;
+
+% under construction
+
+vardef straightpath(expr a, b, method) =
+ if (method<1) or (method>6) :
+ (a--b)
+ elseif method = 1 :
+ (a --
+ if xpart a > xpart b :
+ if ypart a > ypart b :
+ (xpart b,ypart a) --
+ elseif ypart a < ypart b :
+ (xpart a,ypart b) --
+ fi
+ elseif xpart a < xpart b :
+ if ypart a > ypart b :
+ (xpart a,ypart b) --
+ elseif ypart a < ypart b :
+ (xpart b,ypart a) --
+ fi
+ fi
+ b)
+ elseif method = 3 :
+ (a --
+ if xpart a > xpart b :
+ (xpart b,ypart a) --
+ elseif xpart a < xpart b :
+ (xpart a,ypart b) --
+ fi
+ b)
+ elseif method = 5 :
+ (a --
+ if ypart a > ypart b :
+ (xpart b,ypart a) --
+ elseif ypart a < ypart b :
+ (xpart a,ypart b) --
+ fi
+ b)
+ else :
+ (reverse straightpath(b,a,method-1))
+ fi
+enddef ;
+
+% handy for myself
+
+def addbackground text t =
+ begingroup ; save p ; picture p ;
+ p := currentpicture ; currentpicture := nullpicture ;
+ fill boundingbox p t ; addto currentpicture also p ;
+ endgroup ;
+enddef ;
+
+% makes a (line) into an infinite one (handy for calculating
+% intersection points
+
+vardef infinite expr p =
+ (-infinity*unitvector(direction 0 of p)
+ shifted point 0 of p
+ -- p --
+ +infinity*unitvector(direction length(p) of p)
+ shifted point length(p) of p)
+enddef ;
+
+% obscure macros: create var from string and replace - and :
+% (needed for process color id's)
+
+string _clean_ascii_[] ;
+
+def register_dirty_chars(expr str) =
+ for i = 0 upto length(str)-1 :
+ _clean_ascii_[ASCII substring(i,i+1) of str] := "_" ;
+ endfor ;
+enddef ;
+
+register_dirty_chars("+-*/:;., ") ;
+
+vardef cleanstring (expr s) =
+ save ss ; string ss, si ; ss = "" ; save i ;
+ for i=0 upto length(s) :
+ si := substring(i,i+1) of s ;
+ ss := ss & if known _clean_ascii_[ASCII si] : _clean_ascii_[ASCII si] else : si fi ;
+ endfor ;
+ ss
+enddef ;
+
+vardef asciistring (expr s) =
+ save ss ; string ss, si ; ss = "" ; save i ;
+ for i=0 upto length(s) :
+ si := substring(i,i+1) of s ;
+ if (ASCII si >= ASCII "0") and (ASCII si <= ASCII "9") :
+ ss := ss & char(scantokens(si) + ASCII "A") ;
+ else :
+ ss := ss & si ;
+ fi ;
+ endfor ;
+ ss
+enddef ;
+
+vardef setunstringed (expr s, v) =
+ scantokens(cleanstring(s)) := v ;
+enddef ;
+
+vardef setunstringed (expr s, v) =
+ scantokens(cleanstring(s)) := v ;
+enddef ;
+
+vardef getunstringed (expr s) =
+ scantokens(cleanstring(s))
+enddef ;
+
+vardef unstringed (expr s) =
+ expandafter known scantokens(cleanstring(s))
+enddef ;
+
+% new
+
+vardef colorpart(expr i) =
+ (redpart i, greenpart i,bluepart i)
+enddef ;
+
+% for david arnold:
+
+% showgrid(-5,10,1cm,-10,10,1cm);
+
+def showgrid (expr MinX, MaxX, DeltaX, MinY, MaxY, DeltaY)=
+ begingroup
+ save defaultfont, defaultscale, size ;
+ string defaultfont ; defaultfont := "cmtt10"; % i.e. infofont
+ numeric defaultscale ; defaultscale := 8pt / fontsize defaultfont;
+ numeric size ; size := 2pt ;
+ for x=MinX upto MaxX :
+ for y=MinY upto MaxY :
+ draw (x*DeltaX, y*DeltaY)
+ withpen pencircle scaled
+ if (x mod 5 = 0) and (y mod 5 = 0) :
+ 1.5size withcolor .50white
+ else :
+ size withcolor .75white
+ fi ;
+ endfor ;
+ endfor ;
+ for x=MinX upto MaxX:
+ label.bot(decimal x, (x*DeltaX,-size));
+ endfor ;
+ for y=MinY upto MaxY:
+ label.lft(decimal y, (-size,y*DeltaY)) ;
+ endfor ;
+ endgroup
+enddef;
+
+% new, handy for:
+%
+% \startuseMPgraphic{map}{n}
+% \includeMPgraphic{map:germany} ;
+% c_phantom (\MPvar{n}<1) (
+% fill map_germany withcolor \MPcolor{lightgray} ;
+% draw map_germany withpen pencircle scaled 1pt withcolor \MPcolor{darkgray} ;
+% ) ;
+% \includeMPgraphic{map:austria} ;
+% c_phantom (\MPvar{n}<2) (
+% fill map_austria withcolor \MPcolor{lightgray} ;
+% draw map_austria withpen pencircle scaled 1pt withcolor \MPcolor{darkgray} ;
+% ) ;
+% c_phantom (\MPvar{n}<3) (
+% \includeMPgraphic{map:swiss} ;
+% fill map_swiss withcolor \MPcolor{lightgray} ;
+% draw map_swiss withpen pencircle scaled 1pt withcolor \MPcolor{darkgray} ;
+% ) ;
+% c_phantom (\MPvar{n}<4) (
+% \includeMPgraphic{map:luxembourg} ;
+% fill map_luxembourg withcolor \MPcolor{lightgray} ;
+% draw map_luxembourg withpen pencircle scaled 1pt withcolor \MPcolor{darkgray} ;
+% ) ;
+% \stopuseMPgraphic
+%
+% \useMPgraphic{map}{n=3}
+
+vardef phantom (text t) =
+ picture _p_ ; _p_ := image(t) ; addto _p_ also currentpicture ;
+ setbounds currentpicture to boundingbox _p_ ;
+enddef ;
+
+vardef c_phantom (expr b) (text t) =
+ if b :
+ picture _p_ ; _p_ := image(t) ; addto _p_ also currentpicture ;
+ setbounds currentpicture to boundingbox _p_ ;
+ else :
+ t ;
+ fi ;
+enddef ;
+
+% done
+
+endinput ;
diff --git a/Master/texmf-dist/doc/metapost/featpost/xcmd/README.xcmd b/Master/texmf-dist/doc/metapost/featpost/xcmd/README.xcmd
new file mode 100644
index 00000000000..24400889ab5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/xcmd/README.xcmd
@@ -0,0 +1,10 @@
+It is possible to interactively experiment the effect
+of figure parameters. This requires:
+1) MetaPost code written as "anglinerigorouscircle.mp".
+2) xcmd package (kindly provided by Pedro Sebastiăo);
+ it may be downloaded from http://lince.cii.fc.ul.pt/
+ in Debian, Red Hat or tar.gz package formats.
+3) Perl.
+4) gv.
+5) run command "xcmd/xmpost anglinerigorouscircle" or
+ "xcmd/xmpost anymetapostwoextension".
diff --git a/Master/texmf-dist/doc/metapost/featpost/xcmd/xmpost b/Master/texmf-dist/doc/metapost/featpost/xcmd/xmpost
new file mode 100755
index 00000000000..3a45f6a9859
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/xcmd/xmpost
@@ -0,0 +1,70 @@
+#!/usr/bin/perl
+
+#$Id: xmpost,v 1.1 1999/05/10 17:14:27 pedros Exp $
+
+open OFILE, ">$ARGV[0]" or die " can't open $ARGV[0].pl:$!\n";
+open IFILE, "<$ARGV[0].mp" or die " can't open $ARGV[0].mp:$!\n";
+open XCMDFILE, ">$ENV{\"HOME\"}/.xcmd/$ARGV[0]" or die " can't open ~/.xcmd/$ARGV[0]:$!\n";
+
+my $tmp_mp_file = "$ARGV[0].$$";
+
+my $i=$j=0;
+
+while(<IFILE>){
+# s/\s*(\w+)\s*\t*\s*:*=\s*([\(0-9,-.\)]*);/\t$1\t:=\$opt_$1;/;
+ $lines[$j++]=$_;
+ if($_ =~ /\s*(\w+)\s*\t*\s*:=\s*([\(0-9,-.\)]*);/){
+ print XCMDFILE "OPTION_WITH_ARG --$1 DEFAULT \"$2\"\n";
+# print OFILE "\t$1\t\t:=\$opt_$1;\n";
+ $arr[$i++]="\$opt_$1";
+ }
+}
+close IFILE;
+
+print OFILE "#!/usr/bin/perl\n\n";
+print OFILE " use vars qw(";
+
+foreach $i (0..$#arr-1){
+ print OFILE "$arr[$i] ";
+}
+print OFILE "$arr[$#arr]);\n\n";
+
+print OFILE "\n\nuse Getopt::Long;\n\n";
+
+
+foreach $i (0..$#arr){
+ print OFILE "$arr[$i]=\"\";\n";
+}
+print OFILE "\n\nGetOptions(";
+foreach $i (0..$#arr-1){
+ $arr[$i] =~ s/\$opt_//;
+ print OFILE "\"$arr[$i]=s\",";
+}
+$arr[$#arr] =~ s/\$opt_//;
+
+print OFILE "\"$arr[$#arr]=s\") || die \"Aborted\";\n";
+print OFILE "\$file = \"$tmp_mp_file\";\n";
+print OFILE "\nopen TMP, \">/tmp/\$file.mp\" || die \"can't open /tmp/\$file.mp \$!\\n\";\n";
+
+foreach $j (0..$#lines){
+ $_ = $lines[$j];
+ chop;
+ s/\%/\\\%/g;
+ s/\\/\\\\/g;
+ s/\$/\\\$/g;
+ s/\s*(\w+)\s*\t*\s*:=\s*([\(0-9,-.\)]*);/\t$1\t\t:= \$opt_$1;/;
+ print OFILE "print TMP \"$_\\n\";\n";
+}
+print OFILE "close TMP;\n";
+
+print OFILE "\$tmp = `inimpost featpost.mp`;\n";
+print OFILE "\$tmp = `mpost -mem featpost /tmp/\$file.mp`;\n";
+print OFILE "\$tmp = `laproof /tmp/\$file 1`;\n";
+
+my $tmp = `chmod +x $ARGV[0]`;
+$tmp = `cp $ARGV[0].mp /tmp/$tmp_mp_file.mp`;
+$tmp= `inimpost featpost.mp`;
+$tmp = `mpost -mem featpost /tmp/$tmp_mp_file.mp`;
+$tmp = `laproof /tmp/$tmp_mp_file 1`;
+system("gv -watch $tmp_mp_file.1.eps &");
+system("xcmd $ARGV[0] &");
diff --git a/Master/texmf-dist/doc/metapost/hatching/htchuse.mp b/Master/texmf-dist/doc/metapost/hatching/htchuse.mp
new file mode 100644
index 00000000000..493ce3ad537
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/hatching/htchuse.mp
@@ -0,0 +1,55 @@
+%%% addto hatchfill
+%%% addto beginfig
+%%% enddef endfig
+%%% length withcolor dashed off on
+% This is a sample file demonstrating how one can use the macros defined
+% in hatching.mp.
+
+input hatching.mp;
+
+vardef star(expr n) =
+ for i_:=0 upto 2n-1:
+ if odd i_: 1/2 fi (right rotated (180*(i_/n))) --
+ endfor cycle
+enddef;
+
+beginfig(100);
+ path p; p:=unitsquare xscaled 50mm yscaled 25mm;
+ hatchfill p withcolor red withcolor (45,2mm,-.5bp) withcolor (-45,2mm,-.5bp);
+
+endfig;
+
+beginfig(101);
+ interim hatch_match:=0;
+ path p; p:=star(10) xscaled 35mm yscaled 20mm rotated 20;
+ hatchfill p withcolor (0,1,.5);
+ draw image(hatchfill p
+ withcolor (45,3bp,-.5bp) withcolor (-45,3bp,-.5bp);
+ ) withcolor red dashed evenly; % |evenly=dashpattern(on 3bp off 3bp)|
+endfig;
+
+beginfig(102);
+ path p; p:=star(10) xscaled 35mm yscaled 20mm rotated 20;
+ interim hatch_match:=0;
+ hatchoptions(withcolor blue dashed evenly scaled 2);
+ hatchfill p withcolor .75white withcolor (20,6bp,-.5bp);
+ hatchoptions(withcolor (blue+green) dashed evenly shifted (3/2bp,0));
+ hatchfill p withcolor (110,6bp,-.5bp);
+endfig;
+
+beginfig(103);
+ path p; p:=star(10) xscaled 35mm yscaled 35mm;
+ save draw_hatched_band;
+ vardef draw_hatched_band(expr za,zb,a,l,d) =
+ save n_; n_:=length(za-zb)/l;
+ for i_:=0 upto ceiling n_:
+ fill star(10) xscaled 2/5l yscaled 2/5l
+ shifted (i_/n_)[za,zb] withcolor (i_/n_)[green,blue];
+ endfor
+ enddef;
+ hatchfill p withcolor (red+green) withcolor (45,10bp,-1bp);
+endfig;
+
+end.
+%%\end
+
diff --git a/Master/texmf-dist/doc/metapost/hatching/htchuse_.tex b/Master/texmf-dist/doc/metapost/hatching/htchuse_.tex
new file mode 100644
index 00000000000..bf10d5c7475
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/hatching/htchuse_.tex
@@ -0,0 +1,11 @@
+\input epsf % dvips standard
+\nopagenumbers
+
+\lineskiplimit\maxdimen \lineskip5mm
+
+\centerline{\epsffile{htchuse.100}}
+\centerline{\epsffile{htchuse.101}}
+\centerline{\epsffile{htchuse.102}}
+\centerline{\epsffile{htchuse.103}}
+
+\end
diff --git a/Master/texmf-dist/doc/metapost/hatching/readme b/Master/texmf-dist/doc/metapost/hatching/readme
new file mode 100644
index 00000000000..da6ac0e89e8
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/hatching/readme
@@ -0,0 +1,52 @@
+-------------------------------------+-------------------------------------
+ ENGLISH | POLSKI
+-------------------------------------+-------------------------------------
+The file HATCHING.MP contains a set | Plik HATCHING.MP zawiera zestaw makr
+of METAPOST macros for hatching | METAPOST-owych do zakreskowywania
+interior of closed paths. | wn/etrza zamkni/etych /scie/zek.
+
+ made in BOP s.c.
+ e-mail: B.Jackowski@gust.org.pl
+ public domain software
+ (no copyrights, copylefts, copyups, copydowns, or whatsoever)
+
+ 21.09.2000 -- ver 0.11 (pre-release)
+
+The basic macro, hatchfill, works | Podstawowym makrem pakietu jest makro
+very much like the standard fill | hatchfill, dzia/laj/ace bardzo
+command. The general form of the | podobnie do makra fill. Og/olna
+hatchfill command call is as | posta/c u/zycia polecenia hatchfill
+follows: | wygl/ada nast/epuj/aco:
+
+ hatchfill path_expression withcolor c1 withcolor c2 ...
+
+The trick is that for hatching | Trick polega u/zyciu specjalnych
+special ``colors'' are used, namely, | ,,kolor/ow'' -- je/sli mianowicie
+if bluepart(c)<0, the colour c is | bluepart(c)<0, to sk/ladowe koloru c
+interpreted as hatching data: | s/a traktowane jako informacja
+ | o zakreskowaniu:
+
+ hatching angle redpart(c) k/at nachylenia
+ distance between lines greenpart(c) odleg/lo/s/c mi/edzy kreskami
+ thickness of lines -bluepart(c) grubo/s/c kresek
+
+Dashing and colouring of the hatch | Za pomoc/a makra hatchoptions mo/zna
+pattern can be accomplished by | zdefiniowa/c kolor kresek a tak/ze
+using hatchoptions command (cf. | wz/or w przypadku linii przerywanych
+drawoptions in plain.mp). Actually, | (por. makro drawoptions, plain.mp).
+an arbitrary pattern can be used | W istocie dowolny obiekt mo/ze zosta/c
+instead of straight lines: it | u/zyty do wype/lnienia /scie/zki: w tym
+suffices to redefine the macro | celu nale/zy zdefiniowa/c w odpowiedni
+draw_hatched_band (cf. htchuse.mp, | spos/ob makro draw_hatched_band (por.
+figure 103), although one should be | htchuse.mp, ilustracja 103), jednak/ze
+aware that METAPOST memory can be | nale/zy pami/eta/c, /ze w ten spos/ob
+easily overloaded and that the | mo/zna /latwo wyczerpa/c zasoby
+resulting EPS files are usually | pami/eciowe METAPOST-a i /ze na og/o/l
+annoyingly large. | otrzymuje si/e pliki irytuj/aco du/ze.
+ |
+The examples of usage can be found | Przyk/lady u/zycia mo/zna znale/x/c
+in htchuse.mp; for convenience, | w pliku htchuse.mp; dla wygody
+a trivial TeX file for typesetting | do/l/aczony zosta/l trywialny pliczek
+the figures, htchuse_.tex, is | TeX-owy (htchuse_.tex), sk/ladaj/acy
+included. | jedn/a stron/e z tymi przyk/ladami.
+
diff --git a/Master/texmf-dist/doc/metapost/latexmp/README b/Master/texmf-dist/doc/metapost/latexmp/README
new file mode 100644
index 00000000000..829eeb5943c
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/latexmp/README
@@ -0,0 +1,11 @@
+The MetaPost package latexMP implements a user-friendly
+interface to access LaTeX-based typesetting capabilities in
+MetaPost.
+The text to be typeset is given as string. This allows even
+dynamic text elements, for example counters, to be used in
+labels. Compared to other implementations it is much more
+flexible, since it can be used as direct replacement for
+btex..etex, and much faster, compared for example to
+the solution provided by tex.mp.
+
+All files of the package belong to the Public Domain.
diff --git a/Master/texmf-dist/doc/metapost/latexmp/examples.pdf b/Master/texmf-dist/doc/metapost/latexmp/examples.pdf
new file mode 100644
index 00000000000..2ef6cf299a2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/latexmp/examples.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/latexmp/latexmp.pdf b/Master/texmf-dist/doc/metapost/latexmp/latexmp.pdf
new file mode 100644
index 00000000000..e96ff5a4e5a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/latexmp/latexmp.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/latexmp/lmp-grph.mp b/Master/texmf-dist/doc/metapost/latexmp/lmp-grph.mp
new file mode 100644
index 00000000000..1602717b6ab
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/latexmp/lmp-grph.mp
@@ -0,0 +1,34 @@
+input latexmp ;
+input graph ;
+
+% create data file
+write "10 2e-2" to "lmp-data.dat" ;
+write "20 3e4" to "lmp-data.dat" ;
+write "30 8e4" to "lmp-data.dat" ;
+write "100 7e4" to "lmp-data.dat" ;
+write "130 2e5" to "lmp-data.dat" ;
+write "200 4e5" to "lmp-data.dat" ;
+write "500 8e5" to "lmp-data.dat" ;
+write "600 1e7" to "lmp-data.dat" ;
+write "1000 2e7" to "lmp-data.dat" ;
+write "2000 8e7" to "lmp-data.dat" ;
+write EOF to "lmp-data.dat" ;
+%
+
+setupLaTeXMP(
+ mode=normal,% 'graph' package does not work in rerun mode
+ packages="mathpazo") ;
+
+
+init_numbers(textext("$-$"),textext("$1$"),textext("${\times}10$"),
+ textext("${}^-$"),textext("${}^2$")) ;
+Fe_base:=textext("$10$") ;
+
+beginfig(1);
+ draw begingraph(6cm,4cm)
+ setcoords(linear,log);
+ gdraw "lmp-data.dat" ;
+ endgraph ;
+endfig;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/latexmp/lmp-mc-text.tex b/Master/texmf-dist/doc/metapost/latexmp/lmp-mc-text.tex
new file mode 100644
index 00000000000..d9f2dd20aaf
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/latexmp/lmp-mc-text.tex
@@ -0,0 +1,23 @@
+\textcolor[rgb]{0.9,0.65,0}{\bfseries Der Löwe und die Mücke}
+\color[gray]{0.4}Eine Mücke forderte mit den übermütigsten Worten
+einen Löwen zum Zweikampf heraus: \textcolor{blue}{Ich
+fürchte dich nicht, du großes Ungeheuer}, rief sie ihm
+zu, \textcolor{blue}{weil du gar keine Vorzüge vor mir hast;
+oder nenne sie mir, wenn du solche zu haben glaubst; etwa
+die, dass du deinen Raub mit Krallen zerreißest und
+mit Zähnen zermalmest? Jedes andere feige Tier, wenn es
+mit einem Tapfern kämpft, tut dasselbe, es beißt und
+kratzt. \color[rgb]{0.7,0,0}Du sollst aber empfinden,
+dass ich stärker bin als du!}
+Mit diesen Worten flog sie in eines seiner
+Nasenlöcher und stach ihn so sehr, dass er sich vor
+Schmerz selbst zerfleischte und sich für überwunden
+erklärte.
+
+\color[rgb]{0,0.6,0}Stolz auf diesen Sieg flog die Mücke davon,
+um ihn aller Welt auszuposaunen, übersah aber das Gewebe einer Spinne
+und verfing sich in demselben. Gierig umarmte die Spinne
+sie und sog ihr das \textcolor{red}{Heldenblut} aus. Sterbend empfand
+die Mücke ihre Nichtigkeit, indem sie, die Besiegerin des
+Löwen, einem so verächtlichen Tiere, einer Spinne,
+erliegen musste.
diff --git a/Master/texmf-dist/doc/metapost/latexmp/lmp-mc.mp b/Master/texmf-dist/doc/metapost/latexmp/lmp-mc.mp
new file mode 100644
index 00000000000..3b75c270648
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/latexmp/lmp-mc.mp
@@ -0,0 +1,11 @@
+
+input latexmp ;
+
+setupLaTeXMP(mode=rerun,
+ fontencoding="T1",inputencoding="latin1",language="ngerman",
+ textextlabel=enable, multicolor=enable) ;
+
+beginfig(1);
+ label("\parbox{12cm}{\input{lmp-mc-text}}", origin) ;
+endfig;
+end
diff --git a/Master/texmf-dist/doc/metapost/latexmp/lmp-mfun.mp b/Master/texmf-dist/doc/metapost/latexmp/lmp-mfun.mp
new file mode 100644
index 00000000000..a5b44f1b2be
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/latexmp/lmp-mfun.mp
@@ -0,0 +1,34 @@
+input metafun ;
+cmykcolors:=true ;% enable cmyk-specials in MetaFun
+input latexmp ;
+
+% - mode is set to 'normal' since MetaFun doesn't work in rerun-mode;
+% please rerun manually
+% - the file has to be converted in PDF using MPtoPDF in order
+% to interpret the MP-specials generated by MetaFun
+
+setupLaTeXMP(packages="helvet",
+ preamble="\renewcommand{\familydefault}{\sfdefault}",
+ textextlabel=enable,multicolor=enable) ;
+
+beginfig(1);
+ save p,c ; pair p ; color c ;
+
+ for i=1 upto 100:
+ p:= (uniformdeviate 8cm, uniformdeviate 5cm) ;
+ label.urt("\bfseries\transparent{0.2}{MetaFun}",p) ;
+ endfor;
+
+ for i=1 upto 20:
+ c:= (uniformdeviate 1, uniformdeviate 1, uniformdeviate 1) ;
+ p:= (-50pt+uniformdeviate 100pt, -50pt+uniformdeviate 100pt) ;
+ label("\bfseries\Huge\color[rgb]{" &
+ (decimal redpart c) & "," & (decimal greenpart c) & "," &
+ (decimal bluepart c) & "}" &
+ "\transparent{0.4}{MetaFun}",(5cm,2.5cm)+p) ;
+ endfor;
+
+ label.top("two different greens: one in \textcolor[cmyk]{1,0,1,0}{cmyk} " &
+ "and one in \textcolor[rgb]{0,1,0}{rgb}", (5cm,2.5cm)) ;
+endfig;
+end
diff --git a/Master/texmf-dist/doc/metapost/latexmp/lmp-pkg.mp b/Master/texmf-dist/doc/metapost/latexmp/lmp-pkg.mp
new file mode 100644
index 00000000000..fd6613cf884
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/latexmp/lmp-pkg.mp
@@ -0,0 +1,41 @@
+
+input latexmp ;
+
+string OrdMacro, OoosMacro, otherDefs ;
+
+OrdMacro :=
+"\newcommand*{\Ord}[1]{\ifcase #1\relax" &
+ " #1\textsuperscript{th}\or" &
+ " #1\textsuperscript{st}\or" &
+ " #1\textsuperscript{nd}\or" &
+ " #1\textsuperscript{rd}\else" &
+ " #1\textsuperscript{th}\fi}" ;
+
+OoosMacro :=
+ "\newcommand*{\Ooos}[1]{\setcounter{Ooos}{1}O\whiledo{\value{Ooos}<#1}" &
+ "{o\stepcounter{Ooos}}h}" ;
+
+otherDefs := "\newcounter{Ooos}\renewcommand{\familydefault}{\sfdefault}" ;
+
+setupLaTeXMP(
+ mode=rerun,
+ inputencoding="latin1",
+ fontencoding="T1",
+ packages="helvet,calc,ifthen,mflogo",
+ preamble=(OrdMacro & OoosMacro & otherDefs) ,
+ textextlabel=enable );
+
+beginfig(1);
+ for i=1 upto 5:
+ label.urt( "\Ord{" & (decimal i) & "} {\MP} label",(0,-10*i) ) ;
+ endfor;
+endfig;
+
+beginfig(2);
+ for i=1 upto 50:
+ label( "\Ooos{" & (decimal i)& "}",(0,10*i) ) ;
+ endfor;
+ currentpicture:= (currentpicture slanted 0.5) yscaled 0.7 ;
+endfig;
+
+bye
diff --git a/Master/texmf-dist/doc/metapost/mp3d/README b/Master/texmf-dist/doc/metapost/mp3d/README
new file mode 100644
index 00000000000..499a872c0b1
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/README
@@ -0,0 +1,84 @@
+ 3d/3dgeom version 1.34
+ ======================
+
+This release is a intermediary release of the 3d metapost package.
+It updates the 3d package (CTAN:graphics/metapost/macros/3d)
+and adds features facilitating the creation of space geometry drawings.
+
+There have been a number of changes, and as a consequence we had
+to slightly update the description published in TUGboat in 1998.
+See the doc directory. The doc directory contains both
+the old 1998 article, a corrected version, the 2001 GUTenberg
+article on geometry in space and its translation which appeared in 2003
+(TUGboat 2001).
+
+The 1998 package is completely contained in this release in the directory
+v1.0, except that some files have been renamed in order to prevent
+a conflict. For istance, 3d.mp has been renamed into 3d-1.0.mp
+when necessary. Also, the doc directory from the 1.0 version has been
+transferred to the current doc directory.
+
+The 1.0 version should still be of interest for the documentation
+of its file, which used mft (see for instance v1.0/doc/3d-1.0.ps).
+
+As version 1.34 is an intermediate release, it may lack some
+uniformity which might be added later. Also, the sources do contain
+preliminary and documented material.
+
+This release contains three directories:
+
+ doc : documentation
+ examples : all the examples from the Space Geometry article
+ inputs : the files needed for metapost
+
+
+HOW TO CREATE AN ANIMATION
+--------------------------
+
+Details are given to produce the standard animation
+under UNIX, with the binaries listed below.
+For other architectures, you may have to adapt the
+write_script macro in the 3d.mp file.
+
+ 1) create a directory and copy the .mp files from the
+ inputs directory to it.
+ 2) apply metapost to animpoly.mp ; this will create 100 files
+ named animpoly.101, animpoly.102, ..., animpoly.200.
+ It will also have created a script file named
+ create_animation.sh
+ 3) copy the gifmerge utility (as well as programs such as pnmcut,...)
+ in this directory or let it be reachable through PATH.
+ 4) apply sh to create_animation.sh; this will create the animation;
+ first the metapost outputs are converted to gif, then
+ they are collated with gifmerge.
+ 5) the result is animpoly.gif which is a GIF89A animation file;
+ it can be viewed under netscape or simply with a program like xanim.
+
+ Binaries required by the 3D package
+ -----------------------------------
+
+As it is, the generation of animated gifs requires the following
+programs:
+
+ awk
+ gs (ghostscript)
+ pnmcut
+ ppmquant
+ ppmtogif
+ gifmerge
+
+These executables are not part of that distribution.
+
+The first two are widely available on UNIX.
+The three p* programs are part of the NETPBM toolkit.
+You can find this toolkit on the web through any search tool.
+And gifmerge can be found at http://www.iis.ee.ethz.ch/~kiwi/GIFMerge.
+
+I have no idea how to port all this on other architectures,
+but I assume there are similar tools for PCs or Macs.
+I'd be interested to get feedback and details so that i can
+include instructions in future releases of my package.
+
+========================================================================
+Denis Roegel, 17 August 2003
+roegel@loria.fr
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube10.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube10.mp
new file mode 100644
index 00000000000..7cc6cb78731
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube10.mp
@@ -0,0 +1,88 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+% Oblique projections of the cube
+
+input 3danim
+output_res:=72;
+drawing_scale:=2cm;
+
+%set_plane_(projection_plane)(point_null,vec_I,vec_J);
+set_plane_(projection_plane)(point_null,vec_I,vec_K);
+
+new_plane_(horizontal_plane)(point_null,vec_I,vec_J);
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,8); % 8 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_line(3,7);draw_lines(8,7,5);
+ draw_line(2,6);draw_line(4,8);
+ draw_lines(5,6,8);draw_lines(4,3);draw_lines(2,4);
+ drawoptions(dashed evenly);
+ draw_lines(1,2);draw_lines(3,1);draw_line(1,5);
+ drawoptions();
+enddef;
+
+assign_obj("cube","C");
+point_of_view_obj("cube",8,Obs_phi);
+
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),CAVALIER,30,50); % 30
+
+beginfig(100);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),CABINET,30,20); % 30
+
+beginfig(101);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),30,20,20); % 20
+
+beginfig(102);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+new_point(hp);
+set_point_(hp)(0,1,1);
+
+set_plane_(horizontal_plane)(hp,vec_I,vec_K);
+% such a plane and a second angle of 90 degrees produces a
+% ``planometric'' view.
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),30,90,20); % 20
+
+vardef draw_C(expr inst)=
+ draw_lines(8,7);draw_line(3,7);draw_lines(7,5);
+ draw_lines(1,2);draw_lines(3,1);
+ draw_line(1,5);
+ draw_lines(4,3);draw_lines(2,4);draw_line(4,8);
+ drawoptions(dashed evenly);
+ draw_lines(5,6);
+ draw_line(2,6);draw_lines(6,8);
+ drawoptions();
+enddef;
+
+beginfig(103);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+end.
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube4-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube4-eng.mp
new file mode 100644
index 00000000000..7a841d2e8b4
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube4-eng.mp
@@ -0,0 +1,124 @@
+verbatimtex
+%&latex
+\documentclass{article}
+
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=20cm;
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,21); % 21 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+
+ % corners of the projection plane
+ %set_point(9)(12.92993,12.37372,6.83334);
+ %set_point(10)(15.68588,8.48413,6.8334);
+ %set_point(11)(16.27899,8.90436,4.12851);
+ %set_point(12)(13.52304,12.79395,4.12845);
+
+ %set_point(9)(13.76718,11.50638,6.15714);
+ %set_point(10)(15.14517,9.56158,6.15717);
+ %set_point(11)(15.44174,9.7717,4.80472);
+ %set_point(12)(14.06375,11.71649,4.80469);
+
+ set_point(9)(0.80682,2.27571,1.939);
+ set_point(10)(2.03946,0.2357,1.93903);
+ set_point(11)(2.46796,0.49461,0.63113);
+ set_point(12)(1.23532,2.53462,0.6311);
+
+ % shown observator
+ set_point(13)(3.23608,2.35114,2);
+
+ % intersections with the projection plane
+ new_plane(pl)(9,10,11);
+ new_line(l)(1,13);
+ if not def_inter_p_l_pl(14)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(2,13);
+ if not def_inter_p_l_pl(15)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(3,13);
+ if not def_inter_p_l_pl(16)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(4,13);
+ if not def_inter_p_l_pl(17)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(5,13);
+ if not def_inter_p_l_pl(18)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(6,13);
+ if not def_inter_p_l_pl(19)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(7,13);
+ if not def_inter_p_l_pl(20)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(8,13);
+ if not def_inter_p_l_pl(21)(l)(pl):
+ message "PROBLEM ";
+ fi;
+
+ free_line(l);
+ free_plane(pl);
+
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ draw_lines(9,10,11,12,9);
+ pickup pencircle scaled 2pt;
+ draw_line(13,13);draw_line(1,1);draw_line(2,2);draw_line(3,3);draw_line(7,7);
+ pickup pencircle scaled .4pt;
+ draw fullcircle scaled 6pt shifted z[ipnt_(8)];
+ label_obj.lft(btex \textit{Obs}$(3.23,2.35,2)$ etex,13);
+ label_obj.rt(btex $(0,0,0)$ etex,1);
+ label_obj.rt(btex $(0,0,1)$ etex,2);
+ label_obj.bot(btex $(0,1,0)$ etex,3);
+ label_obj.llft(btex $(1,1,0)$ etex,7);
+
+ drawoptions(dashed withdots);
+ draw_line(1,13);draw_line(2,13);draw_line(3,13);draw_line(4,13);
+ draw_line(5,13);draw_line(6,13);draw_line(7,13);draw_line(8,13);
+ drawoptions();
+ draw_line(14,15,17,16,14);draw_lines(18,19,21,20,18);
+ draw_line(14,18);draw_line(15,19);draw_line(16,20);draw_line(17,21);
+enddef;
+
+assign_obj("cube","C");
+
+for i:=28 upto 28:
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),4);
+ show_point("Obs",Obs);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("cube",14,Obs_phi);
+ draw_obj("cube");
+ endfig;
+endfor;
+
+end.
+
+
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube5.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube5.mp
new file mode 100644
index 00000000000..9c3370744ee
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube5.mp
@@ -0,0 +1,86 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=2cm;
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,11); % 11 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+ % vanishing points
+ def_screen_pl(screen);
+ new_line(l)(1,2);
+ if not def_vanishing_point_p_l_pl(9)(l)(screen):
+ message "no vanishing point 1";
+ set_point(9)(0,0,0);
+ fi;
+ set_line(l)(1,3);
+ if not def_vanishing_point_p_l_pl(10)(l)(screen):
+ message "no vanishing point 2";
+ set_point(10)(0,0,0);
+ fi;
+ set_line(l)(1,5);
+ if not def_vanishing_point_p_l_pl(11)(l)(screen):
+ message "no vanishing point 3";
+ set_point(11)(0,0,0);
+ fi;
+ free_line(l);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ pickup pencircle scaled 4pt;
+ drawoptions(withcolor red);
+ if z[ipnt_(9)]=(10,10):draw_line(9,9);
+ fi;
+ if z[ipnt_(10)]=(10,10):draw_line(10,10);
+ fi;
+ if z[ipnt_(11)]=(10,10):draw_line(11,11);
+ fi;
+ drawoptions();
+ pickup pencircle scaled 1pt;
+ draw_line(9,9);draw_line(10,10);draw_line(11,11);
+ pickup pencircle scaled 0.4pt;
+ drawoptions(dashed evenly scaled 0.5);
+ for j:=1,3,5,7:draw_line(j,9);endfor;
+ for j:=3,4,7,8:draw_line(j,10);endfor;
+ for j:=1 upto 4:draw_line(j,11);endfor;
+ drawoptions();
+enddef;
+
+new_plane_(screen)(0,0,0); % must be defined before |assign_obj|
+ % because |assign_obj| calls |set_C_point|
+
+% we change the field because we are very close
+h_field:=120; % degrees
+v_field:=120; % degrees
+
+
+assign_obj("cube","C");
+
+%for i:=0 upto 100:
+i=97;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(1.8*cosd(3.6*i),1.8*sind(3.6*i),2);
+ Obs_phi:=90;Obs_dist:=0.5;point_of_view_obj("cube",8,Obs_phi);
+ reset_obj("cube");
+ draw_obj("cube");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube6.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube6.mp
new file mode 100644
index 00000000000..228cd35f9da
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube6.mp
@@ -0,0 +1,94 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=2cm;
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,12); % 12 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+ % vanishing points
+ def_screen_pl(screen);
+ new_line(l)(1,2);
+ if not def_vanishing_point_p_l_pl(9)(l)(screen):
+ message "no vanishing point 1";
+ set_point(9)(0,0,0);
+ fi;
+ set_line(l)(1,3);
+ if not def_vanishing_point_p_l_pl(10)(l)(screen):
+ message "no vanishing point 2";
+ set_point(10)(0,0,0);
+ fi;
+ set_line(l)(1,5);
+ if not def_vanishing_point_p_l_pl(11)(l)(screen):
+ message "no vanishing point 3";
+ set_point(11)(0,0,0);
+ fi;
+ set_line(l)(1,7);
+ if not def_vanishing_point_p_l_pl(12)(l)(screen):
+ message "no vanishing point 4";
+ set_point(12)(0,0,0);
+ fi;
+ free_line(l);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ pickup pencircle scaled 4pt;
+ drawoptions(withcolor red);
+ if z[ipnt_(9)]=(10,10):draw_line(9,9);
+ fi;
+ if z[ipnt_(10)]=(10,10):draw_line(10,10);
+ fi;
+ if z[ipnt_(11)]=(10,10):draw_line(11,11);
+ fi;
+ if z[ipnt_(12)]=(10,10):draw_line(12,12);
+ fi;
+ drawoptions();
+ pickup pencircle scaled 1pt;
+ draw_line(9,9);draw_line(10,10);draw_line(11,11);draw_line(12,12);
+ pickup pencircle scaled 0.4pt;
+ drawoptions(dashed evenly scaled 0.5);
+ for j:=1,3,5,7:draw_line(j,9);endfor;
+ for j:=3,4,7,8:draw_line(j,10);endfor;
+ for j:=1 upto 4:draw_line(j,11);endfor;
+ draw_line(1,12);draw_line(2,12);
+ drawoptions();
+enddef;
+
+new_plane_(screen)(0,0,0); % must be defined before |assign_obj|
+ % because |assign_obj| calls |set_C_point|
+
+% on change le champ car on est trčs prčs
+h_field:=160; % degrees
+v_field:=160; % degrees
+
+
+assign_obj("cube","C");
+
+%for i:=0 upto 100:
+i=97;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(1.8*cosd(3.6*i),1.8*sind(3.6*i),2);
+ Obs_phi:=90;Obs_dist:=0.5;point_of_view_obj("cube",8,Obs_phi);
+ reset_obj("cube");
+ draw_obj("cube");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube7.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube7.mp
new file mode 100644
index 00000000000..28df75f1e85
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube7.mp
@@ -0,0 +1,133 @@
+% The nine vanishing points of a cube
+% D. Roegel, 22 January 2001
+% Warning: this figure is very sensitive to small motions!
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=1cm;
+
+def draw_arrowline_extra(expr i,j)(expr exi,exj)=
+ drawarrow exi[z[ipnt_(i)],z[ipnt_(j)]]--exj[z[ipnt_(i)],z[ipnt_(j)]];
+enddef;
+
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,17); % 17 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+ % vanishing points
+ def_screen_pl(screen);
+ new_line(l)(1,2);
+ if not def_vanishing_point_p_l_pl(9)(l)(screen):
+ message "no vanishing point 1";
+ set_point(9)(0,0,0);
+ fi;
+ set_line(l)(1,3);
+ if not def_vanishing_point_p_l_pl(10)(l)(screen):
+ message "no vanishing point 2";
+ set_point(10)(0,0,0);
+ fi;
+ set_line(l)(1,5);
+ if not def_vanishing_point_p_l_pl(11)(l)(screen):
+ message "no vanishing point 3";
+ set_point(11)(0,0,0);
+ fi;
+ set_line(l)(1,7);
+ if not def_vanishing_point_p_l_pl(12)(l)(screen):
+ message "no vanishing point 4";
+ set_point(12)(0,0,0);
+ fi;
+ set_line(l)(5,3);
+ if not def_vanishing_point_p_l_pl(13)(l)(screen):
+ message "no vanishing point 5";
+ set_point(13)(0,0,0);
+ fi;
+ set_line(l)(5,8);
+ if not def_vanishing_point_p_l_pl(14)(l)(screen):
+ message "no vanishing point 6";
+ set_point(14)(0,0,0);
+ fi;
+ set_line(l)(6,7);
+ if not def_vanishing_point_p_l_pl(15)(l)(screen):
+ message "no vanishing point 7";
+ set_point(15)(0,0,0);
+ fi;
+ set_line(l)(5,2);
+ if not def_vanishing_point_p_l_pl(16)(l)(screen):
+ message "no vanishing point 8";
+ set_point(16)(0,0,0);
+ fi;
+ set_line(l)(6,1);
+ if not def_vanishing_point_p_l_pl(17)(l)(screen):
+ message "no vanishing point 9";
+ set_point(17)(0,0,0);
+ fi;
+
+ free_line(l);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ pickup pencircle scaled 4pt;
+ drawoptions(withcolor red);
+ for i:=9 upto 17:
+ if z[ipnt_(i)]=(10,10):draw_line(i,i);
+ fi;
+ endfor;
+ drawoptions();
+ pickup pencircle scaled 1pt;
+ for i:=9 upto 17:draw_line(i,i);endfor;
+ pickup pencircle scaled 0.4pt;
+ drawoptions(dashed evenly scaled 0.5);
+ for j:=1,3,5,7:draw_line(j,9);endfor;
+ for j:=3,4,7,8:draw_line(j,10);endfor;
+ for j:=1 upto 4:draw_line(j,11);endfor;
+ draw_line(1,12);draw_line(2,12);
+ drawoptions(dashed evenly scaled 0.5 withcolor red);
+ for j:=5,6:draw_line(j,13);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor green);
+ for j:=1,5:draw_line(j,14);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor blue);
+ for j:=2,6:draw_line(j,15);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor green);
+ for j:=2,4:draw_line(j,16);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor red);
+ for j:=6,8:draw_line(j,17);endfor;
+
+ drawoptions();
+enddef;
+
+new_plane_(screen)(0,0,0); % must be defined before |assign_obj|
+ % because |assign_obj| calls |set_C_point|
+
+% we change the field, because we are very close
+h_field:=170; % degrees
+v_field:=170; % degrees
+
+
+assign_obj("cube","C");
+
+%for i:=0 upto 100:
+i=96;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(1.7*cosd(3.6*i),1.8*sind(3.6*i),1.8);
+ Obs_phi:=90;Obs_dist:=0.5;point_of_view_obj("cube",8,Obs_phi);
+ reset_obj("cube");
+ draw_obj("cube");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube8.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube8.mp
new file mode 100644
index 00000000000..f555a2637cb
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube8.mp
@@ -0,0 +1,48 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+
+% oblique projections
+
+input 3danim
+output_res:=72;
+drawing_scale:=3cm;
+
+projection_type:=2;
+
+%set_plane_(projection_plane)(point_null,vec_I,vec_J);
+set_plane_(projection_plane)(point_null,vec_I,vec_K);
+
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,8); % 8 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+enddef;
+
+assign_obj("cube","C");
+
+for i:=0 upto 20:
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("cube",8,Obs_phi);
+ draw_obj("cube");
+ endfig;
+endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube9.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube9.mp
new file mode 100644
index 00000000000..1e52203a811
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube9.mp
@@ -0,0 +1,66 @@
+% Cube projections
+% D. Roegel 23 January 2001
+% roegel@loria.fr
+
+
+input 3danim
+output_res:=72;
+drawing_scale:=2cm;
+
+projection_type:=1;
+
+%set_plane_(projection_plane)(point_null,vec_I,vec_J);
+%set_plane_(projection_plane)(point_null,vec_I,vec_K);
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,8); % 8 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);
+ draw_line(2,6);draw_line(4,8);draw_line(1,5);
+ draw_lines(5,6,8);
+ drawoptions(dashed evenly);
+ draw_line(3,7);draw_lines(8,7,5);
+ drawoptions();
+enddef;
+
+assign_obj("cube","C");
+
+% Trimetric projection
+i:=67;
+beginfig(167);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("cube",8,Obs_phi);
+ draw_obj("cube");
+endfig;
+
+% Isometric projection
+isometric_projection(vec_I,vec_J,vec_K,pnt_obj("cube",8),Obs_dist,90);
+
+beginfig(168);
+ draw_obj("cube");
+endfig;
+
+% Dimetric projection
+dimetric_projection(vec_I,vec_J,vec_K,0.5,pnt_obj("cube",8),3*Obs_dist,90);
+
+beginfig(169);
+ draw_obj("cube");
+endfig;
+
+end.
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1-eng.mp
new file mode 100644
index 00000000000..bf144e1eeae
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1-eng.mp
@@ -0,0 +1,75 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=7cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ drawoptions();
+ draw_line(2,3);draw_line(2,4);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.ulft(btex $A_1$ etex,1);
+ label_obj.rt(btex $B_2$ etex,2);
+ label_obj.lft(btex $C_3$ etex,3);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.top(btex $I_5$ etex,5);
+ label_obj.top(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1.mp
new file mode 100644
index 00000000000..82a76d2c042
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1.mp
@@ -0,0 +1,76 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=7cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ drawoptions();
+ draw_line(2,3);draw_line(2,4);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.ulft(btex $A_1$ etex,1);
+ label_obj.rt(btex $B_2$ etex,2);
+ label_obj.lft(btex $C_3$ etex,3);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.top(btex $I_5$ etex,5);
+ label_obj.top(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2-eng.mp
new file mode 100644
index 00000000000..7ff4e581013
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2-eng.mp
@@ -0,0 +1,90 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2.mp
new file mode 100644
index 00000000000..b2e3453f029
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2.mp
@@ -0,0 +1,91 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3-eng.mp
new file mode 100644
index 00000000000..a4b3cb81736
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3-eng.mp
@@ -0,0 +1,98 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,7); % 7 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(2,7);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+ label_obj.bot(btex $M_7$ etex,7);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3.mp
new file mode 100644
index 00000000000..8b66eac58bb
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3.mp
@@ -0,0 +1,99 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,7); % 7 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(2,7);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+ label_obj.bot(btex $M_7$ etex,7);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4-eng.mp
new file mode 100644
index 00000000000..93e3cfba01c
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4-eng.mp
@@ -0,0 +1,112 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,10); % 10 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ % K=middle of AD
+ mid_point(8,1,4);
+ set_line(ij)(5,8);
+ b:=def_inter_p_l_pl(9)(ij)(bcd); if not b: ... fi;
+ set_line(ij)(6,8);
+ b:=def_inter_p_l_pl(10)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);draw_line(8,5);
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);draw_line(8,8);
+ draw_line(9,9);draw_line(10,10);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(3,7);
+ draw_line(8,9);draw_line(4,9);
+ draw_line(8,10);draw_line(3,10);
+ draw_line_extra(9,10)(-0.1,1.1);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.llft(btex $C_3$ etex,3) shifted (-2.5mm,1mm);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.lft(btex $J_6$ etex,6) shifted (-2mm,0);
+ label_obj.lrt(btex $M_7$ etex,7);
+ label_obj.urt(btex $K_8$ etex,8);
+ label_obj.lrt(btex $N_9$ etex,9);
+ label_obj.lrt(btex $L_{10}$ etex,10);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4.mp
new file mode 100644
index 00000000000..b97426f8196
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4.mp
@@ -0,0 +1,113 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,10); % 10 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ % K=middle of AD
+ mid_point(8,1,4);
+ set_line(ij)(5,8);
+ b:=def_inter_p_l_pl(9)(ij)(bcd); if not b: ... fi;
+ set_line(ij)(6,8);
+ b:=def_inter_p_l_pl(10)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);draw_line(8,5);
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);draw_line(8,8);
+ draw_line(9,9);draw_line(10,10);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(3,7);
+ draw_line(8,9);draw_line(4,9);
+ draw_line(8,10);draw_line(3,10);
+ draw_line_extra(9,10)(-0.1,1.1);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.llft(btex $C_3$ etex,3) shifted (-2.5mm,1mm);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.lft(btex $J_6$ etex,6) shifted (-2mm,0);
+ label_obj.lrt(btex $M_7$ etex,7);
+ label_obj.urt(btex $K_8$ etex,8);
+ label_obj.lrt(btex $N_9$ etex,9);
+ label_obj.lrt(btex $L_{10}$ etex,10);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5-eng.mp
new file mode 100644
index 00000000000..5bf58829948
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5-eng.mp
@@ -0,0 +1,84 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,4); % 4 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;new_point(h);new_point(k);
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff_(h,pnt(2),pnt(1));
+ vec_unit_(h,h);vec_mult_(h,h,lsb*cosd(aasb));
+ vec_sum_(h,h,pnt(1));
+ vec_diff_(k,pnt(4),pnt(1));
+ vec_unit_(k,k);vec_mult_(k,k,lsb*cosd(absc));
+ vec_sum_(k,k,pnt(1));
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(h);
+ def_orth_pl_l_p_(kp)(sc)(k);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ free_point(k);free_point(h);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line(1,4);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ drawoptions(dashed evenly);
+ draw_line(2,4);
+ drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.top(btex $B$ etex,3);
+ label_obj.lft(btex $C$ etex,4);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5.mp
new file mode 100644
index 00000000000..3063c260839
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5.mp
@@ -0,0 +1,85 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,4); % 4 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;new_point(h);new_point(k);
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff_(h,pnt(2),pnt(1));
+ vec_unit_(h,h);vec_mult_(h,h,lsb*cosd(aasb));
+ vec_sum_(h,h,pnt(1));
+ vec_diff_(k,pnt(4),pnt(1));
+ vec_unit_(k,k);vec_mult_(k,k,lsb*cosd(absc));
+ vec_sum_(k,k,pnt(1));
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(h);
+ def_orth_pl_l_p_(kp)(sc)(k);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ free_point(k);free_point(h);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line(1,4);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ drawoptions(dashed evenly);
+ draw_line(2,4);
+ drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.top(btex $B$ etex,3);
+ label_obj.lft(btex $C$ etex,4);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6-eng.mp
new file mode 100644
index 00000000000..c11e44391a9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6-eng.mp
@@ -0,0 +1,100 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ def_right_angle(14,15,16,13,6,3);
+ def_right_angle(17,18,19,13,5,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(2,4);draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ draw_line(13,6);draw_line(13,5);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_double_right_angle(14,15,16,13);
+ draw_double_right_angle(17,18,19,13);
+
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+ i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6.mp
new file mode 100644
index 00000000000..a63a1b08474
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6.mp
@@ -0,0 +1,101 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ def_right_angle(14,15,16,13,6,3);
+ def_right_angle(17,18,19,13,5,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(2,4);draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ draw_line(13,6);draw_line(13,5);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_double_right_angle(14,15,16,13);
+ draw_double_right_angle(17,18,19,13);
+
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+ i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7-eng.mp
new file mode 100644
index 00000000000..45865eae0f0
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7-eng.mp
@@ -0,0 +1,102 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,17); % 17 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(3,5);draw_line(3,6);draw_line(2,4);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);draw_line(15,16);draw_line(16,17);draw_line(17,14);
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7.mp
new file mode 100644
index 00000000000..784d8a2cfcc
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7.mp
@@ -0,0 +1,103 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,17); % 17 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(3,5);draw_line(3,6);draw_line(2,4);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);draw_line(15,16);draw_line(16,17);draw_line(17,14);
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8-eng.mp
new file mode 100644
index 00000000000..b46031931b9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8-eng.mp
@@ -0,0 +1,120 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,op,oab,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+
+ def_orth_pl_l_p(hp)(sa)(5);
+ def_orth_pl_l_p(kp)(sc)(6);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM 1";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+ if def_visual_inter(18)(15,16,2,3):
+ else:
+ message "PROBLEM";
+ fi;
+ if def_visual_inter(19)(15,16,3,4):
+ else:
+ message "PROBLEM";
+ fi;
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);draw_line(2,4);
+ draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);
+ %draw_line(15,16);
+ draw_line(15,18);draw_line(19,16);
+ draw_line(16,17);draw_line(17,14);
+ drawoptions(dashed evenly);
+ draw_line(18,19);
+ pickup pencircle scaled .4pt;drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ reset_obj("tetra"); % so that |Obs| is taken into account
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8.mp
new file mode 100644
index 00000000000..fc342bb301c
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8.mp
@@ -0,0 +1,121 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,op,oab,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+
+ def_orth_pl_l_p(hp)(sa)(5);
+ def_orth_pl_l_p(kp)(sc)(6);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM 1";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+ if def_visual_inter(18)(15,16,2,3):
+ else:
+ message "PROBLEM";
+ fi;
+ if def_visual_inter(19)(15,16,3,4):
+ else:
+ message "PROBLEM";
+ fi;
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);draw_line(2,4);
+ draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);
+ %draw_line(15,16);
+ draw_line(15,18);draw_line(19,16);
+ draw_line(16,17);draw_line(17,14);
+ drawoptions(dashed evenly);
+ draw_line(18,19);
+ pickup pencircle scaled .4pt;drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ reset_obj("tetra"); % so that |Obs| is taken into account
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp9.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp9.mp
new file mode 100644
index 00000000000..a419516aff4
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp9.mp
@@ -0,0 +1,63 @@
+% D. Roegel, 9 January 2001
+% roegel@loria.fr
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=15cm;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,12); % 12 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(1,0,0);
+ set_point(3)(1,1,0);
+ set_point(4)(0,1,0);
+ set_point(5)(0,0,1);
+ set_point(6)(1,0,1);
+ set_point(7)(1,1,1);
+ set_point(8)(0,1,1);
+ new_vec(v);
+ vec_diff_(v,pnt(1),pnt(4));
+ vec_sum_(pnt(9),pnt(1),v);
+ mid_point(10,1,2);
+ vec_sum_(pnt(11),pnt(2),v);
+ mid_point(12,7,8);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line(2,3);
+ draw_line(5,6);draw_line(6,7);draw_line(7,8);draw_line(8,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);
+ draw_line(9,10);draw_line(10,11);draw_line(11,9);
+ draw_line(5,12);draw_line(12,6);draw_line(6,5);
+ drawoptions(dashed evenly);
+ draw_line(3,4);draw_line(4,1);draw_line(4,8);
+ draw_line(5,9);draw_line(10,12);draw_line(6,11);
+ drawoptions();
+ fill z[ipnt_(9)]--z[ipnt_(10)]--z[ipnt_(11)]--cycle withcolor 0.8white;
+ fill z[ipnt_(5)]--z[ipnt_(12)]--z[ipnt_(6)]--cycle withcolor 0.8white;
+ draw_equal_marks(1,4,2);
+ draw_equal_marks(1,5,2);
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 30:
+i=23;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(10*cosd(3.6*i-150),10*sind(3.6*i-150),3);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/monge-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/monge-eng.mp
new file mode 100644
index 00000000000..09516765684
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/monge-eng.mp
@@ -0,0 +1,148 @@
+% D. Roegel
+% Three orthogonal projections of a tetrahedron
+% January 7, 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+
+
+input 3dgeom; % definitions for geometry
+input 3danim; % animations
+
+% We modify some of the default settings.
+output_res:=72;
+drawing_scale:=7cm;
+filled_faces:=false;
+show_animation_parameters:=true;
+
+%projection_type:=1; % parallel projection
+
+%================ DEFINITION OF OBJECT (BEGIN) =========================
+vardef def_fig(expr inst)=
+ new_obj_points(inst,28); % 28 points 4+3*(4+4)
+ set_fig_points(inst);
+enddef;
+
+% Definition of the points that belong to the general figure.
+vardef set_fig_points(expr inst)=
+ set_point(1)(0.3,0.45,0.8); % A
+ set_point(2)(0.6,0.45,0.8); % B
+ set_point(3)(0.5,0.6,0.5); % C
+ set_point(4)(0.5,0.3,0.5); % D
+
+ % the three planes (four corners at a time)
+ % horizontal
+ set_point(5)(0,0,-.2);
+ set_point(6)(1,0,-.2);
+ set_point(7)(1,1,-.2);
+ set_point(8)(0,1,-.2);
+ % vertical left
+ set_point(9) (-.45,0,0);
+ set_point(10)(-.45,1,0);
+ set_point(11)(-.45,1,1);
+ set_point(12)(-.45,0,1);
+ % vertical front
+ set_point(13)(0,-.45,0);
+ set_point(14)(1,-.45,0);
+ set_point(15)(1,-.45,1);
+ set_point(16)(0,-.45,1);
+
+ % we now compute the verticals and therefore introduce plane structures
+ new_plane(f)(9,10,11);
+ new_plane(g)(13,14,15);
+ new_plane(h)(5,6,7);
+
+ % bottow figure
+ def_vert_pl(17)(1)(h);
+ def_vert_pl(18)(2)(h);
+ def_vert_pl(19)(3)(h);
+ def_vert_pl(20)(4)(h);
+
+ % left figure
+ def_vert_pl(21)(1)(f);
+ def_vert_pl(22)(2)(f);
+ def_vert_pl(23)(3)(f);
+ def_vert_pl(24)(4)(f);
+
+ % front figure
+ def_vert_pl(25)(1)(g);
+ def_vert_pl(26)(2)(g);
+ def_vert_pl(27)(3)(g);
+ def_vert_pl(28)(4)(g);
+
+ free_plane(h);free_plane(g);free_plane(f);
+enddef;
+
+% Method to draw a general figure
+vardef draw_fig(expr inst)=
+ % tetrahedron
+ pickup pencircle scaled 1pt;
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(2,3);
+ draw_line(2,4);draw_line(3,4);
+ drawoptions(dashed withdots);draw_line(1,4);
+ drawoptions();
+
+ % projection on f:
+ draw_line(21,22);draw_line(21,23);draw_line(21,24);
+ draw_line(22,23);draw_line(22,24);draw_line(23,24);
+
+ % projection on g:
+ draw_line(25,26);draw_line(25,27);draw_line(25,28);
+ draw_line(26,27);draw_line(26,28);draw_line(27,28);
+
+ % projection on h:
+ draw_line(17,18);draw_line(17,19);draw_line(17,20);
+ draw_line(18,19);draw_line(18,20);draw_line(19,20);
+
+ pickup pencircle scaled .4pt;
+
+ % les plans
+ draw_line(5,6);draw_line(6,7);draw_line(7,8);draw_line(8,5);
+ draw_line(9,10);draw_line(10,11);draw_line(11,12);draw_line(12,9);
+ draw_line(13,14);draw_line(14,15);draw_line(15,16);draw_line(16,13);
+ pickup pencircle scaled .4pt;
+
+ % dotted projection lines:
+ save i;drawoptions(dashed evenly);
+ for i:=1 upto 4: draw_line(i,i+16);endfor;
+ for i:=1 upto 4: draw_line(i,i+20);endfor;
+ for i:=1 upto 4: draw_line(i,i+24);endfor;
+
+ % and a few labels:
+ label_obj.top(btex $A$ etex,1);
+ label_obj.llft(btex $B$ etex,2);
+ label_obj.lrt(btex $C$ etex,3);
+ label_obj.llft(btex $D$ etex,4);
+
+ label_obj.bot(btex $H$ etex,7);
+ label_obj.top(btex $F$ etex,12);
+ label_obj.llft(btex $G$ etex,14);
+
+enddef;
+
+assign_obj("figa","fig");
+
+%================ DEFINITION OF OBJECT (END) =========================
+
+% Call of drawing instruction
+%for i:=0 upto 20:%99:
+i=12;
+ beginfig(100+i);
+ % Positionning of the observer
+ set_point_(Obs)(4*cosd(3.6*i),4*sind(3.6*i),2.2);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("figa",1,Obs_phi);
+ draw_obj("figa"); % main figure
+ endfig;
+%endfor; show_animation_bbox;
+end.
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/monge.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/monge.mp
new file mode 100644
index 00000000000..67fc60a0e5f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/monge.mp
@@ -0,0 +1,149 @@
+% D. Roegel
+% Three orthogonal projections of a tetrahedron
+% January 7, 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+
+
+input 3dgeom; % definitions for geometry
+input 3danim; % animations
+
+% We modify some of the default settings.
+output_res:=72;
+drawing_scale:=7cm;
+filled_faces:=false;
+show_animation_parameters:=true;
+
+%projection_type:=1; % parallel projection
+
+%================ DEFINITION OF OBJECT (BEGIN) =========================
+vardef def_fig(expr inst)=
+ new_obj_points(inst,28); % 28 points 4+3*(4+4)
+ set_fig_points(inst);
+enddef;
+
+% Definition of the points that belong to the general figure.
+vardef set_fig_points(expr inst)=
+ set_point(1)(0.3,0.45,0.8); % A
+ set_point(2)(0.6,0.45,0.8); % B
+ set_point(3)(0.5,0.6,0.5); % C
+ set_point(4)(0.5,0.3,0.5); % D
+
+ % the three planes (four corners at a time)
+ % horizontal
+ set_point(5)(0,0,-.2);
+ set_point(6)(1,0,-.2);
+ set_point(7)(1,1,-.2);
+ set_point(8)(0,1,-.2);
+ % vertical left
+ set_point(9) (-.45,0,0);
+ set_point(10)(-.45,1,0);
+ set_point(11)(-.45,1,1);
+ set_point(12)(-.45,0,1);
+ % vertical front
+ set_point(13)(0,-.45,0);
+ set_point(14)(1,-.45,0);
+ set_point(15)(1,-.45,1);
+ set_point(16)(0,-.45,1);
+
+ % we now compute the verticals and therefore introduce plane structures
+ new_plane(f)(9,10,11);
+ new_plane(g)(13,14,15);
+ new_plane(h)(5,6,7);
+
+ % bottow figure
+ def_vert_pl(17)(1)(h);
+ def_vert_pl(18)(2)(h);
+ def_vert_pl(19)(3)(h);
+ def_vert_pl(20)(4)(h);
+
+ % left figure
+ def_vert_pl(21)(1)(f);
+ def_vert_pl(22)(2)(f);
+ def_vert_pl(23)(3)(f);
+ def_vert_pl(24)(4)(f);
+
+ % front figure
+ def_vert_pl(25)(1)(g);
+ def_vert_pl(26)(2)(g);
+ def_vert_pl(27)(3)(g);
+ def_vert_pl(28)(4)(g);
+
+ free_plane(h);free_plane(g);free_plane(f);
+enddef;
+
+% Method to draw a general figure
+vardef draw_fig(expr inst)=
+ % tetrahedron
+ pickup pencircle scaled 1pt;
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(2,3);
+ draw_line(2,4);draw_line(3,4);
+ drawoptions(dashed withdots);draw_line(1,4);
+ drawoptions();
+
+ % projection on f:
+ draw_line(21,22);draw_line(21,23);draw_line(21,24);
+ draw_line(22,23);draw_line(22,24);draw_line(23,24);
+
+ % projection on g:
+ draw_line(25,26);draw_line(25,27);draw_line(25,28);
+ draw_line(26,27);draw_line(26,28);draw_line(27,28);
+
+ % projection on h:
+ draw_line(17,18);draw_line(17,19);draw_line(17,20);
+ draw_line(18,19);draw_line(18,20);draw_line(19,20);
+
+ pickup pencircle scaled .4pt;
+
+ % les plans
+ draw_line(5,6);draw_line(6,7);draw_line(7,8);draw_line(8,5);
+ draw_line(9,10);draw_line(10,11);draw_line(11,12);draw_line(12,9);
+ draw_line(13,14);draw_line(14,15);draw_line(15,16);draw_line(16,13);
+ pickup pencircle scaled .4pt;
+
+ % dotted projection lines:
+ save i;drawoptions(dashed evenly);
+ for i:=1 upto 4: draw_line(i,i+16);endfor;
+ for i:=1 upto 4: draw_line(i,i+20);endfor;
+ for i:=1 upto 4: draw_line(i,i+24);endfor;
+
+ % and a few labels:
+ label_obj.top(btex $A$ etex,1);
+ label_obj.llft(btex $B$ etex,2);
+ label_obj.lrt(btex $C$ etex,3);
+ label_obj.llft(btex $D$ etex,4);
+
+ label_obj.bot(btex $H$ etex,7);
+ label_obj.top(btex $F$ etex,12);
+ label_obj.llft(btex $G$ etex,14);
+
+enddef;
+
+assign_obj("figa","fig");
+
+%================ DEFINITION OF OBJECT (END) =========================
+
+% Call of drawing instruction
+%for i:=0 upto 20:%99:
+i=12;
+ beginfig(100+i);
+ % Positionning of the observer
+ set_point_(Obs)(4*cosd(3.6*i),4*sind(3.6*i),2.2);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("figa",1,Obs_phi);
+ draw_obj("figa"); % main figure
+ endfig;
+%endfor; show_animation_bbox;
+end.
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/gut2001.pdf b/Master/texmf-dist/doc/metapost/mp3d/gut2001.pdf
new file mode 100644
index 00000000000..e64bdca4b52
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/gut2001.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdf b/Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdf
new file mode 100644
index 00000000000..572c16e6bec
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdf b/Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdf
new file mode 100644
index 00000000000..3fb40bfc8ba
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx b/Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx
new file mode 100644
index 00000000000..9ff0153aeac
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx
@@ -0,0 +1,1149 @@
+% D. Roegel, 25/2/1997 : first draft
+% 26/2/1997
+% 23/4/1997 : appendix, types added
+% 24/4/1997 : better formatting of appendix
+% 25/4/1997 : two columns
+% 27/4/1997 : some improvements
+% 28/4/1997 : changes to take new syntax into account
+% 30/4/1997 : cleaning and additions
+% 1/5/1997 : ltugboat macros
+% addition of appendix b
+% all overfull hboxes removed; this needed a lot
+% of rephrasing!
+% lots of cleaning
+% 2/5/1997 : extension of future part
+% 12/5/1997 : several small improvements to take Ulrik Vieth's
+% comments into account.
+% 17/5/1997 : some corrections to take modifications in
+% the source code into account
+% 18/5/1997 : commas in the syntax have been put in \texttt
+% some renamings in order to get rid of the overfull
+% hboxes resulting from the comma changes ...
+% 29/5/1997 : some renamings of ``object'' into ``obj'' to
+% be in accordance with the code (version 0.993)
+% some reformatting of pieces of code with respect
+% to the indentation
+% 19/6/1997 : - the `future' part has been corrected with respect
+% to the general algorithm for drawing the faces
+% (thanks to Dominique Larchey)
+% - reference to the ``LaTeX Graphics Companion''
+% 11/2/1998 : - description of draw_contours and contour_width
+% - acknowledgment of Denis Barbier and Boguslaw
+% Jackowski
+% - one_image changed to an_image at the beginning
+% of the paper, in order to avoid being misleading
+% by comparison with the real one_image macro
+% - a few more lines describing the parameters of
+% one_image
+% - ghostscript -> Ghostscript
+% - footnote added to explain why Ghostscript
+% has not been used to generate the excerpts
+% of the images.
+% - some lines to explain why the color type
+% was not used for 3d vectors
+% 12/2/1998 : - rewording to avoid overfull hboxes
+% 19/2/1998 : - minor ``english'' editing (RF)
+% and file sent to author for review (mb)
+% 04/03/1998: - EM fonts removed/ not to be used this issue
+% 04/08/1998: - TUB-specific inputs modified for portability to
+% CTAN archives (mb)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\documentclass[nonumber,harvardcite]{ltugboat}
+\usepackage{mflogo}
+
+\usepackage{url}
+\usepackage[dvips]{graphicx}
+
+\newcommand{\AVN}{\meta{avn}}
+\newcommand{\LVN}{\meta{lvn}}
+\newcommand{\APN}{\meta{apn}}
+\newcommand{\LPN}{\meta{lpn}}
+\newcommand{\AFN}{\meta{afn}}
+\newcommand{\LFN}{\meta{lfn}}
+\newcommand{\CN}{\meta{cl}}
+\newcommand{\IN}{\meta{obj}}
+\newcommand{\VL}{\meta{vl}}
+\newcommand{\VSL}{\meta{vsl}}
+\newcommand{\HEXCOL}{\meta{hc}}
+\newcommand{\COL}{\meta{col}}
+\newcommand{\STR}{\meta{str}}
+\newcommand{\PAIR}{\meta{pair}}
+\newcommand{\NUM}{\meta{num}}
+\newcommand{\BOOL}{\meta{bool}}
+
+\newcommand{\tc}{\texttt{,}}
+
+\newenvironment{todo}{\begin{bfseries}}{\end{bfseries}}
+
+%% this command is already defined in ltugboat.cls and is more robust
+%% I think....
+%\newcommand\meta[1]{$\langle$\mbox{\textit{#1}}$\rangle$}
+%%% the following is the ltugboat.cls definition
+%\DeclareRobustCommand\meta[1]{%
+% \ensuremath{\langle}\emph{#1}\ensuremath{\rangle}}
+
+\let\m=\meta % <-- this command is never used.
+
+%%%%%TUGboat production-specific files
+\vol 18, 4. % volume, issue.
+\issueseqno=57 % sequential issue number
+\issdate December 1997. % month, year of publication
+\setcounter{page}{274}
+\NoBlackBoxes
+\PrelimDraftfalse
+
+\widowpenalty=10000
+\clubpenalty=10000
+\renewcommand{\topfraction}{0.9}
+\renewcommand{\bottomfraction}{0.5}
+\renewcommand{\floatpagefraction}{0.8}
+\renewcommand{\textfraction}{0.1}
+\setcounter{bottomnumber}{2}
+\setcounter{totalnumber}{4}
+\renewcommand{\dbltopfraction}{0.9}
+\renewcommand{\dblfloatpagefraction}{0.8}
+\pretolerance=500
+\tolerance=1000
+\hbadness=3000
+\vbadness=3000
+\hyphenpenalty=400
+%%%%%%%END of TUGboat production-specific files
+
+\begin{document}
+
+\sectitle{Graphics Applications}
+
+\title{Creating 3D animations with \MP}
+\author{Denis Roegel}
+\address{CRIN (Centre de Recherche en Informatique de Nancy)\\
+ B\^atiment LORIA\\
+ BP 239\\
+ 54506 Vand\oe uvre-l\`es-Nancy\\
+ FRANCE}
+\netaddress{roegel@loria.fr}
+\personalURL{http://www.loria.fr/~roegel}
+
+
+
+\maketitle
+
+\begin{abstract}
+\MP{} can be used to create animations. We show here an example
+of animation of polyhedra, introducing the \texttt{3d} package.
+\end{abstract}
+
+\section{Introduction}
+
+%%%RF 1998/02/19: N-forms of cite
+\MP{} (\citeN{hobby1992}; see also the description in
+\shortciteN{Goossens:LGC97})
+is a drawing language very similar to \MF,
+but whose output is \PS. \MP{} is especially suited for geometrical
+and technical drawings, where a drawing can naturally be decomposed
+in several parts, related in some logical way.
+%%%RF 1998/02/19: active voice for passive
+Knuth is using \MP{} for the revisions of and additions to
+\emph{The Art Of Computer Programming}~\cite{knuth1997},
+and it is or will be a component of every standard \TeX{} distribution.
+
+Unfortunately, \MP{} is still quite bare and the user is only offered
+%%%RF 1998/02/19: revamped a bit
+the raw power\Dash a little bit like the \TeX{} user who only has
+plain \TeX{} at his/her disposal. The lack of libraries is certainly
+due to the infancy of \MP{} (which came in the public domain at the
+beginning of 1995) and thus to the small number of its users.
+
+In this paper, we present a way to produce animations using \MP.
+The technique is quite general and we illustrate it through the \texttt{3d}
+package.
+
+\section{Animations}
+
+The World Wide Web has accustomed us to various animations,
+especially \texttt{java} animations.
+Common components of web pages are animated GIF images.
+
+Producing animations in \MP{} is actually quite easy. A number of
+$n$ images will be computed and their sequence produces the animation.
+The animation will be similar to a movie, with no interaction. More precisely,
+if \verb|an_image(|$i$\verb|)|
+produces a picture parameterized by $i$,
+it suffices to wrap this macro
+between \verb|beginfig| and \verb|endfig|:
+
+\begin{verbatim}
+def one_image_out(expr i)=
+ beginfig(<figure number>);
+ an_image(i);
+ endfig;
+enddef;
+\end{verbatim}
+
+\noindent and to loop over \verb|one_image_out|:
+
+\begin{verbatim}
+for j:=1 upto 100:one_image_out(j);endfor;
+\end{verbatim}
+
+Assuming that \verb|<figure number>|
+is equal to the parameter of \verb|an_image|,
+the compilation of this program will produce
+a hundred files with extensions \verb|.1|, \verb|.2|, \ldots, \verb|.100|.
+All these files are \PS{} files and all we need to do is to find a way
+to collate them in one piece. How to do this depends on the operating
+system. On UNIX for instance, one can use \texttt{Ghostscript}
+to transform a \PS{} file
+into \texttt{ppm} and then transform each \texttt{ppm} file into
+GIF with \texttt{ppmtogif}. These programs are part of the
+\texttt{NETPBM} package~\cite{netpbm}. Finally, a program such as
+\texttt{gifmerge}~\cite{gifmerge}
+creates an animated GIF file (GIF89A)
+out of the hundred individual simple GIFs.
+However, various details must be taken care of. For instance,
+%%%RF 1998/02/19: reorganised around `grabbed'->`needed'
+only a part of \texttt{Ghostscript}'s output is needed
+and selection can be made with \texttt{pnmcut}.
+%(which is also part of \texttt{NETPBM}).
+
+The whole process of creating an animation out of \MP's outputs can
+be summed up in a shell script, similar to the one
+in figure~\ref{animation-script}. As we will see, this script (including
+the arguments of \texttt{awk} and \texttt{pnmcut}) can be generated
+automatically by \MP{} itself.
+
+%%fig 1
+\begin{figure*}
+\begin{verbatim}
+#! /bin/sh
+
+/bin/rm -f animpoly.log
+for i in `ls animpoly.*| grep 'animpoly.[0-9]'`;do
+echo $i
+echo '=============='
+# shift each picture so that it lies in the page:
+awk < $i '{print} /^%%Page: /{print "172 153 translate\n"}' > $i.ps
+# produce ppm format:
+gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE -r36 -sOutputFile=$i.ppm -q -- $i.ps
+/bin/rm -f $i.ps
+# produce gif:
+ppmquant 32 $i.ppm | pnmcut 15 99 141 307 | ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif
+/bin/rm -f $i.ppm
+done
+/bin/rm -f animpoly.gif
+# merge the gif files:
+gifmerge -10 -l1000 animpoly.*.gif > animpoly.gif
+/bin/rm -f animpoly.*.gif
+\end{verbatim}
+\caption{Script created by \MP{} (with some additional comments)}
+\label{animation-script}
+\end{figure*}
+
+
+\section{Objects in space}
+
+\subsection{Introduction}
+
+The author applied this idea to the animation of objects
+in space. The macros in the \texttt{3d.mp} package\footnote{On CTAN,
+under \texttt{graphics/metapost/macros/3d}. The code is documented
+with \texttt{MFT}~\cite{knuth1989}
+and illustrated with \MP. This paper describes version 1.0 of the macros.}
+provide a basis for the
+representation of three-dimensional objects. The basic components of
+the objects are the points or the vectors. Both are stored as triplets.
+More precisely, we have three
+arrays\footnote{\MP{} has a few simple types such as \texttt{numeric},
+\texttt{boolean}, \texttt{string}, \texttt{path}, \ldots.
+It also has pairs (\texttt{pair}) and triples (\texttt{color}). We might
+have cheated and stored points as colors, but instead, we found it
+interesting to illustrate a construction equivalent
+to \textsc{Pascal}'s records or C's structures. In \MP, instead of
+having a list or an array of structures, we use several lists or arrays,
+so that a record is a cross-section over several arrays.}
+of type \verb|numeric|:
+
+\begin{verbatim}
+numeric vect[]x,vect[]y,vect[]z;
+\end{verbatim}
+
+Vector $i$'s components are \verb|vect[|$i$\verb|]x|, \verb|vect[|$i$\verb|]y|
+and \verb|vect[|$i$\verb|]z|. It is then straightforward to define the usual
+operations on vectors using this convention. For instance,
+vector addition is defined as:
+
+\begin{verbatim}
+def vect_sum(expr k,i,j)=
+ vect[k]x:=vect[i]x+vect[j]x;
+ vect[k]y:=vect[i]y+vect[j]y;
+ vect[k]z:=vect[i]z+vect[j]z;
+enddef;
+\end{verbatim}
+
+Often, we need some scratch vectors or vectors local to a macro.
+A simple vector allocation mechanism solves the problem: we use a stack
+of vectors and we reserve and free vectors only on top of the stack.
+For instance, the allocation of a vector is defined by:
+
+\begin{verbatim}
+def new_vect=incr(last_vect_) enddef;
+\end{verbatim}
+
+\noindent where \verb|last_vect_| is the index of the top of the stack.
+Hence, a vector is manipulated by its index on the stack.
+Writing \verb|v:=new_vect;| lets \verb|v| be the index of the newly allocated
+vector.
+
+Freeing a vector is also easy and is only allowed at the top of the stack:
+
+\begin{verbatim}
+def free_vect(expr i)=
+ if i=last_vect_:
+ last_vect_:=last_vect_-1;
+ else: errmessage("Vector " &
+ decimal i & " can't be freed!");
+ fi;
+enddef;
+\end{verbatim}
+
+How these macros are used is made explicit in the \verb|vect_rotate| macro
+which does a rotation of a vector \verb|v| around a vector \verb|axis|
+by an angle \verb|alpha|. This rotation is illustrated
+in figure~\ref{vector-rotation}.
+$\vec{v}$ is written as the sum of $\vec{h}$ and $\vec{a}$ where
+$\vec{h} \perp \vec{a}$. If $\vec{b}$ is
+$\overrightarrow{axis}/{\|\overrightarrow{axis}\|}$, $\vec{c}$ is computed
+as the vector product of $\vec{b}$ and $\vec{a}$ and $\vec{a}$ is then
+rotated in a simple way resulting in $\vec{f}$.
+
+The vectors declared with \verb|new_vect| are freed in the inverse order.
+The \verb|vect_rotate| macro makes use of a few other macros:
+\verb|vect_mod| computes the modulus of a vector; \verb|vect_dprod(a,b)| is
+the dot product of vectors \texttt{a} and \texttt{b}; \verb|vect_mult(b,a,x)|
+lets vector \texttt{b} equal vector \texttt{a} multiplied by the scalar
+\texttt{x}; \verb|vect_sum| and \verb|vect_diff| compute as their first
+argument the sum or the difference of the two other vectors;
+\verb|vect_prod(c,a,b)| lets vector \texttt{c} equal the vectorial
+product of vectors \texttt{a} and \texttt{b}. These macros are
+described in appendix A.
+
+%% fig2
+\begin{figure*}
+\begin{center}
+\includegraphics{vect-fig.9}\hspace{1cm}\includegraphics{vect-fig.10}
+\end{center}
+\caption{Vector rotation}\label{vector-rotation}
+\end{figure*}
+
+\begin{verbatim}
+vardef vect_rotate(expr v,axis,alpha)=
+ save v_a,v_b,v_c,v_d,v_e,v_f;
+ v_a:=new_vect;v_b:=new_vect;
+ v_c:=new_vect;v_d:=new_vect;
+ v_e:=new_vect;v_f:=new_vect;
+ v_g:=new_vect;v_h:=new_vect;
+ vect_mult(v_b,axis,1/vect_mod(axis));
+ vect_mult(v_h,v_b,vect_dprod(v_b,v));
+ vect_diff(v_a,v,v_h);
+ vect_prod(v_c,v_b,v_a);
+ vect_mult(v_d,v_a,cosd(alpha));
+ vect_mult(v_e,v_c,sind(alpha));
+ vect_sum(v_f,v_d,v_e);
+ vect_sum(v,v_f,v_h);
+ free_vect(v_h);free_vect(v_g);
+ free_vect(v_f);free_vect(v_e);
+ free_vect(v_d);free_vect(v_c);
+ free_vect(v_b);free_vect(v_a);
+enddef;
+\end{verbatim}
+
+The \verb|3d| package defines other macros in order to set the observer,
+%%%RF 1998/02/19: was `to manipulate'
+to compute a reference matrix, etc. Provision is given for
+manipulating objects.
+
+\subsection{Objects and classes}
+
+The \texttt{3d} package understands a notion of \emph{class}.
+A \emph{class} is a parameterized object. For instance, we have the class
+of regular tetrahedra, the class of regular cubes, etc. Our classes
+%%%RF 1998/02/19: `first level of genericity'->... abstraction
+are the lowest level of abstraction and classes can not be composed.
+They can only be \emph{instanciated}. When we need a specific tetrahedron,
+we call a generic function to create a tetrahedron, but with an identifier
+specific to one instance.
+
+A class is a set of vertices in space, together with a way to draw
+faces, and therefore edges.
+The author's focus was to manipulate (and later animate) polyhedra.
+As an example, the \verb|poly.mp| package provides the definition of
+each of the five regular convex polyhedra.
+
+%%%RF 1998/02/19: `is defining'->defines, etc, `both macros'->`each macro'
+Each class consists of two macros: one defines the points,
+the other calls the first macro and defines the faces.
+Each macro has a parameter which is a string identifying
+the particular instance of that class.
+
+\tolerance=4500
+The points of a regular tetrahedron are defined in
+\verb|set_tetrahedron_points|,
+%%%RF 1998/02/19: second half sentence rewritten
+an example of the general macro name \verb|set_|\meta{class}\verb|_points|.
+Five points are defined, four of
+them with \verb|set_obj_point|, a macro which defines points \emph{local}
+to an object. The first four points are the vertices and the fifth
+is the center of the tetrahedron. \verb|set_obj_point|'s first parameter
+is the point number and the other three are the cartesian coordinates.
+The first three points are in a plane and the fourth is obtained with
+the \verb|new_face_point| macro, which folds a face
+%%%RF 1998/02/19: tagged reference sentence on to end in parens
+(see the description in appendix A for more details).
+The \verb|new_face_point| macro
+is used with the angle \verb|an| which is computed in advance.
+Once the four points are set, the object is normalized, which means
+that it is centered with respect to the list of vertices given
+as parameter (here \verb|1,2,3,4|) and the last vertex is put on a sphere
+of radius 1, centered on the origin. Therefore, point 5 is the center
+of the tetrahedron, and the tetrahedron is set symmetrically
+with respect to the origin.
+
+\tolerance=1000
+%%%RF 1998/02/19: was `are hence inscriptible'
+All five convex regular polyhedra are defined in this way and may
+therefore be inscribed in a sphere of radius 1.
+
+\begin{verbatim}
+def set_tetrahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);
+ sinan=1/sqrt(3);
+ cosan=sqrt(1-sinan**2);
+ an=180-2*angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ normalize_obj(inst)(1,2,3,4);
+ set_obj_point(5,0,0,0);
+enddef;
+\end{verbatim}
+
+The second macro, \verb|def_tetrahedron| defines the number of points and
+faces of the instance, calls the previous macro and defines the faces
+with the macro \verb|set_obj_face|.
+The first argument of that macro is a \emph{local}
+face number, the second is a list of vertices such that the list goes clockwise
+when the face is visible. The last argument is the color of the face in RGB.
+
+\begin{verbatim}
+vardef def_tetrahedron(expr inst)=
+ new_obj_points(inst,5);
+ new_obj_faces(inst,4);
+ set_tetrahedron_points(inst);
+ set_obj_face(1,"1,2,4","b4fefe");
+ set_obj_face(2,"2,3,4","b49bc0");
+ set_obj_face(3,"1,4,3","b4c8fe");
+ set_obj_face(4,"1,3,2","b4fe40");
+enddef;
+\end{verbatim}
+
+The result of the drawing is:
+
+\begin{center}
+\includegraphics{tetra.ps}
+\end{center}
+
+A more complex example is the icosahedron which is defined below.
+
+\begin{verbatim}
+def set_icosahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);
+ cosan=1-8/3*cosd(36)*cosd(36);
+ sinan=sqrt(1-cosan*cosan);
+ an=180-angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ new_face_point(5,2,3,1,an);
+ new_face_point(6,3,1,2,an);
+ new_face_point(7,2,4,3,an);
+ new_face_point(8,3,5,1,an);
+ new_face_point(9,1,6,2,an);
+ new_face_point(10,3,4,7,an);
+ new_face_point(11,3,7,5,an);
+ new_face_point(12,1,8,6,an);
+ % 1 and 10 are opposite vertices
+ normalize_obj(inst)(1,10);
+ % center of icosahedron
+ set_obj_point(13,0,0,0);
+enddef;
+\end{verbatim}
+
+\begin{verbatim}
+vardef def_icosahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,13);
+ new_obj_faces(inst,20);
+ set_icosahedron_points(inst);
+ set_obj_face(1,"3,2,1","b40000");
+ set_obj_face(2,"2,3,4","ff0fa1");
+ set_obj_face(3,"3,7,4","b49b49");
+ set_obj_face(4,"3,5,7","b49bc0");
+ set_obj_face(5,"3,1,5","b4c8fe");
+ set_obj_face(6,"1,8,5","b4fefe");
+ set_obj_face(7,"1,6,8","b4fe40");
+ set_obj_face(8,"1,2,6","45d040");
+ set_obj_face(9,"2,9,6","45a114");
+ set_obj_face(10,"2,4,9","45a1d4");
+ set_obj_face(11,"9,4,10","4569d4");
+ set_obj_face(12,"4,7,10","112da1");
+ set_obj_face(13,"7,5,11","b4fefe");
+ set_obj_face(14,"5,8,11","b49bc0");
+ set_obj_face(15,"8,6,12","45a114");
+ set_obj_face(16,"6,9,12","b49b49");
+ set_obj_face(17,"8,12,11","b40000");
+ set_obj_face(18,"7,11,10","45a1d4");
+ set_obj_face(19,"12,10,11","b4c8fe");
+ set_obj_face(20,"9,10,12","ff0fa1");
+enddef;
+\end{verbatim}
+
+Since all points of the objects are stored in a unique global array,
+they are internally
+accessed by the local numbers and an offset defined by the
+macro \verb|new_obj_points|.
+The icosahedron example shows a systematic use of the
+\verb|new_face_point| macro to compute a point on an adjacent face.
+Displaying such an icosahedron results in the figure~\ref{icosahedron}.
+%% fig3
+\begin{figure}[h]
+\begin{center}
+\includegraphics{icosa.ps}
+\end{center}
+\caption{An icosahedron}\label{icosahedron}
+\end{figure}
+
+The other three regular convex polyhedra are:
+\begin{center}
+\includegraphics{cube.ps}
+\end{center}
+
+\begin{center}
+\includegraphics{octa.ps}\hfill\includegraphics{dodeca.ps}
+\end{center}
+
+The dodecahedron code is a bit special, since the vertices are built
+using ten additional points corresponding to face centers. These points
+are defined as an array of variables \verb|fc1| through \verb|fc10|
+with \verb|new_points(fc)(10)|.
+\verb|free_points(fc)(10)| frees them when they are no longer
+necessary. An excerpt of the dodecahedron code is:
+
+\begin{verbatim}
+def set_dodecahedron_points(expr inst)=
+ new_points(fc)(10);% face centers
+ set_point(fc1,0,0,0);
+ set_obj_point(1,1,0,0);
+ set_obj_point(2,cosd(72),sind(72),0);
+ rotate_in_plane(3,fc1,1,2);
+ ...
+ free_points(fc)(10);
+enddef;
+\end{verbatim}
+
+
+Finally, wire drawings can be obtained by setting the boolean
+\verb|filled_faces| to false:
+
+\begin{center}
+\includegraphics{icosa-w.ps}
+\end{center}
+
+\subsection{Animating objects}
+
+The animation of one or several objects involves the object(s) and an observer.
+The animation is a set of images and from an image to the next one,
+the observer as well as the objects can move. For instance
+the macro \verb|one_image| in \verb|3d.mp| is:
+
+\begin{verbatim}
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,
+ -rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ % fix point 1 of object |name|
+ point_of_view_obj(name,1,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ % show the rotation point
+ draw_point(name,1);
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+\end{verbatim}
+
+The parameters of this macro are a name of an object (\verb|name|),
+an image index (\verb|i|), and three values defining the position
+of the observer.
+The observer (\verb|Obs| is a global point and set with \verb|set_point|,
+not with \verb|set_obj_point|)
+follows a circle of radius \verb|rd|.
+%%%RF 1998/02/19: reversed `usually is'
+The parameter \verb|a|, which is usually a function of \verb|i|,
+determines the number of rotation steps
+of the observer, each step being a rotation of angle \verb|ang|.
+The distance between the observer and the
+projection plane is $2$ (see figure~\ref{proj-screen}).
+
+%% fig4
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.8}
+\end{center}
+\caption{Projection on the screen}\label{proj-screen}
+\end{figure*}
+
+%% fig5
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.16}
+\end{center}
+\caption{Orientation of the observer}\label{obs-orientation}
+\end{figure*}
+
+
+The orientation of the observer is defined by three angles
+(see figure~\ref{obs-orientation}). The \verb|Obs_phi| angle
+is given and the two others are computed with a call to
+\verb|point_of_view_obj(name,1,Obs_phi)| which constrains the observer
+to look towards point 1 of object \verb|name|. Therefore, this
+point will seem fixed on the animation and \verb|draw_point(name,1)|
+draws it later so that this feature can be observed.
+There is nothing special about that point, except that it
+remains fix when the object is rotated. The object is drawn
+with \verb|draw_obj(name)| and
+%%%RF 1998/02/19: `does rotate'->rotates -- these arguments aren't
+%%% described here, which seems wrong, but i don't think
+%%% it's easy to do better....
+\verb|rotate_obj_pv| rotates the object \verb|name|
+by \verb|ang| degrees around an axis going through point 1
+and directed by vector \verb|vect_I| ($\vec{\imath}$).
+The reference vectors ($\vec\imath$,
+$\vec\jmath$ and $\vec k$) are drawn in red, green and blue with
+\verb|draw_axes|.
+
+Finally, a complete animation of an icosahedron is obtained
+with
+
+\begin{verbatim}
+animate_object("icosahedron",1,100,100);
+\end{verbatim}
+
+%%%RF 1998/02/19: `and this'->`which'
+\noindent which generates files \verb|anim.101|,
+%%%RF 1998/02/19: `if ... is'->`from ...'
+\ldots, \verb|anim.200| from the main file \verb|anim.mp|.
+The first parameter of \verb|animate_object| is the name of the object
+to animate, the second and third parameters are minimal and maximal
+values of the index loop and the fourth parameter is an offset added
+to the index loop in order to get the file extension, which must lie
+in the interval $0..4096$.
+
+After each image is drawn, the values of the current bounding box
+are used to compute the bounding box of the sequence of images.
+The internal values \verb|xmin_|, \verb|ymin_|, \verb|xmax_|
+and \verb|ymax_| hold the minimal and maximal values of the coordinates
+of the past images' corners.
+They are updated just before each image is shipped out.
+
+\subsection{Putting the pieces together}
+
+Once all the views have been computed, they can be used separately
+(see for instance the five views of figure~\ref{anim-five-views})
+or more interestingly, they can be merged.
+This task is made almost straightforward by \MP{} itself.
+Indeed, every time \verb|animate_object| is used, a shell script
+named \verb|create_animation.sh|
+is generated, as a side-effect of a call to
+\verb|show_animation_bbox|. The script is
+similar to that shown in figure~\ref{animation-script}.
+This script uses the values
+computed for the global bounding box of the sequence of images,
+for these values are necessary in order to extract the right parts
+of the images and get correct alignments; the parts are extracted
+with \texttt{pnmcut}.\footnote{One might think of using
+\texttt{Ghostscript} for generating an excerpt of an image,
+but if \texttt{Ghostscript} is used to generate the bounding box
+of an image, it will in general not be possible to have a good alignment
+between all images. The sizes of the excerpts are only known when all images
+have been produced.}
+If you have the programs
+used in this script (\texttt{Ghostscript}, etc.), you can just run
+it with \verb|sh create_animation.sh| on UNIX. You may need
+to adapt it to your needs, and for that purpose, you can modify the macro
+\verb|write_script| in \verb|3d.mp|.
+
+Some examples are included in the \verb|3d| distribution, and they
+can be viewed for instance with \texttt{netscape} or
+special programs such as \verb|xanim|.
+
+%% fig6
+\begin{figure*}
+\includegraphics[scale=0.5]{anim.1}\hfill
+\includegraphics[scale=0.5]{anim.2}\hfill
+\includegraphics[scale=0.5]{anim.3}\hfill
+\includegraphics[scale=0.5]{anim.4}\hfill
+\includegraphics[scale=0.5]{anim.5}
+
+\caption{Five views of an animation}\label{anim-five-views}
+\end{figure*}
+
+\section{Future}
+
+It is quite easy to improve and extend the \verb|3d| macros but the
+author decided to go no further for the moment. Other objects can
+be implemented easily and new algorithms can be added. For instance
+in order to take light sources or shadows into account, one can compute
+the angles under which a face gets its light, and the angle under which
+this very face is seen, in order to decide how much darker or lighter
+it must be rendered. Another problem is to represent
+overlapping objects correctly. In the current implementation, each
+object is drawn
+independently from the other objects, so that the overlapping may be wrong.
+One solution is to sort all the faces according to their distance
+to the observer and, if two faces can not be ordered, to split them.
+Then, the faces can be drawn starting with the most distant, and
+ending with the closest one.
+Appendix B explains the internal representation of the objects and
+shows that this algorithm can be implemented without much surgery to
+the present code.
+
+\section{Acknowledgments}
+
+Thanks to John Hobby who always answers all my queries on the \MF{} mailing
+list. Thanks to Alain Filbois who helped me with the shell script
+syntax, to Thomas Lambolais and Thomas Genet who gave some feedback
+on this work, and to Dominique Larchey who pointed out a shortcoming
+in the conclusion. Thanks to Denis Barbier who
+was one of the first users of these
+macros and contributed the animated crayons in the distribution. Thanks to
+Bogus\l aw Jackowski who made valuable comments on some peculiarities of
+the code.
+And finally, special thanks to Ulrik Vieth who not only
+pushed me to polish my code and this paper more than I had first intended,
+but also made it possible to use \MP{} under \texttt{web2c}.
+
+\bibliography{paper}
+
+\appendix
+
+\section{Appendix A\\
+Summary of the \texttt{3d} package}
+
+\subsection{Types}
+
+The commands in the \texttt{3d} package take parameters
+of several different types. The types are described here.
+
+\begin{itemize}
+\item An \AVN{} (\emph{Absolute Vector Number}) is the internal
+number identifying a vector in the \verb|vect| array (an integer).
+\item An \APN{} (\emph{Absolute Point Number}) refers to a vector
+in the same way as an \AVN{} (an integer).
+\item A \LPN{} (\emph{Local Point Number}) is a number identifying a
+point \emph{within} an object (an integer). Two \LPN{}s with the same value
+can correspond to different points in different objects.
+\item An \AFN{} (\emph{Absolute Face Number}) is the internal
+number identifying a face.
+\item A \LFN{} (\emph{Local Face Number}) is a number identifying a face
+\emph{within} an object (an integer). As for points, two \LFN{}s with
+the same value
+can correspond to different faces in different objects.
+\item A \CN{} (\emph{Class}) is a string representing a class,
+for instance \verb|"tetrahedron"|. It may only contain
+letters and underscores.
+\item An \IN{} (\emph{Object}) is a string representing an object, that is
+an instance of a class. Such a string may only contain
+letters and underscores.
+\item A \VL{} (\emph{Vertex List}) is a list
+of integers, where each integer identifies a vertex. For instance, \verb|1,7|
+is the list of vertices 1 and 7.
+\item A \VSL{} (\emph{Vertex String List}) is a string corresponding to a list
+of integers, where each integer identifies a vertex. For instance,
+\verb|"1,2,6,5"| is the list of vertices 1, 2, 6 and 5.
+\item \HEXCOL{} (\emph{Hex Color}) is a string representing a color with
+the three RGB components in hexadecimal and in the range
+$0..255$. For instance, \verb|"b4fe40"|.
+\item \COL{} (\emph{Color}) is a standard \MP{} color
+(a triplet of RGB components in the range $0..1$),
+such as \verb|red|.
+\item \STR{} (\emph{String}) is a string.
+\item \PAIR{} (\emph{Pair}) is a pair of numerics.
+\item \NUM{} (\emph{Numeric}) is a number.
+\item \BOOL{} (\emph{Boolean}) is a boolean.
+\end{itemize}
+
+\subsection{Low level vector commands}
+
+The low level vector commands define the classical operations in vector
+algebra.
+
+\begin{itemize}
+%\item \verb|vect_def(|\AVN\tc$x$\tc$y$\tc$z$\verb|)|; defines vector \AVN{}
+\item \verb|vect_def(|\AVN\tc$x$\tc$y$\tc$z$\verb|)|: defines vector \AVN{}
+as $(x,y,z)$;
+
+%\item \verb|set_point|: synonym of \verb|vect_def|; a point is stored in the
+\item \verb|set_point|; synonym of \verb|vect_def|: a point is stored in the
+same array as vectors.
+
+%\item \verb|set_obj_point(|\LPN\tc$x$\tc$y$\tc$z$\verb|)|;
+\item \verb|set_obj_point(|\LPN\tc$x$\tc$y$\tc$z$\verb|)|:
+this defines the point \LPN{} as $(x,y,z)$;
+
+%\item \verb|vect_def_vect(|\AVN$_1$\tc\AVN$_2$\verb|)|;
+\item \verb|vect_def_vect(|\AVN$_1$\tc\AVN$_2$\verb|)|:
+vector \AVN$_1$ becomes equal to vector \AVN$_2$;
+
+\item \verb|vect_sum(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$ becomes the sum of vectors \AVN$_2$ and \AVN$_3$.
+
+\item \verb|vect_translate(|\AVN$_1$\tc\AVN$_2$\verb|)|:
+add vector \AVN$_2$
+to vector \AVN$_1$; vector \AVN$_2$ remains unchanged.
+
+\item \verb|vect_diff(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$
+becomes the difference between vectors \AVN$_2$ and \AVN$_3$.
+
+\item \verb|vect_dprod(|\AVN$_1$\tc\AVN$_2$\verb|)| $\rightarrow $ \NUM{}:
+returns the dot product of vectors \AVN$_1$ and \AVN$_2$.
+
+\item \verb|vect_mod(|\AVN\verb|)| $\rightarrow $ \NUM{}: returns the
+modulus of vector \AVN.
+
+\item \verb|vect_prod(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$
+becomes the vector product of vectors \AVN$_2$ and \AVN$_3$.
+
+\tolerance=1000
+\item \verb|vect_mult(|\AVN$_1$\tc\AVN$_2$\tc\NUM\verb|)|: \AVN$_1$
+becomes vector \AVN$_2$ scaled by \NUM.
+
+\item \verb|mid_point(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+vector (or point) \AVN$_1$ becomes the mid-point of vectors (or of the
+line joining the points)
+\AVN$_2$ and \AVN$_3$.
+
+\item \verb|vect_rotate(|\AVN$_1$\tc\AVN$_2$\tc$a$\verb|)|: vector \AVN$_1$ is
+rotated around vector \AVN$_2$ by the angle $a$.
+\end{itemize}
+
+\tolerance=1000
+\subsection{Operations on objects}
+
+Several operations apply globally on objects:
+
+\begin{itemize}
+\item \verb|assign_obj(|\IN\tc\CN\verb|)|:
+ create \IN{} as an instance of class \CN.
+\item \verb|reset_obj(|\IN\verb|)|: put \IN{} back where it
+ was just after it was initialized.
+\item \verb|put_obj(|\IN\tc\AVN\tc$s$\tc$\psi$\tc$\theta$\tc$\phi$\verb|)|:
+ object \IN{} is scaled by $s$, shifted by vector \AVN{} and
+ oriented with the angles $\psi$, $\theta$, $\phi$,
+ as for the observer orientation (figure~\ref{obs-orientation}).
+\item \verb|rotate_obj_pv(|\IN\tc\LPN\tc\AVN\tc$a$\verb|)|:
+ object \IN{} is rotated
+ around an axis going through local point \LPN{}
+ and directed by vector \AVN; the rotation is by $a$ degrees.
+\item \verb|rotate_obj_abs_pv(|\IN\tc\APN\tc\AVN\tc$a$\verb|)|:\break
+ the object \IN{} is rotated around an axis going through absolute
+ point \APN{} and directed by vector \AVN; the rotation is by $a$ degrees.
+\item \verb|rotate_obj_pp(|\IN\tc\LPN$_1$\tc\LPN$_2$\tc$a$\verb|)|:
+ \IN{} is rotated around an axis going through local points
+ \LPN$_1$ and \LPN$_2$; the rotation is by $a$ degrees.
+\item \verb|translate_obj(|\IN\tc\AVN\verb|)|: object \IN{} is translated
+ by vector \AVN.
+\item \verb|scale_obj(|\IN\tc$v$\verb|)|: object~\IN{}~is~scaled~by~$v$.
+\end{itemize}
+
+\subsection{Building new points in space}
+
+Three macros are especially useful for the definition of regular polyhedra:
+
+\begin{itemize}
+\item \verb|rotate_in_plane(|$k$\tc$o$\tc$i$\tc$j$\verb|)|:
+get point $k$ from point $j$ by rotation
+around point $o$ by an angle $\alpha$ equal to the angle from $i$ to $j$;
+$i$, $j$ and $k$ are of type \LPN, whereas $o$ is of type \APN.
+
+\begin{center}
+ \includegraphics{vect-fig.11}
+\end{center}
+
+\item \verb|new_face_point(|$c$\tc$o$\tc$i$\tc$j$\tc$\alpha$\verb|)|:
+the middle $m$ of points $i$ and $j$ is such that
+$\widehat{(\overrightarrow{om},\overrightarrow{mc})}=\alpha$
+and $\overrightarrow{mc}$ is $\overrightarrow{om}$ rotated around
+$\overrightarrow{ji}$. $c$, $o$, $i$ and $j$ are of type \LPN.
+
+\begin{center}
+ \includegraphics{vect-fig.7}
+\end{center}
+
+\item \verb|new_abs_face_point(|$c$\tc$o$\tc$i$\tc$j$\tc$\alpha$\verb|)|:
+similar to the previous definition, but $c$ and $o$ are of type \APN.
+
+\end{itemize}
+
+\subsection{Drawing points, axes, objects}
+
+\begin{itemize}
+\item \verb|draw_point(|\IN\tc\LPN\verb|)|: draw point \LPN{} in
+ object \IN.
+\item \verb|draw_axes(|\COL$_1$\tc\COL$_2$\tc\COL$_3$\verb|)|:
+ draw vectors $\vec\imath$, $\vec\jmath$ and $\vec{k}$ in colors
+ \COL$_1$, \COL$_2$ and \COL$_3$.
+\item \verb|draw_obj(|\IN\verb|)|: draw object \IN.
+\end{itemize}
+
+\subsection{Setting faces}
+
+\begin{itemize}
+\item \verb|set_face(|\AFN\tc\VSL\tc\HEXCOL\verb|)|:
+set absolute face \AFN{} as
+delimited by the vertex list \VSL{} (local point numbers) and colored by
+color \HEXCOL.
+\item \verb|set_obj_face(|\LFN\tc\VSL\tc\HEXCOL\verb|)|:
+set local face \LFN{} as
+delimited by the vertex list \VSL{} (local point numbers) and colored by
+color \HEXCOL.
+
+\end{itemize}
+
+\break
+
+\subsection{View points, distance}
+
+\begin{itemize}
+\item \verb|compute_reference(|$\psi$\tc$\theta$\tc$\phi$\verb|)|: defines
+the orientation of the observer by the three angles $\psi$,
+$\theta$ and $\phi$. See figure~\ref{obs-orientation}.
+
+\item \verb|point_of_view_obj(|\IN\tc\LPN\tc$\phi$\verb|)|: the orientation
+of the observer is defined as looking local point \LPN{} of object \IN,
+with an angle of $\phi$;
+\item \verb|point_of_view_abs(|\APN\tc$\phi$\verb|)|: the observer's
+orientation is defined as looking absolute point \APN{},
+with an angle of $\phi$;
+\item \verb|obs_distance(|$v$\verb|)(|\IN\tc\LPN\verb|)|: let $v$ equal
+the distance between the observer and local point \LPN{} in object \IN{}.
+\end{itemize}
+
+\subsection{Vector and point allocation}
+
+\begin{itemize}
+\item \verb|new_vect|$\rightarrow $ \AVN{}: return a new vector;
+\item \verb|new_point|: synonym of \verb|new_vect|;
+\item \verb|new_points(|$v$\verb|)(|$n$\verb|)|: defines the absolute points
+ $v_1, \ldots, v_n$, using \verb|new_point|;
+\item \verb|free_vect(|\AVN\verb|)|: free vector \AVN;
+\item \verb|free_point(|\APN\verb|)|: free point \APN;
+\item \verb|free_points(|$v$\verb|)(|$n$\verb|)|: frees the absolute points
+ $v_1, \ldots, v_n$, using \verb|free_point|.
+\end{itemize}
+
+\subsection{Debugging}
+
+\begin{itemize}
+\item \verb|show_vect(|\STR\tc\AVN\verb|)|:
+shows vector \AVN, with string \STR.
+\item \verb|show_point|: synonym of \verb|show_vect|
+\item \verb|show_pair(|\STR\tc\PAIR\verb|)|: this shows a numeric pair,
+ with string \STR.
+\end{itemize}
+
+\subsection{Normalization}
+
+\begin{itemize}
+\item \verb|normalize_obj(|\IN\tc\VL\verb|)|: normalize object \IN{}
+with respect to the list of vertices \VL.
+\end{itemize}
+
+\subsection{Parameters}
+
+\begin{itemize}
+\item \verb|Obs_dist| $\rightarrow$ \NUM: distance between the observer
+ and the projection plane.
+\item \verb|h_field| $\rightarrow$ \NUM: horizontal field of view
+ (default: 100 degrees)
+\item \verb|v_field| $\rightarrow$ \NUM: vertical field of view
+ (default: 70 degrees)
+\item \verb|Obs_phi| $\rightarrow$ \NUM: angle $\phi$ for the orientation
+ of the observer;
+\item \verb|Obs_theta| $\rightarrow$ \NUM: angle $\theta$ for the orientation
+ of the observer;
+\item \verb|Obs_psi| $\rightarrow$ \NUM: angle $\psi$ for the orientation
+ of the observer;
+\item \verb|drawing_scale| $\rightarrow$ \NUM: scale factor applied for
+ drawing;
+\item \verb|filled_faces| $\rightarrow$ \BOOL: if \texttt{true}, the faces
+ are drawn filled; if \texttt{false}, only the edges are drawn,
+ and hidden edges are drawn dashed;
+\item \verb|draw_contours| $\rightarrow$ \BOOL: if \texttt{true}, the contours
+ of the faces are drawn, and the lines have the thickness
+ \verb|contour_width|; if \texttt{false}, the contours are not drawn;
+\item \verb|contour_width| $\rightarrow$ \NUM: dimension used for drawing
+ contours of faces (default: 1pt).
+\end{itemize}
+
+\subsection{Constants}
+
+These values represent constant objects such
+as reference vectors, and should not be changed.
+
+\begin{itemize}
+\item \verb|vect_null| $\rightarrow$ \AVN: internal index for $\vec0$.
+\item \verb|vect_I| $\rightarrow$ \AVN: internal index for $\vec\imath$.
+\item \verb|vect_J| $\rightarrow$ \AVN: internal index for $\vec\jmath$.
+\item \verb|vect_K| $\rightarrow$ \AVN: internal index for $\vec k$.
+\item \verb|point_null| $\rightarrow$ \APN: internal index for $\vec0$.
+\item \verb|Obs| $\rightarrow$ \APN: observer's internal point number.
+\end{itemize}
+
+\subsection{Defining new object points and faces}
+
+\begin{itemize}
+\item \verb|new_obj_points(|\IN\tc\NUM\verb|)|:
+ defines points $1$ to \NUM{} in object \IN; must be used before setting
+ the points;
+\item \verb|new_obj_faces(|\IN\tc\NUM\verb|)|:
+ defines \NUM{} faces in object \IN; must be used before setting
+ the faces;
+\end{itemize}
+
+\subsection{Offsets}
+
+\begin{itemize}
+\item \verb|pnt(|\LPN\verb|)| $\rightarrow$ \APN: returns the absolute point
+number for a given local point index.
+\item \verb|face(|\LFN\verb|)| $\rightarrow$ \AFN: returns the absolute face
+number for a given local face index.
+\end{itemize}
+
+\subsection{Standard classes}
+
+Five standard classes are defined in \texttt{poly.mp}:
+they define the five regular convex polyhedra. For each class \meta{class},
+there are two macros:
+
+\begin{itemize}
+
+\item \verb|set_|\meta{class}\verb|_points|
+ (e.g. \verb|set_cube_points|)
+
+\item \verb|def_|\meta{class} (e.g. \verb|def_cube|)
+
+\end{itemize}
+
+Each of these macros is defined with a parameter which is the instance
+name.
+
+\subsection{Standard animations}
+
+The \texttt{3d} package provides a few standard animations using
+the convex polyhedra. In each of these animations, the observer
+follows a circular path pictured in figure~\ref{observer-motion}.
+Each standard animation is divided into two macros. The first,
+such as \verb|animate_object|, defines the class(es) that are used
+and sets the objects. The second, such as \verb|one_image|, sets
+the observer, draws the object(s) and moves the object(s) and the
+observer. The file \verb|animpoly.mp| gives examples of the use
+of the standard animations.
+
+\iffalse
+\begin{itemize}
+\item \verb|one_image(name,i,a)|
+\item \verb|one_image_two_objects(name_a,name_b,i,a)|
+\item \verb|one_image_three_objects(name_a,name_b,name_c,i,a)|
+\item \verb|one_image_two_identical_objects(name_a,name_b,i,a)|
+\item \verb|animate_object(name,imin,imax,index)|
+\item \verb|animate_two_objects(name_a,name_b,imin,imax,index)|
+\item \verb|animate_three_objects(name_a,name_b,name_c,imin,imax,index)|
+\item \verb|animate_two_identical_objects(name,imin,imax,index)|
+\end{itemize}
+\fi
+
+%% fig7
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.17}
+\end{center}
+\caption{Motion of the observer}\label{observer-motion}
+\end{figure*}
+
+\section{Appendix B\\
+Coding an object}
+
+In order to extend the \texttt{3d} package, it is necessary to
+understand how the objects are coded. We give here an overview of
+this coding, but the reader is advised to peek in the code to get
+a better understanding on how all the functions interact.
+
+First, an object has a name, for instance \verb|"box"|.
+The macro \verb|box_class| (which can be called with \verb|obj_class_("box")|)
+is the string corresponding to the class of
+\verb|"box"|, for instance \verb|"cube"|.
+The variable \verb|cube_point_offsetbox|, of type \texttt{numeric},
+and obtained with \verb|obj_point_offset_("box")|,
+is equal to the absolute index of the last
+point of the previous object. A cube is defined with $8+1$ points. Assuming
+it was defined after an icosahedron ($12+1$ points) named
+\verb|"ico"|, \verb|cube_point_offsetbox| will be a \verb|numeric|
+equal to $13$. \verb|cube_pointsbox|
+(obtained with \verb|obj_points_("box")|)
+is a macro equal to $9$.
+%(\verb|current_point_offset_| is equal to \verb|cube_point_offsetbox|.)
+The variable \verb|cube_face_offsetbox|,
+similar to \verb|cube_point_offsetbox|,
+obtained with a call to \verb|obj_face_offset_("box")|,
+equals $20$.
+The macro \verb|cube_facesbox|
+(obtained by \verb|obj_faces_("box")|)
+is equal to $6$.
+%(\verb|current_face_offset_| is equal to \verb|cube_face_offsetbox|.)
+
+The \verb|obj_name| macro is extended each time a new object is defined.
+To an absolute face number, it associates an object name. Hence, it is possible
+to go through all faces. \verb|last_point_offset_| and
+\verb|last_face_offset_| are the absolute numbers of the last points and faces
+defined up to now.
+
+\begin{verbatim}
+def obj_name(expr i)=
+ if i<1: elseif i<=20:"ico"
+ elseif i<=26:"box"
+ fi;
+enddef;
+\end{verbatim}
+
+\verb|pnt(i)| gives the absolute vector corresponding to local point $i$.
+\verb|ipnt_(i)| is the absolute point number, that is $i$ plus the number
+of points defined beforehand in other objects.
+\verb|points_[j]| is the absolute vector corresponding to absolute object
+point $j$. Similarly, \verb|face(i)|
+is the absolute face corresponding to local face $i$.
+
+The list of vertices of absolute face number $i$ is \verb|face_points_[i]|.
+The color of absolute face number $i$ is \verb|face_color_[i]|.
+
+
+When the macros \verb|pnt| or \verb|face| are to be used, the calls
+\verb|define_current_point_offset_("box")| and
+\verb|define_current_face_offset_("box")| must be issued.
+
+
+\makesignature
+
+\end{document}
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdf b/Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdf
new file mode 100644
index 00000000000..bf7e2d0fff6
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/mpattern/README b/Master/texmf-dist/doc/metapost/mpattern/README
new file mode 100644
index 00000000000..5f6441c018d
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpattern/README
@@ -0,0 +1,129 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file is part of the MPATTERN package
+%
+% Author: Piotr Bolek
+% wersja: 0.5 (Jun 25, 2001)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Description
+===========
+
+Package MPATTERN gives ability to define and use patterns in
+MetaPost. It uses Pattern Color Space available in PostScript Level 2.
+
+Package contains:
+- mpattern.mp: MetaPost macros for defining and using patterns.
+- README: short description in English.
+- README.PL: short description in Polish.
+- test.mp, test.tex, test.ps: usage examples.
+
+Using package
+=============
+
+Include the file mpattern.mp with the input command at the beginning
+of the source file and process the source file with the standard mpost
+program.
+
+User Interface
+==============
+
+Defining pattern
+----------------
+
+Patterns are defined using the following construct:
+
+beginpattern(<name_of_pattern>);
+...
+endpattern;
+
+Parameter <name_of_pattern> is the name by which the pattern is
+identified. This name can contain letters and underscore characters
+"_" but not digits. This name should NOT be given in quotes.
+
+One or more of the following macros can be invoked in any place
+inside pattern definition (between beginpattern and endpattern):
+- patternbbox(<pair>,<pair>)
+- patternbbox((<numeric>,<numeric>,<numeric>,<numeric>)
+ Explicit coordinates of bounding box of pattern cell
+
+- patternxstep(<numeric>)
+- patternystep(<numeric>)
+- patternstep(<numeric>,<numeric>)
+- patternstep(<pair>)
+ Pattern spacing
+
+- patterntransform(<transform>)
+ Transformation of pattern shape
+
+- patterncolor(0<= <numeric> <= 1)
+ Explicit color replaced later by pattern
+
+Each pattern is temporarily written as picture with big number
+(default is 999) but when user will use this number for his own
+picture then for temporal storing of next patterns the greatest free
+number less then 999 will be used.
+
+Using patterns
+--------------
+
+Already defined pattern can be used for filling objects with
+two argument withpattern macro. It is used as follows:
+
+<path> withpattern <name_of_pattern>;
+
+where <path> is any valid expression defining closed path and
+<name_of_pattern> is the name given in definition of the pattern.
+
+Example
+-------
+
+Here is code to draw two circles filled with different checker
+patterns.
+
+input mpattern;
+
+beginpattern(checker);
+ d:=4mm;
+ fill unitsquare scaled d;
+ fill unitsquare scaled d shifted (d,d);
+ patternbbox(0,0,2d,2d);
+endpattern;
+
+beginpattern(rotated_checker);
+ fill unitsquare scaled 4mm rotated 45 withcolor .7white;
+endpattern;
+
+beginfig(11);
+ path p;
+ z1=(1cm,1cm);
+ p=fullcircle scaled 3cm;
+ fill p withpattern checker;
+ unfill p shifted z1;
+ fill p shifted z1 withpattern rotated_checker;
+endfig;
+
+Distribution of the package
+===========================
+
+The package MPATTERN belongs to the public domain. You can use any
+actuall version of GPL Licence if you want to modify or redistribute
+this package.
+
+Problems
+========
+
+06-2001: Filling text with patterns can make problems. The current
+ solution is unstable.
+
+Changes
+=======
+
+06-2001: By the inspiration by the Piotr Strzelczyk's tutorial at the
+ BachoTeX'2001 conference the necesity of Perl postprocessing
+ is eliminated. The substitution of colors to patterns is now
+ performed with help of dictionaries at the PostScript level.
+
+Contact with author
+=================
+
+e-mail: P.Bolek@gust.org.pl
diff --git a/Master/texmf-dist/doc/metapost/mpattern/README.PL b/Master/texmf-dist/doc/metapost/mpattern/README.PL
new file mode 100644
index 00000000000..1872a33c5e9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpattern/README.PL
@@ -0,0 +1,133 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Ten plik jest częścią pakietu MPATTERN
+%
+% Autor: Piotr Bolek
+% wersja: 0.5 (Jun 25, 2001)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Opis
+====
+
+Pakiet MPATTERN służy do definiowania i używania wypełnień wzorkowych
+w programie MetaPost. W pakiecie wykorzystywana jest dostępna w języku
+PostScript Level 2 Wzorkowa Przestrzeń Kolorów (Pattern Color Space).
+
+Zawartość:
+- mpattern.mp: makra dla programu MetaPost służące do definiowania
+ i używania wzorków.
+- README: krótki opis po angielsku.
+- README.PL: krótki opis po polsku.
+- test.mp, test.tex, test.ps: przykłady użycia.
+
+Sposób użycia
+=============
+
+W pliku źródłowym należy na początku włączyć poleceniem input plik
+mpattern.mp, a następnie przetworzyć plik standardowym programem
+mpost.
+
+Interfejs użytkownika
+=====================
+
+Definiowanie wzorku
+--------------------
+
+Wzorki są definiowane przy użyciu konstrukcji:
+
+beginpattern(<nazwa_wzorku>);
+...
+endpattern;
+
+Parametr <nazwa_wzorku> jest nazwą, która służy do identyfikacji
+wzorku. Nazwa ta może zawierać litery i znaki podkreślenia ,,_'', ale
+nie może zawierać cyfr. NIE należy podawać tej nazwy w cudzysłowach.
+
+W definicji wzorku (w dowolnym miejscu między beginpattern a
+endpattern) można podać dodatkowe polecenia:
+- patternbbox(<pair>,<pair>)
+- patternbbox((<numeric>,<numeric>,<numeric>,<numeric>)
+ Jawne podanie współrzędnych prostokąta ograniczającego komórkę wzorka
+
+- patternxstep(<numeric>)
+- patternystep(<numeric>)
+- patternstep(<numeric>,<numeric>)
+- patternstep(<pair>)
+ Odstępy między komórkami wzorka
+
+- patterntransform(<transform>)
+ Modyfikacja kształtu komórki wzorka
+
+- patterncolor(0<= <numeric> <= 1)
+ Jawne podanie koloru związanego z danym wzorkiem
+
+Każdy wzorek jest tymczasowo zapisywany jako rysunek o dużym numerze
+(domyślnie 999), ale jeśli użytkownik wykorzysta ten numer do swojego
+rysunku, to dla wzorku będzie użyty największy wolny numer mniejszy od
+999.
+
+Używanie wzorku
+---------------
+
+Do wykorzystania zdefiniowanego wzorku służy makro działające jak
+operator dwuargumentowy (primary) withpattern. Sposób użycie jest
+następujący:
+
+<ścieżka> withpattern <nazwa_wzorku>;
+
+gdzie <ścieżka> jest dowolnym wyrażeniem określającym zamkniętą
+ścieżkę, a <nazwa_wzorku> jest nazwą podaną w definicji wzorku.
+
+Przykład
+--------
+
+Oto kod służący do narysowania dwóch kółek wypełnionych różnymi
+szachownicami.
+
+input mpattern;
+
+beginpattern(checker);
+ d:=4mm;
+ fill unitsquare scaled d;
+ fill unitsquare scaled d shifted (d,d);
+ patternbbox(0,0,2d,2d);
+endpattern;
+
+beginpattern(rotated_checker);
+ fill unitsquare scaled 4mm rotated 45 withcolor .7white;
+endpattern;
+
+beginfig(11);
+ path p;
+ z1=(1cm,1cm);
+ p=fullcircle scaled 3cm;
+ fill p withpattern checker;
+ unfill p shifted z1;
+ fill p shifted z1 withpattern rotated_checker;
+endfig;
+
+Zasady rozpowszechniania
+========================
+
+Pakiet MPATTERN jest dobrem wspólnym (ang. ,,public domain''). W
+przypadku modyfikacji lub redystrybucji pakietu można stosować dowolną
+aktualną licencję GPL.
+
+Problemy
+========
+
+06-2001: Mogą być problemy z wypełnianiem wzorkami napisów. Aktualne
+ rozwiązanie jest prowizoryczne.
+
+Zmiany
+======
+
+06-2001: Dzięki inspiracji tutorialem Piotra Strzelczyka na
+ konferencji BachoTeX'2001 wyeliminowana została konieczność
+ postprocesingu z wykorzystaniem Perla. Podmiana kolorów na
+ wzorki jest obecnie realizowana z wykorzystaniem słowników na
+ poziomie PostScriptu.
+
+Kontakt z autorem
+=================
+
+e-mail: P.Bolek@gust.org.pl
diff --git a/Master/texmf-dist/doc/metapost/mpattern/test.mp b/Master/texmf-dist/doc/metapost/mpattern/test.mp
new file mode 100644
index 00000000000..a6cd1a8f86e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpattern/test.mp
@@ -0,0 +1,146 @@
+input mpattern;
+prologues:=1;
+
+beginpattern(szachy_i);
+ patterncolor(.8);
+ fill unitsquare scaled 4mm;
+ fill unitsquare scaled 4mm shifted (4mm,4mm);
+endpattern;
+
+beginpattern(szachy_ii);
+ fill unitsquare scaled 3mm withcolor .7white;
+ fill unitsquare scaled 3mm shifted (3mm,3mm) withcolor .7white;
+endpattern;
+
+beginfig(1);
+ fill fullcircle scaled 30mm withpattern szachy_i;
+
+ picture q;
+ q:=currentpicture; clearit;
+
+ draw q shifted (10mm*right) rotated 30 scaled .5;
+
+ fill unitsquare scaled 20mm withpattern szachy_ii;
+endfig;
+
+beginpattern(checker);
+ u:=1mm;
+ fill unitsquare scaled u;
+ fill unitsquare scaled u shifted (u,u);
+ patternbbox(0,0,2u,2u);
+ patterntransform(identity slanted .17);
+endpattern;
+
+beginpattern(rotated_checker);
+ fill unitsquare scaled 4mm rotated 45 withcolor .7white;
+ patterntransform(identity rotated 30);
+endpattern;
+
+beginfig(11);
+ path p;
+ z1=(1cm,1cm);
+ p=fullcircle scaled 3cm;
+ fill p withpattern checker;
+ unfill p shifted z1;
+ fill p shifted z1 withpattern rotated_checker;
+endfig;
+
+beginpattern(tt);
+ fill unitsquare scaled 2mm rotated 45 withcolor .5white;
+ z1=llcorner currentpicture;
+ z2=lrcorner currentpicture;
+ z3=urcorner currentpicture;
+ z4=ulcorner currentpicture;
+% draw z1--z2--z3--z4--cycle;
+ patterntransform(identity rotated 30 slanted .2 yscaled 3);
+ patternstep((1.1*xpart(urcorner currentpicture-ulcorner currentpicture),
+ 2/3*xpart(urcorner currentpicture-ulcorner currentpicture)));
+endpattern;
+
+beginpattern(ttt);
+ fill unitsquare scaled 2mm rotated 45 withcolor .5white;
+ z1=llcorner currentpicture;
+ z2=lrcorner currentpicture;
+ z3=urcorner currentpicture;
+ z4=ulcorner currentpicture;
+% draw z1--z2--z3--z4--cycle;
+ patterntransform(identity rotated 30 slanted .2);
+ patternstep((1.1*xpart(urcorner currentpicture-ulcorner currentpicture),
+ 2/3*xpart(urcorner currentpicture-ulcorner currentpicture)));
+endpattern;
+
+beginpattern(tr);
+ u:=4mm;
+ z1=(0,0);
+ z2=(u,0);
+ z3=(u,2u);
+ z4=(0,2u);
+ z12=.5[z1,z2];
+ z23=.5[z2,z3];
+ z34=.5[z3,z4];
+ z41=.5[z4,z1];
+ draw z12--z23--z34--z41--cycle;
+ draw z23--z41;
+ draw z1--z2;
+ draw z3--z4;
+ patternbbox(z1,z3);
+ patterntransform(identity slanted .1 rotated 11);
+ patternstep(1.2(x2-x1),1.2(y3-y1));
+endpattern;
+
+beginfig(12);
+ path p;
+ z1=(1cm,1cm);
+ p=fullcircle scaled 3cm;
+ fill p withpattern tt;
+ draw p;
+ unfill p shifted z1;
+ fill p shifted z1 withpattern tr;
+ draw p shifted z1;
+endfig;
+
+beginpattern(ll);
+ pickup pencircle scaled .3;
+ draw origin--4up;
+ patternbbox(left,4up+right);
+ patterntransform(identity rotated -45);
+endpattern;
+
+beginpattern(lll);
+ pickup pencircle scaled .3;
+ draw origin--4up;
+ patternbbox(left,4up+right);
+ patterntransform(identity rotated 45);
+endpattern;
+
+beginpattern(literki);
+ label(btex \font\q=ptmr8r at 5pt\q abcd etex,origin);
+ z1=ulcorner currentpicture;
+ z2=urcorner currentpicture;
+ patterntransform(identity slanted .17);
+endpattern;
+
+beginpattern(cm_literki);
+ label(btex \font\q=cmr5\q xyz XYZ ZYX zyx etex,origin);
+ z1=ulcorner currentpicture;
+ z2=urcorner currentpicture;
+ patterntransform(identity slanted .17);
+endpattern;
+
+beginfig(13);
+ label(btex \font\q=ptmr8r at 90pt\q ABCD etex, origin) withpattern ll;
+endfig;
+
+beginfig(14);
+ picture a; a=btex \font\q=ptmbi8r at 90pt\q ABCD etex;
+ draw a withpattern literki;
+ undraw a shifted (20up+10right);
+ draw a shifted (20up+10right) withpattern checker;
+ undraw a shifted (40up+20right);
+ draw a shifted (40up+20right) withpattern lll;
+ draw a shifted (40up+20right) withpattern ll;
+ undraw a shifted (60up+30right);
+ draw a shifted (60up+30right) withpattern cm_literki;
+endfig;
+
+end.
diff --git a/Master/texmf-dist/doc/metapost/mpattern/test.tex b/Master/texmf-dist/doc/metapost/mpattern/test.tex
new file mode 100644
index 00000000000..3f3886958af
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpattern/test.tex
@@ -0,0 +1,22 @@
+\input epsf
+
+\epsfbox{test.1}
+Simple patterns
+\bigskip
+
+\epsfbox{test.11}
+Explicit bounding box and transformations
+\bigskip
+
+\epsfbox{test.12}
+Transformations and cell spacing
+\bigskip
+
+\epsfbox{test.13}
+Filling label
+\bigskip
+
+\epsfbox{test.14}
+Filling text and with text
+
+\bye
diff --git a/Master/texmf-dist/doc/metapost/piechartmp/INSTALL b/Master/texmf-dist/doc/metapost/piechartmp/INSTALL
new file mode 100644
index 00000000000..f61c9bc54ab
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/piechartmp/INSTALL
@@ -0,0 +1,6 @@
+piechartMP installation:
+
+piechartmp.mp --> TEXMF/metapost/piechartmp/
+LEGAL, README --> TEXMF/doc/metapost/piechartmp/
+piechartmp.pdf --> TEXMF/doc/metapost/piechartmp/
+/examples/* --> TEXMF/doc/metapost/piechartmp/
diff --git a/Master/texmf-dist/doc/metapost/piechartmp/LEGAL b/Master/texmf-dist/doc/metapost/piechartmp/LEGAL
new file mode 100644
index 00000000000..b02acc87c0d
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/piechartmp/LEGAL
@@ -0,0 +1,104 @@
+ piechartMP
+ Terms And Conditions For Copying, Distribution And Modification
+ Like LaTeX Project Public License Version 1.0
+
+
+WARRANTY
+========
+
+There is no warranty for piechartMP, to the extent permitted by
+applicable law. Except when otherwise stated in writing, the
+Copyright holder provides piechartMP `as is' without warranty of any
+kind, either expressed or implied, including, but not limited to, the
+implied warranties of merchantability and fitness for a particular
+purpose. The entire risk as to the quality and performance of the
+program is with you. Should piechartMP prove defective, you assume
+the cost of all necessary servicing, repair or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will the Copyright holder, or any of the individual authors named in
+the source for piechartMP, be liable to you for damages, including
+any general, special, incidental or consequential damages arising out
+of any use of piechartMP or out of inability to use piechartMP
+(including but not limited to loss of data or data being rendered
+inaccurate or losses sustained by you or by third parties as a result
+of a failure of The Program to operate with any other programs), even
+if such holder or other party has been advised of the possibility of
+such damages.
+
+
+DISTRIBUTION
+============
+
+Redistribution of unchanged files is allowed provided that all files
+that make up the distribution of piechartMP are distributed.
+In particular this means that piechartMP has to be distributed
+including the files in the piechartMP-README.
+If you distribute piechartMP together with a installation programm
+or installation programms, you have to take care, that users cannot
+skip or delete parts of piechartMP without be well informed about
+this action.
+
+The distribution of piechartMP contain a listing of all the files
+covered by this license at README.
+
+If you receive only some of these files from someone, complain!
+
+The distribution of changed versions of certain files included in the
+piechartMP, and the reuse of code from piechartMP, are allowed
+under the following restrictions:
+
+ * It is allowed only if the legal notice in the file does not
+ expressly forbid it.
+ See note below, under "Conditions on individual files".
+
+ * You rename the file before you make any changes to it, unless the
+ file explicitly says that renaming is not required. Any such changed
+ files must be distributed under a license that forbids distribution
+ of those files, and any files derived from them, under the names used
+ by the original files in the distribution of piechartMP.
+
+ * You change any `identification string' in piechartMP to clearly
+ indicate that the file is not part of the standard system.
+
+ * You change the `error report address' in any modified versions of
+ piechartMP, so that reports for files not maintained by the
+ original program maintainers are directed to the maintainers of the
+ changed files.
+
+ * You acknowledge the source and authorship of the original version
+ in the modified file.
+
+ * You also distribute the unmodified version of the file.
+
+ * You distribute an appropriate documentation.
+
+The above restrictions are not intended to prohibit, and hence do
+not apply to, the updating, by any method, of a file so that it
+becomes identical to the latest version of that file in piechartMP.
+
+========================================================================
+
+
+Conditions on individual files
+==============================
+
+The individual files may bear additional conditions which supersede
+the general conditions on distribution and modification contained in
+this file.
+
+Typical examples of files with more restrictive modification
+conditions would be files that contain the text of copyright notices.
+
+ * The conditions on individual files differ only in the
+ extent of *modification* that is allowed.
+
+ * The conditions on *distribution* are the same for all the files.
+ Thus a (re)distributor of a complete, unchanged copy of The Program
+ need meet only the conditions in this file; it is not necessary to
+ check the header of every file in the distribution to check that a
+ distribution meets these requirements.
+
+Such files are:
+
+ * LEGAL, README: You are not allowed to modify these files.
diff --git a/Master/texmf-dist/doc/metapost/piechartmp/README b/Master/texmf-dist/doc/metapost/piechartmp/README
new file mode 100644
index 00000000000..95db7438b2b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/piechartmp/README
@@ -0,0 +1,17 @@
+This is the README of the piechartMP MetaPost package.
+For license informations see LEGAL.
+
+The package consists of the files:
+- README (this file)
+- LEGAL (license information)
+- piechartmp.mp (the MetaPost module)
+- piechartmp.pdf (english documentation)
+
+
+This is a BETA-release, but I believe that
+the user interface will not change anymore.
+Please send bug-reports and suggestions to:
+Jens-Uwe Morawski <morawski@gmx.net>
+
+Jens-Uwe Morawski
+May 14, 2002; piechartMP version 0.3.0 \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/piechartmp/examples/wec-mfun.mp b/Master/texmf-dist/doc/metapost/piechartmp/examples/wec-mfun.mp
new file mode 100644
index 00000000000..92d39d11126
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/piechartmp/examples/wec-mfun.mp
@@ -0,0 +1,146 @@
+%H
+%H piechartMP example - world energy consumption 2000
+%H (extended MetaFun version)
+%H Jens-Uwe Morawski, 2002
+%H
+
+
+%I this MetaPost example requires the MetaFun package
+%I (see piechartMP documentation)
+%I The purpose of this example is to show how pie-charts
+%I can be placed in a figure using the pc_Centre variable.
+%I wec-mfun.pdf in the same directory contains the final
+%I figure.
+
+
+%D This example uses the 'externalfigure' macro from
+%D the MetaFun package. If piechartMP is loaded after
+%D MetaFun then piechertMP detects MetaFun and will
+%D draw segment outsides as gradients.
+%D Since here many charts will be drawn it can cause
+%D an overflow of the MetaPost buffer-size,
+%D therefore piechertMP is loaded prior MetaFun.
+%D If the buffer-size of your MetaPost installation is
+%D large enough then you can load piechartMP after
+%D MetaFun and segment outsides will be drawn as gradients.
+input piechartmp ;
+input metafun ;
+
+%D Helvetica-Bold
+% This should work on most systems. If not, comment the next line.
+defaultfont := "phvb8r" ;
+defaultscale := 0.7 ;
+
+%D
+Scale := 5mm ;
+
+%D define some colors
+color oil_color, gas_color, coal_color, nuclear_color, water_color ;
+oil_color := (0.4, 0 , 0 ) ;
+gas_color := (0 , 0.5, 0 ) ;
+coal_color := (0.5, 0.3, 0 ) ;
+nuclear_color := (0.8, 0.8, 0.2) ;
+water_color := (0.3, 0.3, 1.0) ;
+
+
+%D define some points to place the charts
+pair place[] ;
+place[1] := (2cm,5cm) ;% North America
+place[2] := (7.5cm,3.5cm) ;% Asia
+place[3] := (5cm,5.3cm) ;% Europe
+place[4] := (6.5cm,5.8cm) ;% CIS
+place[5] := (5.6cm,4.2cm) ;% Middle East
+place[6] := (2.5cm,2.7cm) ;% South America
+place[7] := (5cm,3cm) ;% Africa
+
+
+%D
+def AChart (expr Size, Name, Place, Water, Nuclear, Coal, Gas, Oil) =
+ begingroup;
+ save label_pnt, Radius ;
+ pair label_pnt ; numeric Radius ;
+
+ % the 'Size' is the absolute energy consumption
+ % that means the 'Size' is proportional to the area
+ % of the pie-chart and not the radius.
+ Radius := (sqrt Size)*Scale ;
+
+ ResetSegments ; % documented in piechartMP Internals
+
+ if Water>0:
+ Segment(Water, "", water_color) ;
+ fi;
+ if Nuclear>0:
+ Segment(Nuclear, "", nuclear_color) ;
+ fi;
+ if Coal>0:
+ Segment(Coal, "", coal_color) ;
+ fi;
+ if Gas>0:
+ Segment(Gas, "", gas_color) ;
+ fi;
+ if Oil>0:
+ Segment(Oil, "", oil_color) ;
+ fi;
+
+ pc_Centre := place[Place] ; % documented in piechartMP Internals
+ PieChart(Radius, 0.3, 65, 90, 0) ;
+ label_pnt := SegmentPoint(1,(1,0));
+ label.top (Name & "; " & (decimal Size), label_pnt) withcolor white;
+
+ endgroup;
+enddef;
+
+
+beginfig(1);
+
+%D 'externalfigure' is a macro from the MetaFun package.
+%D It embeds the external JPG-Background, the file worldmap.jpg
+%D should be available from the same location as this
+%D MP file.
+externalfigure "worldmap.jpg" xscaled 10cm yscaled 7cm ;
+
+AChart (3.8, "North-America", 1, 2, 6, 25, 32, 35 ) ;
+AChart (3.4, "Asia/Oceania", 2, 2, 5, 46, 10, 38 ) ;
+AChart (2.6, "Europe", 3, 4, 16, 18, 20, 42 ) ;
+AChart (1.3, "CIS", 4, 2, 6, 18, 50, 24 ) ;
+AChart (0.5, "Middle East", 5, 0, 0, 0, 35, 65 ) ;
+AChart (0.5, "South-America",6 , 15, 0, 5, 15, 65 ) ;
+AChart (0.4, "Africa",7 , 0, 0, 37, 18, 45 ) ;
+
+
+%D the legend
+x := 3mm ;
+y := 2.5cm ;
+fill fullcircle scaled 2mm shifted (x,y) withcolor oil_color;
+label.rt ("Oil", (x+2mm,y)) ;
+fill fullcircle scaled 2mm shifted (x,(y-5mm)) withcolor gas_color;
+label.rt ("Gas", (x+2mm,y-5mm)) ;
+fill fullcircle scaled 2mm shifted (x,(y-1cm)) withcolor coal_color;
+label.rt ("Coal", (x+2mm,y-1cm)) ;
+fill fullcircle scaled 2mm shifted (x,(y-1.5cm)) withcolor nuclear_color;
+label.rt ("Nuclear Power", (x+2mm,y-1.5cm)) ;
+fill fullcircle scaled 2mm shifted (x,(y-2cm)) withcolor water_color;
+label.rt ("Water Power", (x+2mm,y-2cm)) ;
+
+
+%D some labels
+label.top ("(in billion t MCU)", (7cm,0)) ;
+defaultfont:="ptmbi8r" ; defaultscale:= 1.2;
+label("World Energy Consumption 2000", origin)
+ rotated 90 shifted (9.5cm,3cm) withcolor white;
+
+
+%D Next follows the grid I have used to determine the co-ordinates
+%D saved in place[]. Now it is not drawn because of the if..fi
+%D statement.
+if false:
+for i=1 upto 10:
+ draw (origin--(0,7cm)) shifted (i*1cm,0) withcolor white ;
+endfor;
+for i=1 upto 7:
+ draw (origin--(10cm,0)) shifted (0,i*1cm) withcolor white ;
+endfor;
+fi;
+endfig;
+end \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/piechartmp/examples/wec-mfun.pdf b/Master/texmf-dist/doc/metapost/piechartmp/examples/wec-mfun.pdf
new file mode 100644
index 00000000000..3b29ac5263e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/piechartmp/examples/wec-mfun.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/piechartmp/examples/wec.mp b/Master/texmf-dist/doc/metapost/piechartmp/examples/wec.mp
new file mode 100644
index 00000000000..7f45ad33ffd
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/piechartmp/examples/wec.mp
@@ -0,0 +1,122 @@
+%H
+%H piechartMP example - world energy consumption 2000
+%H Jens-Uwe Morawski, 2002
+%H
+
+
+%I The piechartMP documentation includes many useful
+%I examples which not require MetaPost experience.
+%I In contrast this example employs many MetaPost
+%I commands and definitions. Thus it is not meant
+%I for piechart "beginners".
+%I The chief purpose of this example is to show
+%I how you can draw pie-charts with different data-sets
+%I using ResetSegments and how to save them in
+%I MetaPost pictures.
+%I The file wec.pdf in the same directory is the
+%I result of this MP-file.
+
+input piechartmp ;
+
+%D Helvetica-Bold
+% This should work on most systems. If not, comment the next line.
+defaultfont := "phvb8r" ;
+
+%D
+pair NameShift ; NameShift := (-3.5cm,0) ;
+Scale := 8mm ;
+
+%D define some colors
+color oil_color, gas_color, coal_color, nuclear_color, water_color ;
+oil_color := (0.4, 0 , 0 ) ;
+gas_color := (0 , 0.5, 0 ) ;
+coal_color := (0.5, 0.3, 0 ) ;
+nuclear_color := (0.8, 0.8, 0.2) ;
+water_color := (0.3, 0.3, 1.0) ;
+
+
+ChartCounter := 0 ;
+picture Charts[] ;
+
+%D
+def AChart (expr Size, Name, Water, Nuclear, Coal, Gas, Oil) =
+ begingroup;
+ save s , Radius ; string s ;
+
+ % the 'Size' is the absolute energy consumption
+ % that means the 'Size' is proportional to the area
+ % of the pie-chart and not the radius.
+ Radius := (sqrt Size)*Scale ;
+
+
+ s := Name & "; " & (decimal Size) & " billion t MCU" ;
+
+ ResetSegments ; % not documented in piechartMP doc
+
+ if Water>0:
+ Segment(Water, "", water_color) ;
+ fi;
+ if Nuclear>0:
+ Segment(Nuclear, "", nuclear_color) ;
+ fi;
+ if Coal>0:
+ Segment(Coal, "", coal_color) ;
+ fi;
+ if Gas>0:
+ Segment(Gas, "", gas_color) ;
+ fi;
+ if Oil>0:
+ Segment(Oil, "", oil_color) ;
+ fi;
+
+ PieChart(Radius, 0.3, 65, 90, 0) ;
+ label.lft (s, NameShift) ;
+ ChartCounter := ChartCounter + 1 ;
+ Charts[ChartCounter] := currentpicture ;
+ currentpicture := nullpicture ;
+ endgroup;
+enddef;
+
+def ShipoutCharts =
+ begingroup;
+ save h, t ; numeric h, t ;
+ h := 0 ; t := 0 ;
+ for i=1 upto ChartCounter:
+ t := ypart(ulcorner currentpicture) ;
+ h := -1*(ypart(lrcorner Charts[i])) ;
+ h := h + t + 5mm ;
+ draw Charts[i] shifted (0, (h));
+ endfor;
+ endgroup;
+enddef;
+
+beginfig(1);
+AChart (3.8, "North-America", 2, 6, 25, 32, 35 ) ;
+AChart (3.4, "Asia/Oceania", 2, 5, 46, 10, 38 ) ;
+AChart (2.6, "Europe", 4, 16, 18, 20, 42 ) ;
+AChart (1.3, "CIS", 2, 6, 18, 50, 24 ) ;
+AChart (0.5, "Middle East", 0, 0, 0, 35, 65 ) ;
+AChart (0.5, "South-America", 15, 0, 5, 15, 65 ) ;
+AChart (0.4, "Africa", 0, 0, 37, 18, 45 ) ;
+ShipoutCharts ;
+
+x := 5mm+(xpart(lrcorner currentpicture)) ;
+y := ypart(ulcorner currentpicture) ;
+
+fill fullcircle scaled 5mm shifted (x,y) withcolor oil_color;
+label.rt ("Oil", (x+5mm,y)) ;
+fill fullcircle scaled 5mm shifted (x,(y-1cm)) withcolor gas_color;
+label.rt ("Gas", (x+5mm,y-1cm)) ;
+fill fullcircle scaled 5mm shifted (x,(y-2cm)) withcolor coal_color;
+label.rt ("Coal", (x+5mm,y-2cm)) ;
+fill fullcircle scaled 5mm shifted (x,(y-3cm)) withcolor nuclear_color;
+label.rt ("Nuclear Power", (x+5mm,y-3cm)) ;
+fill fullcircle scaled 5mm shifted (x,(y-4cm)) withcolor water_color;
+label.rt ("Water Power", (x+5mm,y-4cm)) ;
+
+%D
+defaultfont:="ptmbi8r" ; defaultscale:= 2;
+label.top("World Energy Consumption 2000", (0, y+5mm)) ;
+
+endfig;
+end \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/piechartmp/examples/wec.pdf b/Master/texmf-dist/doc/metapost/piechartmp/examples/wec.pdf
new file mode 100644
index 00000000000..76deef44323
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/piechartmp/examples/wec.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/piechartmp/examples/worldmap.jpg b/Master/texmf-dist/doc/metapost/piechartmp/examples/worldmap.jpg
new file mode 100644
index 00000000000..f3c64b6d957
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/piechartmp/examples/worldmap.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/piechartmp/piechartmp.pdf b/Master/texmf-dist/doc/metapost/piechartmp/piechartmp.pdf
new file mode 100644
index 00000000000..89b7fc3cdb3
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/piechartmp/piechartmp.pdf
Binary files differ