Metapost Metafont är det teckensnittsdesignprogram som D E Knuth skapade för TeX-projektet. Det är ett ritprogram som innehåller en del matematikkunskap. John Hobby inspirerades till att göra ett lite generellare ritprogram, Metapost, som istället för teckensnittsfiler skapar Postscript-filer. I många fall är Metapost ett lämpligt verktyg när man ska göra tekniska illustrationer. Dokumentation finns i John D Hobby: A user s manual for Metapost </pkg/tetex /default/texmf/doc/metapost/base> och i Knuths Metafont-bok.
Exempel 1 beginfig(1); 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); endfort endfor endfig; end Resultatet blir: Med Metapostkoden i filen ex1.mp gör man mpost ex1 och får ex1.1 som innehåller Postscriptkod som döps om till ex11.mps och kan infogas i ett Latex-dokument med \usepackage{graphics} \insertgraphics{ex1.mps} som kompileras med pdflatex.
Genererad Postscript %!PS %%BoundingBox: -2-2 86 86 %%Creator: MetaPost %%CreationDate: 2003.08.26:1318 %%Pages: 1 %%EndProlog %%Page: 1 1 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit newpath 56.6929 56.6929 moveto 0 0 lineto 0 85.03935 lineto 85.03935 0 lineto 0 0 lineto stroke 0 3.98505 dtransform truncate idtransform setlinewidth pop newpath 0 0 moveto 0 0 rlineto stroke newpath 0 28.34645 moveto 0 0 rlineto stroke newpath 0 56.6929 moveto 0 0 rlineto stroke newpath 28.34645 0 moveto 0 0 rlineto stroke newpath 28.34645 28.34645 moveto 0 0 rlineto stroke newpath 28.34645 56.6929 moveto 0 0 rlineto stroke newpath 56.6929 0 moveto 0 0 rlineto stroke
newpath 56.6929 28.34645 moveto 0 0 rlineto stroke newpath 56.6929 56.6929 moveto 0 0 rlineto stroke showpage %%EOF
Infoga i MSWord Postscript-filen kan infogas i ett MSWorddokument om man redigerar filen så att den börjar med %!PS-Adobe-3.0 EPSF-3.0 och har filnamnstillägget.eps och därefter konverterar den till PDF med GhostView. EPSfilen kan istället monteras direkt. En mp-fil kan innehålla många bilder omgivna av beginfig(bildnummer); endfig;. Varje sådan bild ger en Postscriptfil med bildnumret som tillägg. Metaposts datatyper är numeric (tal), pair (punkt), path (kontur), picture (figur), färg, transformation. Koordinaterna är i Postscripts startsystem. Konturer består av punkter förbundna med rät konturlinje»--» eller med splinekurvor beskrivna på olika sätt»..»,»»,»..controls p and q..»,»riktning..»,»..riktning»,»..tension t..»,»{curl n}..».
Splines i Metapost p1..controls p2 and p3..p4 beskriver kurvan x = (1 - t) 3 p 1 + 3(1 - t) 2 tp 2 + 3(1 - t)t 2 p 3 + t 3 p 4 Detta är ett Bernstein-polynom av grad 3 och kurvan är en Bezier-spline. Kurvan ligger inom fyrsidingen med p i som hörn. Med p1..p2 får man approximativt cirkelbågar och med p1 p2 får man, om möjligt, ett kurvsegment utan inflexionspunkt. Om man avslutar kurvbeskrivningen med cycle får man en sluten kurva. Man kan ange riktningen vid punkterna med {riktning} som dir v, p, (x,y) eller någon inbyggd riktning (right, up, left, down). Man kan styra krökningen vid en punkt med {curl s} med s=1 som skönsvärde. Man kan slutligen ange»spänningen» i kurvsegmentets halvor som..tension s 1 and s 2.. eller..tension s.. Skönsvärdet är 1 och måste vara större än 3/4. Man kan behöva experimentera med dessa styrmöjligheter. Riktningsangivelse är nog mest användbart.
Dialog Metapost kan lösa linjära ekvationssystem och variabler kan skrivas ut under tolkningen med show v-lista;
Exempel 2 (niopunktscirkeln) beginfig(2); u=1cm; A=origin; B-A=7u,0); C-A=(u,5u); D=.5[A,B]; E=.5[B,C]; F=.5[A,C]; G=whatever[B,C] =whatever[a,a+((c-b) rotated 90)]; H=whatever[A,C] =whatever[b,b+((c-a) rotated 90)]; I=whatever[B,A] =whatever[c,c+((b-a) rotated 90)]; X=(A G) intersectionpoint (C I); J=.5[A,X]; K=.5[B,X]; L=.5[C,X]; N=whatever[.5[D,I], (.5[D,I]+((D-I) rotated 90))] =whatever[.5[d,h], (.5[D,H]+((D-H) rotated 90)]; r=arclength(i--n); draw A B--C--cycle; draw A--G; draw B--H; draw C--I; draw fullcircle scaled 2r shifted N; dotlabel.bot(btex $A$ etex,a); dotlabel.bot(btex $B$ etex,b); dotlabel.top(btex $C$ etex,c); dotlabel.lrt(btex $D$ etex,d); dotlabel.urt(btex $E$ etex,e); dotlabel.ulft(btex $F$ etex,f); dotlabel.urt(btex $G$ etex,g); dotlabel.ulft(btex $H$ etex,h); dotlabel.llft(btex $I$ etex,i); dotlabel.lft(btex $J$ etex,j); dotlabel.ulft(btex $K$ etex,k); dotlabel.lrt(btex $L$ etex,l);
dotlabel.top(btex $N$ etex,n); dotlabel.lrt(btex $X$ etex,x); endfigure;
Montering Om man monterar figuren direkt i MSWord kommer inte säkert texten med. Texten kommer ut när man sätter ett dokument med figuren i Latex och det går att få med texten till MSWord och PDF-filer. Med Acrobat kan man beskära figuren ur PDF-filen genererad av pdflatex och sedan montera den.
Transformation Punkter, konturer och figurer kan transformeras med rotated v, scaled s, shifted p, slanted s, xscaled x, yscaled y, zscaled p, reflectedabout p1 p2, rotatedaround p v. Identitetstransformationen heter identity. s[p1,p2] är punkten p1+s(p2 p1). whatever är ett godtyckligt tal. c1 intersectionpoint c2 är skärningspunkten mellan konturerna (det finns regler när det är många skärningspunkter). arclength ger längden av en kurva. Prioriteterna mellan operatorerna är väldefinierade men inte alltid intuitiva; man kan sätta ut parenteser. label sätter ut en figur, vanligen text, vid en punkt. Man kan med ett suffix ange var i förhållande till punkten utmärkningen ska sättas. dotlabel markerar också punkten tydligt. Dessutom finns kommandon för linjemönster, pilspetsar, pennform, fyllning, radering, maskning, makrodefinition m.m.
Exempel 3 beginfig(3); 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.4(1,0,0); unfill bbox pa; draw pa; unfill bbox pb; draw pb; label.lft(btex $U$ etex, (-1cm,.5cm)); draw bbox currentpicture; endfig; Standardcirkeln har radie 1 och börjar i vinkel 0. Med buildcycle görs en sluten kurva, om möjligt, av parametrarna mellan successiva skärningspunker. Färger är vektorer med 3 komponenter, R, G och B. 0 motsvarar
svart=ingen färg. bbox är en omslutande box (axelparallell rektangel).
Exempel 4 beginfig(4); boolean timetofillbox; timetofillbox:=true; partway:=0.9; l:=.75in; u:=1.75in; n:=4; theta:=360/n; z1=(0,u); for i:=2 upto n: z[i]=z1 rotated ((i-1)*theta); endfor forever: path p; p:=z1 for j:=2 upto n: --z[j] endfor --cycle; if timetofillbox: fill p; timetofillbox:=false; else: unfill p; timetofillbox:=true; fi pair Z[]; for j:=1 upto n: Z[j]:=partway[z[j-1],z[j]]; endfor Z1:=partway[z[n],z1]; for j:= 1 upto n: x[j]:=xpart Z[j]; y[j]:=ypart Z[j]; endfor if not timetofillbox: l:=abs(z1); fi exitif l<0.05u; endfor endfig;
Resultat Boken Michel Goossens, Sebastian Rahtz och Frank Mittelbach (1997) The Latex graphics companion. Addison Wesley. innehåller mycket information om att infoga bilder i Latex och annat om bilder i digitala dokument.
Koordinattransformation vid rotation Nedanstående gur och formler troliggör formeln för koordinattransformation vid rotation av koordinatsystemet. y y H B P D G F C x O A E x x = OC y = OD x = OA = OE AE = OE F C = x cos v y sin v y = GB+OG = DH+OG = x sin v+y cos v dvs. (x, y) = (x, y ) ( cos v sin v sin v cos v ) 1
Omgivningen picture Ett alternativ till att infoga bilder genererade med Metapost är att använda Latex omgivning picture. En vinst med detta är bättre portabilitet. Enheten i koordinatsystemet sätts med t.ex. \setlength{\unitlength}{25mm}. Omgivningen specificeras med begin{picture}(bredd, höjd)(ll-x,ll-y) end{picture} Måttenheten är \unitlength och origos läge kan utelämnas om origo ligger i nedre vänstra hörnet. Delfigurer utplaceras med \put(x,y){delbild} eller \multiput(x,y)(dx,dy){antal}{delbild}. En delbild kan vara text, \parbox[pos]{bredd}{innehåll} där pos kan vara t eller b ett box-kommando t.ex. \makebox(bredd,höjd)[pos]{innehåll}, \framebox eller \dashbox{mönster} en linje med \line(dx,dy){längd} där dx och dy är 6..0..6 och anger lutningen
en pil med \vector(dx,dy){längd} en cirkel med \circle{diameter} eller svartfylld med \circle*{diameter} rundade hörn med \oval(bredd,höjd)[del] där utelämnad del ger en rektangel med fyra rundade hörn och man kan välja del bland t, l, b, r, tl, tr, bl, br kvadratiska splines med \bezier{antal}(x1,y1)(x2,y2)(x3,y3) eller \qbezier. För den senare får man utelämna antal som är antalet punkter kurvan utmärks med. Man styr linjebredden med \linethickness{bredd}, \thinlines eller \thicklines. En picture-omgivning får innehålla en picture-omgivning.
Exempel 1 \section{exempel 1} \setlength{\unitlength}{1mm} \begin{picture}(20,15) \multiput(0,0)(1,2){7}{\circle*{1}} \multiput(8,0)(2,0){10} {\begin{picture}(0,0) \multiput(0,0)(1,2){7} {\circle*{1}} \end{picture}} \end{picture}
Exempel 2 \section{exempel 2} \setlength{\unitlength}{2mm} \begin{picture}(20,30) \linethickness{1bp} \multiput(0,0)(10,0){3} {\line(0,1){30}} \multiput(0,0)(0,10){4} {\line(1,0){20}} \linethickness{0.3bp} \multiput(5,0)(10,0){2} {\line(0,1){30}} \multiput(0,5)(0,10){3} {\line(1,0){20}} \linethickness{0.1bp} \multiput(1,0)(1,0){19} {\line(0,1){30}} \multiput(0,1)(0,1){29} {\line(1,0){20}} \end{picture}
Exempel 3 \section{exempel 3} \setlength{\unitlength}{1mm} \newcounter{ic} \begin{picture}(25,40) \thicklines \scriptsize \put(5,0){\framebox(15,40){}} \thinlines \multiput(5,37.5)(0,-5){8} {\oval(8,3)[l]% \stepcounter{ic}\makebox(0,0)[r] {\arabic{ic}\,\,}} \put(20,2.5){\oval(8,3)[r]% \stepcounter{ic}\makebox(0,0)[l] {\,\,\arabic{ic}}} \multiput(20,7.5)(0,5){7} {\oval(8,3)[r]% \stepcounter{ic}\makebox(0,0)[l] {\,\arabic{ic}}} \put(6.5,38.5){\circle*{1}} \end{picture}
Maskning i Postscript %!PS % x y box % en box med hörn i (0,0) och (x,y) /box {/y exch def /x exch def newpath 0 0 moveto x 0 rlineto 0 y rlineto x neg 0 rlineto closepath} def /Times-Roman findfont 20 scalefont setfont 72 72 translate gsave 72 72 box gsave stroke grestore clip -12-12 moveto (Text i Times-Roman beskuren till boxen) show -2 18 moveto (Text i Times-Roman beskuren till boxen) show -22 48 moveto (Text i Times-Roman beskuren till boxen) show grestore
Maskning med teckenkontur gsave /Times-Roman findfont 100 scalefont setfont 0 80 moveto (A) true charpath gsave stroke grestore clip 36 108 translate 0 5 360 { newpath gsave rotate 0 0 moveto 300 0 rlineto stroke grestore } for grestore showpage
Slumpmönster Rita ett mönster med slumpmässigt svarta och vita rutor. /picstr 64 64 mul string def 0 1 64 dup mul 1 sub {/i exch def picstr i rand 1073741800 ge {0}{255} ifelse put} for 72 72 translate 144 144 scale 64 64 8 [64 0 0-64 0 64] {picstr} image
Viktiga Unix-program ghostview visning av Postscript ps2pdf motsvarar distiller eps2pdf behåller omgivningsboxen ps2eps genererar omgivningsbox eps2eps rensar bort vissa fel ps2ascii extraherar text pdf2ps printafm eps2tiff skaper förhandsbild od oktal dump iconv teckenkodskonvertering locale avläs lokaliseringsinformation
Viktiga tecken i Unicode <BR>* *U+00A0 NO-BREAK-SPACE <BR>* *U+2002 EN-SPACE <BR>* *U+2003 EM-SPACE <BR>* *U+2013 EN-DASH <BR>* *U+2014 EM-DASH <BR>*»*U+00BB RIGHT POINTING GUILLEMET <BR>*Å*U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE <BR>*Ä*U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS <BR>*Ö*U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS <BR>*å*U+00E5 LATIN SMALL LETTER A WITH RING ABOVE <BR>*ä*U+00E4 LATIN SMALL LETTER A WITH DIAERESIS <BR>*ö*U+00F6 LATIN SMALL LETTER O WITH DIAERESIS <BR>*þ*U+00FE LATIN SMALL LETTER THORN <BR>*א*U+05D0 HEBREW LETTER ALEF <BR>* *U+2019 RIGHT SINGLE QUOTATION MARK <BR>* *U+201D QUOTATION MARK RIGHT DOUBLE
Moiré Parallella linjer med frekvenser f1 och f2: fm= f1 f2 ; pm=1/ f1 f2 Linjegrupper i vinkel v: vm=v/2; fm=f/(2 sin(v/2))