Matemaatika ja statistika instituut
Logi sisse
  • English
  • Kursused
  • 2025/26 sügis
  • Matemaatilise teksti küljendamine (MTMM.00.328)

Matemaatilise teksti küljendamine 2025/26 sügis

  • Üldandmed
  • Korraldus
  • Praktikumid
  • Viited

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

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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 tekib joonis.5
  • muutujate tüübid:
    • numeric x; muutuja x tüübiks on reaalarv
    • pair A; muutuja A tüübiks on punkt
    • path p; muutuja p tüübiks on joon
  • x := 5; omistamine
  • A:=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,
      • cycle näitab, et algus- ja lõpp-punkt langevad kokku
    • fullcircle scaled (4cm) ringjoon läbimõõduga 4 cm
    • p shifted (1cm,-3cm) joon p nihutatud vektori (1cm,-3cm) võrra
    • p rotated 45 joon p pöö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 joone p
    • draw 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 punktis
    • label.top, label.bot, label.rt, label.lft, label.ulft jne teksti asukoht punkti suhtes
    • label.auto tekst pannakse punkti lähedale sinna, kus on tühja ruumi (vajab paketti labelauto)
      • circlabel.auto punkti 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 -- joone p (esimene) lõikepunkt joonega q
  • p cutbefore q -- joon, mis jääb alles p-st enne q-ga (esimest korda) lõikumist
  • p cutafter q -- joon, mis jääb alles p-st pärast q-ga (esimest korda) lõikumist
  • length p -- joone p viimase kontrollpunkti järjekorranumber
  • point 3 of p -- joone p kontrollpunkt nr 3 (esimene kontrollpunkt on numbriga 0)
  • subpath (0,2) of p -- joone p osa, mis jääb kontrollpunktide nr 0 ja 2 vahele
  • direction 0 of p -- joone p puutuja tõus kontrollpunktist nr 0 väljumisel
  • reverse p -- joon p tagurpidi, st. kontrollpunktid vastupidises järjestuses
  • p intersectiontimes q -- vektor, mille esimene koordinaat on lõikepunkti kontrollpunkt joonel p ja teine on lõikepunkti kontrollpunkt joonel q (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 joonmuutuja kujund 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äsk
mptopdf 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.

  • Matemaatika ja statistika instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.