Metapost

metapost
Nyelvóra parancsoló
Megjelent 1994
Szerző John Hobby
Kiadás 1,8 ( 2013. június 17. )
Teszt verzió 2.0rc2 ( 2018. február 19. )
Típusrendszer implicit , dinamikus , szigorú
Befolyásolva METAFONT
befolyásolta Aszimptota
Engedély GNU LGPL
Weboldal tug.org/metapost
 Médiafájlok a Wikimedia Commons oldalon

A MetaPost  egy META programozási nyelv értelmező , amellyel grafikus illusztrációkat lehet készíteni. A MetaPost John Hobbie hozta létre, amikor Donald Knuth végzős hallgatója volt . A METAFONT [1] betűtípus-készítő rendszert vették alapul .

A bemeneten az interpreter META-ban szöveget kap, a kimenet pedig egy PostScript formátumú grafikus fájl [2] . Az 1.200-as verziótól kezdve a MetaPost támogatja az SVG grafikát kimeneti formátumként [3] .

A METAFONT-tól örökölt META nyelv lehetővé teszi geometriai objektumok, például pontok, útvonalak, képek kezelését, és különféle algebrai műveletek végrehajtását, például eltolást , elforgatást és egyéb lineáris transzformációkat .

A fő különbség a MetaPost és a METAFONT között a kimeneti formátumon kívül a színtámogatás és a szöveg beszúrási lehetősége. A szövegbeszúrások a TeX-szel készülnek , így minden TeX -ben létrehozható konstrukció beilleszthető egy MetaPost képbe is. Ezenkívül a MetaPost szerzője, John Hobby eredetileg a METAOBJ („metapost Objects”) könyvtárat fejlesztette ki kétdimenziós gráfok megjelenítésére [4] [5] .

A MetaPost értelmező (futtatható mpost) a szabványos makrókönyvtárakkal együtt nyílt forráskódú szoftverként kerül terjesztésre , általában a TeX disztribúciók részeként.

MetaPost pipeline

Az mpost program bemenete egy "META-kép". A "META kép" egy .mp kiterjesztésű szövegfájl (a továbbiakban röviden mp fájl), amely META nyelvű utasításokat tartalmaz. Egy mp-fájlban több képleírást is tárolhat. Az mpost segítségével a forrásfájllal megegyező nevű, de számok formájú kiterjesztésű fájlok jönnek létre, amelyeket a beginfig. Az így kapott fájlok a szokásos módon azonnal beilleszthetők a LaTeX szövegekbe \includegraphics. Ehhez adja hozzá a graphicx LaTeX csomag parancsát a tex fájl fejlécéhez:

\DeclareGraphicsRule { * }{ eps }{ * }{}

Csak abban különböznek a "helyes" eps-fájloktól, hogy nincsenek "beágyazott" betűtípusok, így további feldolgozás nélkül nem tekinthetők meg.

Betűtípusok beágyazhatók a latex és dvips programokkal , az eredmény eps fájl formájában vagy az mptopdf szkript , az eredmény pedig pdf fájl formájában. Ezeket a képeket már önállóan használhatja minden olyan program, amely támogatja ezeket a vektorformátumokat.

Cirill és MetaPost

A cirill betűt csak a LaTeX használatával ágyazhatja be a MetaPost címkékbe. Ehhez az mp-fájlnak a következő fejléchez hasonlónak kell lennie:

verbatimtex \documentclass [12pt] { minimális } %egyszerű cirill \usepackage [koi8-r] { inputenc } \usepackage [english,orosz] { babel } \begin { document } etex;

Ez a címsor minden alkalommal használatos, amikor a MetaPost eléri a btexés a címkék közötti szöveget etex. Ha egy címke LaTeX csomagot igényel, akkor ennek megfelelően ezt a csomagot a szokásos módon hozzá kell adnia a fejléchez.

Ahhoz, hogy a latexet használni lehessen egy felirat létrehozásakor , az mpost értelmezőt a -tex=latex paraméterrel kell elindítani . Ha ez az opció nincs jelen, akkor az mpost információkat keres arról, hogy mit kell futtatni a TEX környezeti változóban . Alapértelmezés szerint a tex fut a latex helyett .

