metapost | |
---|---|
Clasa de limba | imperativ |
Aparut in | 1994 |
Autor | John Hobby |
Eliberare | 1.8 ( 17 iunie 2013 ) |
Versiune de testare | 2.0rc2 ( 19 februarie 2018 ) |
Tip sistem | implicit , dinamic , strict |
A fost influențat | METAFONT |
influențat | Asimptotă |
Licență | GNU LGPL |
Site-ul web | tug.org/metapost |
Fișiere media la Wikimedia Commons |
MetaPost este un interpret de limbaj de programare META care poate fi folosit pentru a crea ilustrații grafice. MetaPost a fost creat de John Hobbie în timp ce era student absolvent cu Donald Knuth . Sistemul de creare a fonturilor METAFONT [1] a fost luat ca bază .
La intrare, interpretului primește text în META, iar rezultatul este un fișier grafic în format PostScript [2] . Începând cu versiunea 1.200, MetaPost acceptă grafica SVG ca format de ieșire [3] .
Limbajul META, moștenit de la METAFONT, vă permite să operați pe obiecte geometrice, cum ar fi: un punct, o cale, o imagine și să efectuați diferite operații algebrice asupra acestora, cum ar fi deplasarea , rotația și alte transformări liniare .
Principalele diferențe dintre MetaPost și METAFONT, în afară de formatul de ieșire, sunt suportul de culoare și capacitatea de a insera text. Inserările de text sunt create cu TeX , astfel încât orice construcție care poate fi creată în TeX poate fi de asemenea inserată într-o imagine MetaPost. În plus, autorul MetaPost, John Hobby , a dezvoltat inițial biblioteca METAOBJ („metapost Objects”) pentru vizualizarea graficelor bidimensionale [4] [5] .
Interpretul MetaPost (executabil mpost) împreună cu bibliotecile macro standard sunt distribuite ca software open source , de obicei ca parte a distribuțiilor TeX.
Introducerea programului mpost este o „META-image”. O „imagine META” este un fișier text cu extensia .mp (denumit în continuare fișier mp pe scurt) cu instrucțiuni în limba META. Puteți stoca mai multe descrieri ale imaginilor într-un singur fișier mp. Compilarea cu mpost creează fișiere cu același nume ca fișierul sursă, dar cu extensii sub formă de numere, care sunt specificate în fișierul beginfig. Fișierele rezultate pot fi inserate imediat în texte LaTeX folosind obișnuitul \includegraphics. Pentru a face acest lucru, trebuie doar să adăugați comanda din pachetul graphicx LaTeX la antetul fișierului tex:
\DeclareGraphicsRule { * }{ eps }{ * }{}Ele diferă de fișierele eps „corecte” doar prin faptul că nu au fonturi „încorporate”, deci nu pot fi vizualizate fără procesare suplimentară.
Fonturile pot fi încorporate folosind programele latex și dvips cu rezultatul sub forma unui fișier eps sau scriptul mptopdf cu rezultatul sub forma unui fișier pdf. Aceste imagini pot fi deja utilizate independent de orice program care acceptă aceste formate vectoriale.
Puteți încorpora doar chirilic în etichetele MetaPost folosind LaTeX. Pentru a face acest lucru, fișierul mp ar trebui să aibă ceva de genul următor antet:
verbatimtex \documentclass [12pt] { minim } %simple chirilic \usepackage [koi8-r] { inputenc } \usepackage [english, Russian] { babel } \begin { document } etex;Acest titlu va fi folosit de fiecare dată când MetaPost ajunge la textul dintre etichetele btexși etex. Dacă o etichetă necesită un pachet LaTeX, atunci, în consecință, trebuie să adăugați acest pachet la antet în mod standard.
Pentru ca latexul să fie folosit la crearea unei inscripții , interpretul mpost trebuie pornit cu opțiunea -tex=latex . Dacă această opțiune nu este prezentă, atunci mpost caută informații despre ce să ruleze în variabila de mediu TEX . În mod implicit, tex este rulat în loc de latex .
Dacă variabila este definită în text prologues, atunci trebuie să fie egală cu 0. În acest caz, toate fonturile necesare sunt „atașate” imaginii în momentul în care sunt create fișierele eps și pdf.
Titlul este urmat de descrieri ale imaginilor. Fiecare imagine este inclusă între comenzi beginfigși endfig. beginfigNumărul de index al imaginii este specificat ca parametru . La compilare, acest număr va fi adăugat la imagine ca extensie. Exemplu:
%Math HelloWorld beginfig(3) ; pentru alfa:=90 pas -9 până la 0: label(btex \( f ( x )= \frac { 1 }{ \sqrt { 2 \pi } \,\sigma } \int\limits _{ - \infty }^{ \infty } e^{ - \frac {x^ 2 }{ 2 \sigma ^ 2 }}dx \) etex scalat (5*(1-alfa/100)) alfa rotit,(0,0)) cuculoare(max(1-alfa/45,0)*roșu+min(alfa/45,2-alfa/45)*verde+max(alfa/45-1,0)*albastru); endfor; endfig ;Fișierul trebuie să se încheie cu comanda end.sau bye. Aceste comenzi îi spun interpretului mpost că procesarea este completă.
Pentru a automatiza obținerea de imagini folosind MetaPost, puteți folosi următorul Makefile :
# fișier temporar tmp_file := tmp_file #programs LATEX : = latex MPOST := mpost -tex = latex DVIPS := dvips MPTOPDF := mptopdf MV := mv all : @echo "run: make mpfile.n.[eps|pdf] - unde n este numărul imaginii" %.eps : % @echo „\documentclass[12pt]{minimal}” > $( tmp_file ) .tex @echo „\usepackage[koi8-r]{inputenc}” >> $( tmp_file ) .tex @echo „\usepackage[engleză, rusă]{babel}” >> $( tmp_file ) .tex @echo "\usepackage{graphicx}" >> $( tmp_file ) .tex @echo „\DeclareGraphicsRule{*}{eps}{*}{}” >> $( tmp_file ) .tex @echo "\nofiles" >> $( tmp_file ) .tex @echo „\begin{document}” >> $( tmp_file ) .tex @echo „\thispagestyle{gold}” >> $( tmp_file ) .tex @echo "\includegraphics{ $( nume de bază $@ ) }" >> $( tmp_file ) .tex @echo „\end{document}” >> $( tmp_file ) .tex @ $( LATEX ) $( tmp_file ) @ $( DVIPS ) -E -o $@ $( tmp_file ) @rm $( tmp_file ) .* %.pdf : % @ $( MPTOPDF ) $< @ $( MV ) ` echo $< | sed -e "s/\.\([0-9]\+\) $$ /-\1.pdf/" ` $<.pdf clean : @rm -f mpx* *~ *.log *.mpx @rm -f $( tmp_file ) .* #Dependențe pentru imaginile mpost. #Unul pentru fiecare număr din beginfig %.1 : %. mp $( MPOST ) $< … %.64 : %. mp $( MPOST ) $<Pentru a obține o imagine eps gata făcută cu fonturi deja „încorporate” la ieșire, care pot fi inserate oriunde, rulați următoarea comandă:
face <mp-file name>.<image number>. [ eps | pdf ]De obicei, fișierele mp primesc nume scurte.
Alternativ, există un script shell ( mp2pdf.sh ) care face aproape același lucru. Se presupune că va fi folosit GNU/Linux (sau sistemul de operare similar).
Scriptul pentru fiecare beginfig(n)-bloc va crea fișiere filen.eps și filen.pdf , unde fișier este numele fișierului MetaPost original, n este numărul blocului. Scriptul prevede plasarea fișierelor primite în directoare separate. Numele catalogului sunt date de variabilele EPS_DIR și PDF_DIR. Dacă directoarele cu astfel de nume nu există, scriptul le creează automat.
#!/bin/sh # Script pentru a transforma fișierul MetaPost în desene EPS și PDF # directoare pentru stocarea fișierelor eps și pdf EPS_DIR = ./eps PDF_DIR = ./pdf TMP_FILE = tmp dacă [[ " $@ " == "" ]] ; apoi echo echo Scriptul procesează fișierul mp, creează fișiere eps și pdf și echo le mută în directoarele $EPS_DIR și , respectiv, $PDF_DIR echo Utilizare: ./mp2pdf.sh fișier.mp echo ieșire fi dacă [ ! -d $EPS_DIR ] ; apoi echo ======== Creați director pentru fișierele eps mkdir $EPS_DIR fi if [ ! -d $PDF_DIR ] ; apoi echo ======== Creați director pentru fișierele pdf mkdir $PDF_DIR fi echo ======== Fișier sursă: $@ list = ` grep beginfig $1 | sed -e 's/beginfig(//' -e 's/);//' ` echo ======== Lista blocată: $listă echo ======== Rulează mpost... mpost -tex = latex $1 pentru i în $list # buclă peste blocuri beginfig() do epsi = ${ 1 %mp } $i eps = ${ 1 %.mp }${ i } .eps pdf = ${ 1 %.mp }${ i } .pdf echo Block ${ i } : ' >> ' $epsi ' >> ' $eps ' >> ' $pdf dacă [ ! -e $epsi ] ; apoi echo echo Erori la procesarea fișierului mp! echo exit else echo ======== MetaPost ===== Ok! fi echo ======== Se generează un fișier LaTeX temporar... echo \\ documentclass [ 12pt ]{ articol } > ${ TMP_FILE } .tex echo \\ usepackage { mathtext } >> ${ TMP_FILE } .tex echo \\ usepackage { amsmath } >> ${ TMP_FILE } .tex echo \\ usepackage [ T2A ]{ fontenc } >> ${ TMP_FILE } .tex echo \\ usepackage [ koi8-r ]{ inputenc } >> ${ TMP_FILE } .tex echo \\ usepackage [ engleză, rusă ]{ babel } >> ${ TMP_FILE } .tex echo \\ usepackage { graphics } >> ${ TMP_FILE } .tex echo \\ begin { document } >> ${ TMP_FILE } .tex echo \\ pagestyle { empty } >> ${ TMP_FILE } .tex echo \\ includegraphics { ${ epsi } } >> ${ TMP_FILE } .tex echo \\ end { document } >> ${ TMP_FILE } .tex echo ======== Se lansează LaTeX... latex ${ TMP_FILE } dacă [ ! -e ${ TMP_FILE } .dvi ] ; apoi echo echo ======== Nu a fost găsit niciun fișier dvi! echo exit else echo ======== LaTeX ===== Ok! fi echo ======== Se rulează dvips... dvips -E ${ TMP_FILE } -o $eps echo ======== Se rulează epstopdf... epstopdf $eps dacă [[ -e $pdf ]] ; apoi mv $eps $EPS_DIR mv $pdf $PDF_DIR echo ======== Mutați $eps și $pdf în locul potrivit... fi echo ======== Curățare... rm *.log *.mpx ${ TMP_FILE } .* *.aux *.dvi *.tex $ epsi 2 >>/dev/null TerminatScriptul trebuie să fie executabil:
chmod +x ./mp2pdf.shUtilizare:
./mp2pdf.sh fișier.mpExemplu de fișier MetaPost pentru testare:
Șablon %% pentru fișiere mp prologuri:=0; %LaTeX; funcționează împreună cu „mpost -tex=latex file.mp” (vezi scriptul de mai sus) verbatimtex \documentclass [12pt] { articol } \usepackage { mathtext } \usepackage { amsmath } \usepackage [T2A] { fontenc } \usepackage [koi8 - r] { inputenc } \usepackage [engleză, rusă] { babel } \begin { document } etex; beginfig(1); trage (0,0)--(0,100)--(100,100)--(100,0)--ciclu; label(btex Label: $ \alpha _ 1 $ etex, (50,50)); endfig; Sfârşit.Ca limbaj de bază, ale cărui instrucțiuni sunt introduse la intrarea programului MetaPost, este folosit limbajul META [6] .
În MetaPost, puteți opera cu următoarele tipuri de date:
Numele variabilelor din META pot consta din mai multe jetoane. Jetoanele pot fi fie alfabetice, fie numerice. De exemplu, o variabilă x1lconstă din trei jetoane. Poate fi rescris într-un mod mai ușor de înțeles x[1].l, adică simbolul numeric indică în esență numărul elementului din matrice, iar litera care urmează specifică elementul structurii. Abilitatea de a omite „[]”. în scrierea numelor de variabile, în unele cazuri simplifică percepția codului (de exemplu, aceasta este coordonata x a limitei liniei din stânga în direcția de mișcare pentru primul punct al traseului ) și reduce volumul de programul. În schimb, dacă aveți nevoie doar de variabile fără astfel de caracteristici, atunci va trebui să vă limitați doar la combinații de litere. z[]
Toate variabilele trebuie declarate înainte de utilizare. Excepție fac variabilele de tip numeric. Matricele sunt declarate și utilizate în felul următor:
pereche[]; w1:=(10,5); w2:=w1;Interacțiunea variabilelor, numerelor și operatorilor este destul de naturală, dar mai degrabă netrivială. Această descriere merită o secțiune separată. În orice caz, ar trebui să respectați regula: dacă aveți îndoieli, puneți parantezele în locurile potrivite.
În META, puteți omite unii dintre operatori pentru a scurta intrările, cum ar fi 2*xintrarea potriviri 2x. În același timp 1/2x , acest lucru 0.5xeste mai firesc din punct de vedere al matematicii, dar nu al programării. În META, jetoanele numerice sunt procesate mai întâi.
Setul de operații standard de calcul a fost extins pentru a ține cont de specializarea limbajului. În special, operațiile suportate sunt adunarea pitagoreică, scăderea pitagoreică , împărțirea întregilor și exponențiarea . div
Limbajul conține operatori de buclă, salturi condiționate și altele asemenea. O caracteristică distinctivă a META este capacitatea de a rezolva sisteme de ecuații liniare. De exemplu, o expresie ca , înseamnă că punctul C se află exact la mijloc între punctele A și B.
Programul mpost poate fi folosit în modul calculator pentru calcule în limbajul META. Acest lucru vă permite să verificați dacă presupunerile dvs. despre limbă sunt corecte. Un exemplu de sesiune este prezentat mai jos:
baldin@evgueni:~$ mpost Acesta este MetaPost, versiunea 0.901 (Web2C 7.5.5) **\Relaxați-vă *a:=10; *b:=8; *c:=a+-+b; *arata c; >> 6 *arată(3-sqrt 5)/2; >> 0,38197 *arată unghi (1,sqrt 3); >> 60,00008 *arata 2**10; >> 1024,00003 *arată infinitul; >> 4095,99998 *arată epsilon; >> 0,00002 *arata infinit-infinit; >> 0 *Sfârşit Transcriere scrisă pe mput.log.După ce **se afișează solicitarea, tastați comanda \relax. Apoi, puteți introduce comenzile MetaPost. Acest lucru trebuie făcut cu atenție, deoarece acest mod nu acceptă „istoricul comenzilor”. La început, nu sa presupus că MetaPost ar putea fi folosit și în acest fel. Cu ajutorul comenzii show, puteți afișa rezultatul pe ecran. Puteți încheia o sesiune cu comanda end. Vă rugăm să rețineți că atunci când a fost solicitat să afișați infinitul ( infinity), MetaPost a returnat 4095.99998 - aceasta este valoarea maximă pe care o poate lua o variabilă de tip numeric. Mai mult, în timpul calculului, rezultatul poate depăși „infinitul”, dar răspunsul trebuie să fie mai mic sau egal cu acesta, altfel va fi generată o eroare. Pasul minim de schimbare a tipului numericeste epsilon, sau mai precis, 1/256/256. La crearea unui desen, aceste restricții nu sunt semnificative, deoarece gama de numere este destul de mare pentru a găzdui toate elementele. Dar, în orice caz, trebuie luat în considerare și acest lucru.
Dacă trebuie să evaluați o expresie cu o singură linie, atunci la solicitarea inițială **puteți introduce expr. În acest caz, mpost citește fișierul expr.mf și va fi emis un răspuns pentru orice acțiune:
baldin@evgueni:~$ mpost Acesta este MetaPost, versiunea 0.901 (Web2C 7.5.5) **expr (/usr/local/texlive/2005/texmf-dist/metafont/base/expr.mf da-mi o expresie: 2(a+3b)-2b >> 4b+2a da-mi o expresie: 1/3[a,b] >> 0,33333b+0,66667aSigla MetaPost pe Wikipedia.
Model de broasca testoasa. Un exemplu de utilizare a obiectului imagine.
Triunghiul lui Pascal . Un exemplu de inserare a textului.
Traiectorii punctelor de pe o roată în timpul mișcării înainte fără alunecare. Un exemplu de utilizare a unui ciclu .
Un exemplu de utilizare a transformărilor liniare.
Numărul de postări pe LOR din numărul lunii din an. Un exemplu de diagramă simplă.
modele fractale. Exemplu de recursivitate .
Distribuția materiei în Univers. Exemplu de diagramă circulară
Codul pentru fiecare exemplu este dat în descrierea imaginii corespunzătoare.
MetaPost are o serie de limitări moștenite de la METAFONT. O încercare de a ocoli aceste limitări a stat la baza creării interpretului software Asymptote [7] . Limbajul folosit de Asymptote este similar cu META, dar din cauza trecerii de la sintaxa limbajului macro la sintaxa C++ , este mult mai verbos și complex. Principalul avantaj al Asymptote este un suport mai bun pentru funcțiile PostScript .
Functional MetaPost este un DSL grafic integrat în Haskell care generează codul MetaPost. [opt]
METAGRAF este o interfață grafică peste MetaPost. Scris în Java . Similar ca caracteristici cu xfig . Imaginile sunt salvate în format MetaPost. [9]
Printre mediul software LaTeX, pachetele PSTricks și PGF/TikZ au, de asemenea, funcționalități similare cu MetaPost .
Pe baza software-ului MetaPost, instrumentul METATYPE1 a fost creat pentru dezvoltarea fonturilor Type1.
Tipografie gratuită | |
---|---|
Căști cu sistem de operare |
|
Alte căști |
|
Software |
|
Licențe |
|
Grupuri și oameni |
|
|
Τ Ε Χ | |
---|---|
Pachete macro | |
Motoare alternative Τ Ε Χ | |
distribuţiile | |
Comunitate |
|
Diverse |
|