Praktikum 8
Metaposti joonised (Postscript)
Võtke fail joonised-metapost.tex ja koostage sinna nõutavad MetaPost-keeles joonised. Näidiseks on fail joonised_naidis-metapost.pdf.
Lisapaketid:
GeometriePlus.mp,
geometry2d.mp -- lisapaketid geomeetria konstruktsioonide arvutamiseks (lõikepunktid, sise- ja ümberringjooned jms)
labelauto.mp -- lisapakett tekstide paigutamiseks sobivasse (kõige tühjemasse) kohta
Kompileerimine käsureal: mpost joonis.mp või mpost -tex=latex joonis.mp või mpost --tex=latex joonis.mp
Tulemusena tekivad failid joonis.1, joonis.2 jne, vastavalt MetaPosti käskudele beginfig(1), beginfig(2) jne. Selliselt saab ühe MetaPosti faili koosseisu paigutada mitme joonise lähtekoodi.
LaTeXi dokumendi koosseisu saab joonise tõmmata käsuga \includegraphics{joonis.1}
NB! LaTeXi koodi preambulasse on vaja paigutada \usepackage[dvips]{graphicx}
Esimese joonise näpunäited
- Ruudu joonistamine
beginfig(1); numeric u; u := 1cm; path ruut; ruut := (0,0)--(1*u,0)--(1*u,1*u)--(0,1*u)--cycle; draw ruut; endfig; end
- Täidetud ruut ja paks äärejoon
beginfig(1); numeric u; u := 1cm; path ruut; ruut := (0,0)--(1*u,0)--(1*u,1*u)--(0,1*u)--cycle; fill ruut withcolor black; draw (0,0)--(8*u,0)--(8*u,8*u)--(0,8*u)--cycle withpen pencircle scaled 3pt; endfig; end
- Esimene rida täidetud ruutusid tsükliga, kus ruudu alumise vasaku nurga {$x$}-koordinaat saab väärtused {$0u,2u,4u,6u$}
beginfig(1); numeric u; u := 1cm; path ruut; ruut := (0,0)--(1*u,0)--(1*u,1*u)--(0,1*u)--cycle; for i := 0 upto 3: fill (ruut shifted (2*i*u,0)) withcolor black; endfor; draw (0,0)--(8*u,0)--(8*u,8*u)--(0,8*u)--cycle withpen pencircle scaled 3pt; endfig; end
- Samamoodi esimene rida täidetud ruutusid, aga tsüklis omandab {$i$} nüüd väärtused {$0,1,2,3,4,5,6,7$} ning
if-lausega jäetakse alles ainult juhtumid {$0,2,4,6$}beginfig(1); numeric u; u := 1cm; path ruut; ruut := (0,0)--(1*u,0)--(1*u,1*u)--(0,1*u)--cycle; for i := 0 upto 7: if ((i <> 1) and (i <> 3) and (i <> 5) and (i <> 7)): fill (ruut shifted (i*u,0)) withcolor black; fi; endfor; draw (0,0)--(8*u,0)--(8*u,8*u)--(0,8*u)--cycle withpen pencircle scaled 3pt; endfig; end
MetaPosti käsud
beginfig(5); . . . endfig;joonis nr. 5, kompileerimisel tekibjoonis.5- muutujate tüübid:
numeric x;muutujaxtüübiks on reaalarvpair A;muutujaAtüübiks on punktpath p;muutujaptüübiks on joon
x := 5;omistamineA:=0.3[B,C]tähendab punkti lõigul {$BC$}, kus {$B$} poole jääb {$0{,}3$} osa ja {$C$} poole {$1-0{,}3$} osa- joone konstrueerimine
(0cm,2cm)--(3cm,4cm)..(-5cm,1cm)--cycle--määrab ühenduslüliks sirglõigu,..määrab ühenduslüliks kõverjoone,cyclenäitab, et algus- ja lõpp-punkt langevad kokku
fullcircle scaled (4cm)ringjoon läbimõõduga 4 cmp shifted (1cm,-3cm)joonpnihutatud vektori (1cm,-3cm) võrrap rotated 45joonppööratud 45 kraadi vastupäeva ümber nullpunkti
fill p withcolor (1, 0.8, 0.8);täitmisvärv RGB-süsteemis (kanalid skaalal 0-st 1-ni)- joone joonistamine
draw p;joonistab joonepdraw p withpen pencircle scaled 2pt;joonetüüp (circle-ümar, square-kandiline), -paksus
- tsükkel:
for i := 0 upto 5: draw (i*1cm, 4cm)--(i*1cm,5cm); endfor;
- valikulause:
if (i > 3): draw (i*1cm, 4cm)--(i*1cm,5cm); fi;
- Teksti lisamine
label(btex $\frac{1}{2}$ etex, (3cm, 1cm));tekst {$\frac12$} antud punktislabel.top,label.bot,label.rt,label.lft,label.ulftjne teksti asukoht punkti suhteslabel.autotekst pannakse punkti lähedale sinna, kus on tühja ruumi (vajab paketti labelauto)circlabel.autopunkti kohale rõngas
input labelauto;paketti lisamine- lisaseadistused ja makrod, mõjuvad kõigile tekstidele
verbatimtex \documentclass{article} \usepackage[T1]{fontenc} \usepackage[estonian]{babel} \usepackage{mathpazo} \begin{document} etex;
Joontega seonduv
p intersectionpoint q-- joonep(esimene) lõikepunkt joonegaqp cutbefore q-- joon, mis jääb allesp-st enneq-ga (esimest korda) lõikumistp cutafter q-- joon, mis jääb allesp-st pärastq-ga (esimest korda) lõikumistlength p-- joonepviimase kontrollpunkti järjekorranumberpoint 3 of p-- joonepkontrollpunkt nr 3 (esimene kontrollpunkt on numbriga 0)subpath (0,2) of p-- jooneposa, mis jääb kontrollpunktide nr 0 ja 2 vaheledirection 0 of p-- jooneppuutuja tõus kontrollpunktist nr 0 väljumiselreverse p-- joonptagurpidi, st. kontrollpunktid vastupidises järjestusesp intersectiontimes q-- vektor, mille esimene koordinaat on lõikepunkti kontrollpunkt joonelpja teine on lõikepunkti kontrollpunkt joonelq(tõenäoliselt kümnendmurrud)- funktsiooni {$y=x^2$} graafiku tükk:
path parabool; numeric algx,loppx,u; u := 1cm; algx := -1; loppx := 1; vardef f(expr x) = x**2 enddef; parabool := (algx*u, (f(algx))*u) for i = 1 upto 50: ..((algx+(loppx-algx)*i/50)*u, (f((algx+(loppx-algx)*i/50)))*u) endfor; draw parabool;
Sisuliselt saab {$x$}-koordinaat väärtused {$-1$}, {$-1+\frac{2\cdot1}{50}$}, {$-1+\frac{2\cdot2}{50}$},{$\ldots$}, {$-1+\frac{2\cdot50}{50}=+1$}.
Viirutamine
Viirutamise idee on koostada tsükli abil sirglõikude parv ning lõigata neist joonmuutujakujund abil välja õige pikkusega jupid.
numeric u;
u := 1cm;
path kujund;
kujund := (0,0)..(8u,0)..(8u,7u)--(7u,7u)--(7u,8u)..(0,8u)..cycle;
picture pilt;
pilt := nullpicture; % siia hakkame sirglõikusid lisama
path jooneke;
for i = -50 upto 50: % lisame 101 sirglõiku, nihutades horisontaalsuunas
jooneke := ((-20u,-16u)--(20u,16u)) shifted (0,0.2*i*u);
% sirglõigud võtame piisava varuga otstest, nihke samm 0.2*u
addto pilt doublepath jooneke; % sirglõigu lisamine pildile
endfor;
% sirglõikude parv on valmis
clip pilt to kujund; % väljalõikamine
draw pilt withpen pencircle scaled 0.1pt; % viirutus peene joonega
draw kujund withpen pencircle scaled 2pt; % kujundi rajajoon paksult
Metaposti joonised (PDF)
NB! Metaposti joonised joonis.1, joonis.2 jne on küll PostScript-vormingus vektorgraafika pildid, aga sealt on puudu fontide info. Seetõttu ei saa neid vahetult konverteerida PDF-ks (näiteks Ghostscriptiga).
Metaposti jooniste PDF vormingusse viimiseks on kaks võimalust.
Võimalus 1. Paigutada joonise lähtekoodi algusse järgmine abifunktsioon:
def genereeri(expr w, h, base) =
begingroup
write "\documentclass{article}" to base&".tex";
write "\usepackage{geometry}" to base&".tex";
write "\usepackage[pdftex]{graphicx}" to base&".tex";
write "\DeclareGraphicsRule{*}{mps}{*}{}" to base&".tex";
write "\geometry{papersize={"& decimal(ceiling(w)) & "bp," &%
decimal(ceiling(h)) & "bp}}" to base&".tex";
write "\geometry{margin={0bp,0bp}}" to base&".tex";
write "\geometry{noheadfoot,nomarginpar}" to base&".tex";
write "\begin{document}" to base&".tex";
write "\thispagestyle{empty}" to base&".tex";
write "\noindent\includegraphics{" & jobname & "." &%
decimal(charcode) & "}" to base&".tex";
write "\end{document}" to base&".tex";
write EOF to base&".tex";
endgroup
enddef;
Iga joonise lõppu (vahetult ENNE endfig; käsku) paigutage järgmine kood:
numeric w,h; w := xpart urcorner bbox currentpicture -% xpart llcorner bbox currentpicture; h := ypart urcorner bbox currentpicture -% ypart llcorner bbox currentpicture; string base; base:=jobname&"_"&decimal(charcode); genereeri(w, h, base);
Tulemusena tekib lisaks failidele joonis.1, joonis.2 jne, ka failid joonis_1.tex, joonis_2.tex, mida saab kompileerida käsuga pdflatex. Sellega saadakse joonised PDF-failidena kujul joonis_1.pdf, joonis_2.pdf jne.
Võimalus 2. Arvutisse peab olema paigaldatud Perl.
Käsureal tuleb anda käskmptopdf fail.mp
Nende käskude tulemusena teostatakse enam-vähem samad operatsioonid, nagu "Võimalus 1" juures märgitud, automaatselt.
LaTeXi dokumendi koosseisu saab joonise tõmmata käsuga \includegraphics{joonis-1.pdf}
NB! LaTeXi koodi preambulasse on vaja paigutada \usepackage[pdftex]{graphicx}
NB! Kodutöö lahendamisel tuleb projekti koosseisu paigutada Metaposti lähtekood ning ükskõik millisel ülaltoodud meetodil saadud PDF.