Ha a változó a szövegben van definiálva prologues, akkor 0-val kell egyenlőnek lennie. Ebben az esetben az eps és pdf fájlok létrehozásakor az összes szükséges betűtípus „csatolódik” a képhez.

Egy mp-fájl szerkezete

A címet a képek leírása követi. beginfigMinden kép a és a parancsok közé van zárva endfig. beginfigA kép indexszáma paraméterként van megadva. Összeállításkor ez a szám kiterjesztésként kerül a képre. Példa:

Matek HelloWorld beginfig(3) ; alfa esetén:=90 lépés -9-től 0-ig: label(btex \( f ( x )= \frac { 1 }{ \sqrt { 2 \pi } \,\sigma } \int\limits _{ - \infty }^{ \infty } e^{ - \frac {x^ 2 }{ 2 \sigma ^ 2 }}dx \) etex skálázott (5*(1-alpha/100)) elforgatott alfa,(0,0)) színnel(max(1-alfa/45.0)*piros+min(alfa/45.2-alfa/45)*zöld+max(alfa/45-1.0)*kék); endfor; endfig ;

end.A fájlnak a vagy paranccsal kell végződnie bye. Ezek a parancsok jelzik az mpost interpreternek , hogy a feldolgozás befejeződött.

Automatizálás

A MetaPost segítségével történő képek lekérésének automatizálásához a következő Makefile -t használhatja :

#ideiglenes fájl tmp_file := tmp_file #programok LATEX : = latex MPOST := mpost -tex = latex DVIPS := dvips MPTOPDF := mptopdf MV := mv all : @echo "run: make mpfile.n.[eps|pdf] - ahol n a kép száma" %.eps :  % @echo "\documentclass[12pt]{minimal}" > $( tmp_file ) .tex @echo "\usepackage[koi8-r]{inputenc}" >> $( tmp_file ) .tex @echo "\usepackage[english,russian]{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{empty}" >> $( tmp_file ) .tex @echo "\includegraphics{ $( alapnév $@ ) }" >> $( 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 tiszta : @rm -f mpx* *~ *.log *.mpx @rm -f $( tmp_file ) .* #Mpost képek függőségei. #Egy minden számhoz a beginfig %.1 -ben : %. mp $( MPOST ) $< … %.64 : %. mp $( MPOST ) $<

Ha kész eps-képet szeretne kapni a kimeneten már „beágyazott” betűtípusokkal, amely bárhová beszúrható, csak futtassa a következő parancsot:

make <mp-fájl neve>.<képszám>. [ eps | pdf ]

Az mp-fájlok általában rövid neveket kapnak.

Alternatív megoldásként létezik egy shell script ( mp2pdf.sh ), amely majdnem ugyanazt teszi. GNU/Linuxot (vagy hasonló operációs rendszert) kell használni.

Az egyes -blokkok szkriptje a filen.eps és filen.pdfbeginfig(n) fájlokat hozza létre , ahol a fájl  az eredeti MetaPost fájl neve, n  pedig a blokk száma. A szkript biztosítja a fogadott fájlok külön könyvtárakba helyezését. A katalógusneveket az EPS_DIR és a PDF_DIR változók adják. Ha nem léteznek ilyen nevű könyvtárak, a szkript automatikusan létrehozza azokat.

#!/bin/sh # Szkript a MetaPost fájl EPS és PDF rajzokká alakításához # könyvtár az eps és pdf fájlok tárolására EPS_DIR = ./eps PDF_DIR = ./pdf TMP_FILE = tmp if [[ " $@ " == "" ]] ; majd az echo echo Script feldolgozza az mp fájlt, eps és pdf fájlokat hoz létre, majd az echo áthelyezi őket a $EPS_DIR és $PDF_DIR könyvtárakba echo Használat: ./mp2pdf.sh file.mp echo exit fi ha [  ! -d $EPS_DIR ] ; majd echo ======== Könyvtár létrehozása az eps fájlokhoz mkdir $EPS_DIR fi if [  ! -d $PDF_DIR ] ; majd echo ======== Könyvtár létrehozása a pdf fájlok számára mkdir $PDF_DIR fi echo ======== Forrásfájl: $@ lista = ` grep beginfig $1 | sed -e 's/beginfig(//' -e 's/);//' ` echo ======== Blokklista : $lista echo ======== Mpost fut... mpost -tex = latex $1 for i in $list # loop over blocks beginfig() do epsi = ${ 1 %mp } $i eps = ${ 1 %.mp }${ i } .eps pdf = ${ 1 %.mp }${ i } .pdf echo blokk ${ i } : ' >> ' $epsi ' >> ' $eps ' >> ' $pdf ha [  ! -e $epsi ] ; akkor echo echo Hibák az mp-fájl feldolgozása közben! echo kilépés else echo ======== MetaPost ===== Ok! fi echo ======== Ideiglenes LaTeX fájl létrehozása... echo \\ documentclass [ 12pt ]{ cikk } > ${ 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_FI .tex echo \\ usepackage [ angol, orosz ]{ babel } >> ${ TMP_FILE } .tex echo \\ usepackage { graphics } >> ${ TMP_FILE } .tex echo \\ begin { document } >> ${ TMP_FILE } .tex echo \\ pagestyle { üres } >> ${ TMP_FILE } .tex echo \\ includegraphics { ${ epsi } } >> ${ TMP_FILE } .tex echo \\ end { document } >> ${ TMP_FILE } .tex echo ======== LaTeX indítása... latex ${ TMP_FILE } ha [  ! -e ${ TMP_FILE } .dvi ] ; then echo echo ======== Nem található dvi fájl! echo kilépés else echo ======== LaTeX ===== Ok! fi echo ======== Dvips futtatása... dvips -E ${ TMP_FILE } -o $eps echo ======== Az epstopdf futtatása... epstopdf $eps if [[ -e $pdf ]] ; majd mv $eps $EPS_DIR mv $pdf $PDF_DIR echo ======== Helyezze át a $eps -t és a $pdf -et a megfelelő helyre... fi echo ======== Tisztítás... rm *.log *.mpx ${ TMP_FILE } .* *.aux *.dvi *.tex $ epsi 2 >>/dev/null Kész

A szkriptet futtathatóvá kell tenni:

chmod +x ./mp2pdf.sh

Használat:

./mp2pdf.sh fájl.mp

Minta MetaPost fájl teszteléshez:

%% Sablon mp fájlokhoz prológok:=0; %Latex; együtt működik a következővel: "mpost -tex=latex file.mp" (lásd fentebb a szkriptet) verbatimtex \documentclass [12pt] { cikk } \usepackage { mathtext } \usepackage { amsmath } \usepackage [T2A] { fontenc } \usepackage [koi8 - r] { inputenc } \usepackage [angol, orosz] { babel } \begin { document } etex; beginfig(1); húzó (0,0)-(0,100)-(100,100)-(100,0)-ciklus; label(btex Címke: $ \alpha _ 1 $ etex, (50,50)); endfig; vége.

META nyelv

Alapnyelvként, amelynek utasításait a MetaPost program bemenetére tápláljuk, a META nyelvet [6] használjuk .

A MetaPostban a következő adattípusokkal dolgozhat:

  • logikai – logikai (igaz/hamis)
  • numerikus - közönséges számok
  • toll (toll) - amivel a számítógép rajzol (a legtöbb esetben kerek tollat ​​használnak pencircle)
  • pár (pont) - egy számpár (x, y) derékszögű koordináták esetén vagy R * dir (α) poláris koordináták esetén
  • útvonal (útvonal) - pontok halmaza a köztük lévő kapcsolatok típusának leírásával
  • szín (szín) - a számok hármasa (r, g, b) megfelel az RGB színmodellnek
  • kép (kép) - utak és pontok gyűjteménye
  • karakterlánc (karakterlánc) - ASCII karakterlánc,
  • pairtranszformáció (lineáris transzformációk) - lineáris transzformációk, amelyek a , penés típusú objektumokra pathalkalmazhatók picture.

A META-ban lévő változónevek több tokenből is állhatnak. A tokenek lehetnek alfabetikusak vagy numerikusak. Például egy változó x1lhárom tokenből áll. Átírható érthetőbben is x[1].l, vagyis a numerikus token lényegében a tömb elemének számát, az azt követő betű pedig a szerkezet elemét adja meg. Lehetőség a „[]” kihagyására. változónevek írásakor bizonyos esetekben leegyszerűsíti a kód érzékelését (például  ez a bal oldali vonalhatár x-koordinátája a mozgás irányában az út első pontjára ) és csökkenti a A program. Ehelyett, ha csak ilyen jellemzők nélküli változókra van szüksége, akkor csak betűkombinációkra kell korlátoznia magát. z[]

Használat előtt minden változót deklarálni kell. A kivétel a típusú változók numeric. A tömbök deklarálása és felhasználása a következő módon történik:

pairw[]; w1:=(10,5); w2:=w1;

A változók, számok és operátorok kölcsönhatása teljesen természetes, de nem triviális. Ez a leírás külön fejezetet érdemel. Mindenesetre kövesse a szabályt: ha kétségei vannak, tegye a zárójeleket a megfelelő helyre.

A META-ban kihagyhat néhány operátort a bejegyzések lerövidítésére, például 2*xmegfeleltetheti a bejegyzést 2x. Ugyanakkor a matematika szempontjából 1/2x ez a természetesebb, de a programozás szempontjából nem. 0.5xA META-ban először a numerikus tokeneket dolgozzák fel.

A szabványos számítási műveletek készlete a nyelv specializációjának figyelembevételével bővült. A támogatott műveletek különösen a Pitagorasz-összeadás , a Pitagorasz-kivonás , az egész számok osztása és a hatványozás . div

A nyelv ciklusoperátorokat, feltételes ugrásokat és hasonlókat tartalmaz. A META megkülönböztető jellemzője a lineáris egyenletrendszerek megoldásának képessége. Például egy olyan kifejezés, mint a , azt jelenti, hogy a C pont pontosan az A és B pontok közepén van.

Az mpost program számológép módban használható META nyelvű számításokhoz. Ez lehetővé teszi annak ellenőrzését, hogy helyesek-e a nyelvre vonatkozó feltételezései. Az alábbiakban egy példa munkamenet látható:

baldin@evgueni:~$ mpost Ez a MetaPost, 0.901-es verzió (Web2C 7.5.5) **\nyugodj *a:=10; *b:=8; *c:=a+-+b; *c show; >> 6 *show(3-sqrt 5)/2; >> 0,38197 *szög megjelenítése (1, 3 négyzet); >> 60.00008 *műsor 2**10; >> 1024.00003 *mutassa a végtelent; >> 4095.99998 *show epszilon; >> 0,00002 *végtelen-végtelen megjelenítése; >> 0 *vége Az mpout.log oldalon írt átirat.

A prompt **megjelenése után írja be a parancsot \relax. Ezután beírhatja a MetaPost parancsokat. Ezt óvatosan kell megtenni, mivel ez a mód nem támogatja a "parancselőzményeket". Kezdetben nem feltételezték, hogy a MetaPost is így használható. A parancs showsegítségével megjelenítheti a képernyőn az eredményt. A munkamenetet a paranccsal fejezheti be end. Kérjük, vegye figyelembe, hogy amikor a végtelenség ( infinity) megjelenítésére kérik, a MetaPost 4095.99998-at adott vissza – ez a maximális érték, amelyet egy típusú változó felvehet numeric. Sőt, a számítás során az eredmény meghaladhatja a "végtelent", de a válasznak kisebbnek vagy egyenlőnek kell lennie vele, különben hiba keletkezik. A minimális típusváltoztatási lépés numeric, epsilonpontosabban 1/256/256. Rajzkészítéskor ezek a korlátozások nem jelentősek, mivel a számok tartománya elég nagy ahhoz, hogy minden elemet elférjen. De mindenesetre ezt is figyelembe kell venni.

Ha egysoros kifejezést kell kiértékelnie, akkor a kezdeti promptban **megadhatja a következőt expr: Ebben az esetben az mpost beolvassa az expr.mf fájlt , és minden műveletre választ ad:

baldin@evgueni:~$ mpost Ez a MetaPost, 0.901-es verzió (Web2C 7.5.5) **expr (/usr/local/texlive/2005/texmf-dist/metafont/base/expr.mf gimme an expr: 2(a+3b)-2b >> 4b+2a add meg a kifejezést: 1/3[a,b] >> 0,33333b+0,66667a

Példák

Az egyes példák kódja a megfelelő kép leírásában található.

Analógok

A MetaPostnak számos korlátozása van, amelyeket a METAFONT örökölt. E korlátok megkerülésére tett kísérlet adta az alapot az Asymptote szoftver értelmező létrehozásához [7] . Az Asymptote által használt nyelv hasonló a META-hoz, de a makró nyelvi szintaxisról a C++ szintaxisra való áttérés miatt sokkal bőbeszédűbb és összetettebb. Az Asymptote fő előnye a PostScript -funkciók jobb támogatása .

A Functional MetaPost  a Haskellbe épített grafikus DSL , amely MetaPost kódot generál. [nyolc]

A METAGRAF  egy grafikus felület a MetaPost felett. Java nyelven írva . Funkcióiban hasonló az xfig -hez . A képek MetaPost formátumban kerülnek mentésre. [9]

A LaTeX szoftverkörnyezet közül a PSTricks és a PGF/TikZ csomagok is hasonló funkciókkal rendelkeznek, mint a MetaPost .

A MetaPost szoftverbázisra alapozva a METATYPE1 eszközt hozták létre Type1 betűtípusok fejlesztésére.

Jegyzetek

  1. John D. Hobby, A METAFONT-szerű rendszer PostScript kimenettel, Tugboat, a TeX User's Group Newsletter, 10(4), 1989. (holt link) . Letöltve: 2011. január 4. Az eredetiből archiválva : 2012. május 15. 
  2. John D. Hobby, Introduction to MetaPost, Proceedings of EuroTeX '92, 1992. Archiválva : 2012. május 15. a Wayback Machine -nél A MetaPost egy képrajzoló nyelv, amely nagyon hasonlít a METAFONT-hoz, kivéve PostScript kimenettel. A nyelv hozzáférést biztosít az 1. szintű PostScript® összes főbb funkciójához, és lehetőséget biztosít a grafikák és a szedett szöveg integrálására.
  3. MetaPost 1.200 bejelentés . Hozzáférés dátuma: 2011. január 4. Az eredetiből archiválva : 2014. szeptember 5..
  4. John D. Hobby, Grafikonok rajzolása MetaPosttal, AT&T Bell Laboratories Computing Science Technical Report 164, 1992. (a hivatkozás nem elérhető) . Letöltve: 2011. január 4. Az eredetiből archiválva : 2012. május 15. 
  5. https://ctan.altspu.ru/graphics/metapost/contrib/macros/metaobj/doc/momanual.pdf
  6. E.M. Baldin Bevezetés a MetaPostba archiválva 2016. szeptember 4-én a Wayback Machine -en // Linux Format 76 (2006. február)
  7. Aszimptota: Egy vektorgrafikus nyelv John C. Bowman és Andy Hammerlindl, TUGBOAT: The Communications of the TeX Users Group, 29:2, 288-294 (2008). . Hozzáférés dátuma: 2011. január 4. Az eredetiből archiválva : 2011. július 17.
  8. Funkcionális MetaPost (downlink) . Letöltve: 2006. szeptember 3. Az eredetiből archiválva : 2008. november 13.. 
  9. METAGRAPH . Letöltve: 2006. szeptember 3. Az eredetiből archiválva : 2006. augusztus 31..

Linkek

Irodalom

  • Donald Knuth . Minden a METAFONT-ról = The METAFONTbook. - M .: Williams , 2003. - 384 p. — ISBN 5-8459-0442-0 .
  • M. Goossens, S. Ratz, F. Mittelbach. Útmutató a LaTeX csomagokhoz és grafikus bővítményeihez = The LaTeX Graphics Companion. — M .: Mir, 2002. — 621 p. — ISBN 5-03-003388-2 .