Metapost

metapost
Språkklass nödvändigt
Framträdde i 1994
Författare John Hobby
Släpp 1,8 ( 17 juni 2013 )
Testversion 2.0rc2 ( 19 februari 2018 )
Typ system implicit , dynamisk , strikt
Blivit påverkad METAFONT
påverkas Asymptot
Licens GNU LGPL
Hemsida tug.org/metapost
 Mediafiler på Wikimedia Commons

MetaPost  är en META programmeringsspråkstolk som kan användas för att skapa grafiska illustrationer. MetaPost skapades av John Hobbie medan han var doktorand hos Donald Knuth . Systemet för att skapa teckensnitt för METAFONT [1] togs som grund .

Vid ingången får tolken text i META, och utdata är en grafisk fil i PostScript -format [2] . Från och med version 1.200 stöder MetaPost SVG -grafik som utdataformat [3] .

META-språket, som är ärvt från METAFONT, låter dig arbeta på geometriska objekt, såsom: en punkt, en bana, en bild, och utföra olika algebraiska operationer på dem, såsom skift , rotation och andra linjära transformationer .

De största skillnaderna mellan MetaPost och METAFONT, förutom utdataformatet, är färgstöd och möjligheten att infoga text. Textinlägg skapas med TeX , så alla konstruktioner som kan skapas i TeX kan också infogas i en MetaPost-bild. Dessutom utvecklade MetaPost-författaren John Hobby ursprungligen METAOBJ-biblioteket (“metapost-objekt”) för att visualisera tvådimensionella grafer [4] [5] .

MetaPost-tolken (mpost körbar) tillsammans med vanliga makrobibliotek distribueras som programvara med öppen källkod , vanligtvis som en del av TeX-distributioner.

MetaPost pipeline

Ingången till mpost- programmet är en "META-bild". En "META-bild" är en textfil med filtillägget .mp (nedan kallat en mp-fil förkortat) med instruktioner på META-språket. Du kan lagra flera beskrivningar av bilder i en mp-fil. Genom att kompilera med mpost skapas filer med samma namn som källfilen, men med tillägg i form av siffror, som anges i beginfig. De resulterande filerna kan omedelbart infogas i LaTeX-texter med den vanliga \includegraphics. För att göra detta, lägg bara till kommandot från graphicx LaTeX-paketet till rubriken på tex-filen:

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

De skiljer sig från de "korrekta" eps-filerna endast genom att de inte har "inbäddade" typsnitt, så de kan inte ses utan ytterligare bearbetning.

Teckensnitt kan bäddas in med hjälp av latex- och dvips- programmen med resultatet i form av en eps-fil eller mptopdf- skriptet med resultatet i form av en pdf-fil. Dessa bilder kan redan användas oberoende av alla program som stöder dessa vektorformat.

Kyrilliska och MetaPost

Du kan bara bädda in kyrilliska i MetaPost-taggar med LaTeX. För att göra detta bör mp-filen ha något i stil med följande rubrik:

verbatimtex \documentclass [12pt] { minimal } %enkel kyrillisk \usepackage [koi8-r] { inputenc } \usepackage [engelska, ryska] { babel } \begin { document } etex;

Denna rubrik kommer att användas varje gång MetaPost når texten mellan taggarna btexoch etex. Om en etikett kräver ett LaTeX-paket, måste du följaktligen lägga till detta paket i rubriken på vanligt sätt.

För att latex ska kunna användas när du skapar en inskription måste mpost- tolken startas med alternativet -tex=latex . Om det här alternativet inte finns, letar mpost efter information om vad som ska köras i miljövariabeln TEX . Som standard körs tex istället för latex .

Om variabeln är definierad i texten prologuesmåste den vara lika med 0. I det här fallet är alla nödvändiga teckensnitt "bifogade" till bilden i det ögonblick då eps och pdf-filer skapas.

Strukturen för en mp-fil

Titeln följs av beskrivningar av bilderna. Varje bild är innesluten mellan kommandon beginfigoch endfig. beginfigBildens indexnummer anges som en parameter . Vid sammanställning kommer detta nummer att läggas till bilden som en förlängning. Exempel:

Matematik HelloWorld beginfig(3) ; för alfa:=90 steg -9 till 0: etikett(btex \( f ( x )= \frac { 1 }{ \sqrt { 2 \pi } \,\sigma } \int\limits _{ - \infty }^{ \infty } e^{ - \frac {x^ 2 }{ 2 \sigma ^ 2 }}dx \) etex skalad (5*(1-alfa/100)) roterad alfa,(0,0)) medfärg(max(1-alfa/45,0)*röd+min(alfa/45,2-alfa/45)*grön+max(alfa/45-1,0)*blå); endfor; endfig ;

Filen måste sluta med kommandot end.eller bye. Dessa kommandon talar om för mpost- tolken att bearbetningen är klar.

Automation

För att automatisera att få bilder med MetaPost kan du använda följande Makefile :

#temporary file 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] - där n är bildnumret" %.eps :  % @echo "\documentclass[12pt]{minimal}" > $( tmp_file ) .tex @echo "\usepackage[koi8-r]{inputenc}" >> $( tmp_file ) .tex @echo "\usepackage[engelska,ryska]{babel}" >> $( tmp_file ) .tex @echo "\usepackage{graphicx}" >> $( tmp_file ) .tex @echo "\DeclareGraphicsRule{*}{eps}{*}{}" >> $( tmp_file ) .tex @echo "\nofiler" >> $( tmp_fil ) .tex @echo "\begin{document}" >> $( tmp_file ) .tex @echo "\thispagestyle{empty}" >> $( tmp_file ) .tex @echo "\includegraphics{ $( basnamn $@ ) }" >> $( tmp_file ) .tex @echo "\end{dokument}" >> $( 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 ) .* #Beroenden för mpost-bilder. #En för varje nummer i startfig %.1 : %. mp $( MPOST ) $< … %.64 : %. mp $( MPOST ) $<

För att få en färdig eps-bild med redan "inbäddade" typsnitt vid utgången, som kan infogas var som helst, kör bara följande kommando:

gör <mp-filnamn>.<bildnummer>. [ eps | pdf ]

Vanligtvis ges mp-filer korta namn.

Alternativt finns det ett skalskript ( mp2pdf.sh ) som gör nästan samma sak. GNU/Linux (eller liknande OS) är tänkt att användas.

Skriptet för varje beginfig(n)-block kommer att göra filerna fil.eps och fil.pdf , där fil  är namnet på den ursprungliga MetaPost-filen, n  är blocknumret. Skriptet ger möjlighet att placera de mottagna filerna i separata kataloger. Katalognamnen ges av variablerna EPS_DIR och PDF_DIR. Om kataloger med sådana namn inte finns, skapar skriptet dem automatiskt.

#!/bin/sh # Skript för att förvandla MetaPost-fil till EPS- och PDF-ritningar # kataloger för lagring av eps och pdf-filer EPS_DIR = ./eps PDF_DIR = ./pdf TMP_FILE = tmp om [[ " $@ " == "" ]] ; sedan bearbetar echo echo Script mp-fil, skapar eps och pdf-filer och echo flyttar dem till $EPS_DIR respektive $PDF_DIR kataloger echo Användning: ./mp2pdf.sh file.mp echo exit fi om [  ! -d $EPS_DIR ] ; sedan echo ======== Skapa katalog för eps-filer mkdir $EPS_DIR fi om [  ! -d $PDF_DIR ] ; sedan echo ======== Skapa katalog för pdf-filer mkdir $PDF_DIR fi echo ======== Källfil: $@ list = ` grep beginfig $1 | sed -e 's/beginfig(//' -e 's/);//' ` echo ======== Blocklista: $list echo ======== Kör mpost... mpost -tex = latex $1 för i i $list # loop över block beginfig() gör epsi = ${ 1 %mp } $i eps = ${ 1 %.mp }${ i } .eps pdf = ${ 1 %.mp }${ i } .pdf echo Block ${ i } : ' >> ' $epsi ' >> ' $eps ' >> ' $pdf om [  ! -e $epsi ] ; sedan echo echo Fel vid bearbetning av mp-fil! echo exit else echo ======== MetaPost ===== Ok! fi echo ======== Genererar en temporär LaTeX-fil... echo \\ documentclass [ 12pt ]{ article } > ${ 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 [ engelska, ryska ]{ babel } >> ${ TMP_FILE } .tex echo \\ usepackage { grafik } >> ${ TMP_FILE } .tex echo \\ start { document } >> ${ TMP_FILE } .tex echo \\ sidstil { tom } >> ${ TMP_FILE } .tex echo \\ includegraphics { ${ epsi } } >> ${ TMP_FILE } .tex echo \\ end { document } >> ${ TMP_FILE } .tex echo ======== Startar LaTeX... latex ${ TMP_FILE } om [  ! -e ${ TMP_FILE } .dvi ] ; sedan echo echo ======== Ingen dvi-fil hittades! echo exit else echo ======== LaTeX ===== Ok! fi echo ======== Kör dvips... dvips -E ${ TMP_FILE } -o $eps echo ======== Kör epstopdf... epstopdf $eps om [[ -e $pdf ]] ; sedan mv $eps $EPS_DIR mv $pdf $PDF_DIR echo ======== Flytta $eps och $pdf till rätt plats... fi echo ======== Rengöring... rm *.log *.mpx ${ TMP_FILE } .* *.aux *.dvi *.tex $ epsi 2 >>/dev/null Gjort

Skriptet måste göras körbart:

chmod +x ./mp2pdf.sh

Användande:

./mp2pdf.sh fil.mp

Exempel på MetaPost-fil för testning:

%% Mall för mp-filer prologer:=0; %Latex; fungerar tillsammans med "mpost -tex=latexfil.mp" (se skriptet ovan) verbatimtex \documentclass [12pt] { article } \usepackage { mathtext } \usepackage { amsmath } \usepackage [T2A] { fontenc } \usepackage [koi8 - r] { inputenc } \usepackage [engelska, ryska] { babel } \begin { document } etex; beginfig(1); rita (0,0)--(0,100)--(100,100)--(100,0)--cykel; label(btex Etikett: $ \alpha _ 1 $ etex, (50,50)); endfig; slutet.

META-språk

Som basspråk, vars instruktioner matas till MetaPost-programmets ingång, används META- språket [6] .

I MetaPost kan du arbeta med följande datatyper:

  • boolean - boolean (sant/falskt)
  • numeriska - vanliga tal
  • penna (penna) - vad datorn ritar med (i de flesta fall används en rund penna pencircle)
  • par (punkt) - ett par av tal (x, y) i fallet med kartesiska koordinater eller R * dir (α) i fallet med polära koordinater
  • väg (sökväg) - en uppsättning punkter med en beskrivning av typen av kopplingar mellan dem
  • färg (färg) - en trippel av siffror (r, g, b) motsvarar RGB -färgmodellen
  • bild (bild) - en samling stigar och punkter
  • sträng (sträng) - ASCII-sträng,
  • transform (linjära transformationer) - linjära transformationer som kan tillämpas på objekt av typen pair, pen, pathoch picture.

Variabelnamn i META kan bestå av flera tokens. Tokens kan vara antingen alfabetiska eller numeriska. Till exempel x1lbestår en variabel av tre tokens. Det kan skrivas om på ett mer förståeligt sätt x[1].l, det vill säga den numeriska token indikerar i huvudsak numret på elementet i arrayen, och bokstaven efter det specificerar elementet i strukturen. Möjlighet att utelämna "[]." när du skriver variabelnamn förenklar det i vissa fall uppfattningen av koden (  det här är till exempel x-koordinaten för linjegränsen till vänster i rörelseriktningen för den första punkten på banan ) och minskar volymen av programmet. Istället, om du bara behöver variabler utan sådana funktioner, måste du begränsa dig till enbart bokstavskombinationer. z[]

Alla variabler måste deklareras före användning. Undantaget är variabler av typen numeric. Matriser deklareras och används på följande sätt:

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

Interaktionen mellan variabler, tal och operatorer är ganska naturlig, men snarare icke-trivial. Denna beskrivning är värd ett separat avsnitt. I vilket fall som helst bör du följa regeln: om du är osäker, sätt fästena på rätt ställen.

I META kan du utelämna några av operatorerna för att förkorta poster, till exempel 2*xmatchar post 2x. Samtidigt 1/2x är detta 0.5xvad som är mer naturligt ur matematikens synvinkel, men inte programmering. I META bearbetas numeriska tokens först.

Uppsättningen av standardberäkningsoperationer har utökats för att ta hänsyn till språkets specialisering. De operationer som stöds är särskilt Pythagoras addition , Pythagoras subtraktion , heltalsdivision och exponentiering . div

Språket innehåller loopoperatorer, villkorliga hopp och liknande. En utmärkande egenskap hos META är förmågan att lösa linjära ekvationssystem. Till exempel betyder ett uttryck som , att punkt C är exakt i mitten mellan punkterna A och B.

Programmet mpost kan användas i kalkylatorläge för beräkningar på META-språket. Detta låter dig kontrollera om dina antaganden om språket är korrekta. En exempelsession visas nedan:

baldin@evgueni:~$ mpost Detta är MetaPost, version 0.901 (Web2C 7.5.5) **\koppla av *a:=10; *b:=8; *c:=a+-+b; *visa c; >> 6 *show(3-sqrt 5)/2; >> 0,38197 *visa vinkel(1,sqrt 3); >> 60.00008 *visa 2**10; >> 1024.00003 *visa oändlighet; >> 4095.99998 *visa epsilon; >> 0,00002 *visa oändlighet-oändlighet; >> 0 *slutet Transkription skriven på mpout.log.

När prompten **visas skriver du kommandot \relax. Därefter kan du ange MetaPost-kommandon. Detta måste göras försiktigt, eftersom detta läge inte stöder "kommandohistorik". I början antogs det inte att MetaPost kunde användas på detta sätt också. Med hjälp av kommandot showkan du visa resultatet på skärmen. Du kan avsluta en session med kommandot end. Observera att när MetaPost blev ombedd att visa infinity ( infinity), returnerade MetaPost 4095.99998 - detta är det maximala värdet som en variabel av typen kan ta numeric. Dessutom kan resultatet under beräkningen överstiga "oändligheten", men svaret måste vara mindre än eller lika med det, annars kommer ett fel att genereras. Minsta typändringssteg numericär epsilon, eller mer exakt, 1/256/256. När du skapar en ritning är dessa begränsningar inte signifikanta, eftersom antalet siffror är ganska stort för att rymma alla element. Men detta måste i alla fall också beaktas.

Om du behöver utvärdera ett enkelradsuttryck **kan du ange expr. I det här fallet läser mpost filen expr.mf och ett svar kommer att utfärdas för varje åtgärd:

baldin@evgueni:~$ mpost Detta är MetaPost, version 0.901 (Web2C 7.5.5) **expr (/usr/local/texlive/2005/texmf-dist/metafont/base/expr.mf ge mig ett uttryck: 2(a+3b)-2b >> 4b+2a ge mig ett uttryck: 1/3[a,b] >> 0,33333b+0,66667a

Exempel

Koden för varje exempel anges i beskrivningen av motsvarande bild.

Analoger

MetaPost har ett antal begränsningar som ärvts från METAFONT. Ett försök att komma runt dessa begränsningar låg till grund för skapandet av Asymptote -programvarutolken [7] . Språket som används av Asymptote liknar META, men på grund av skiftet från makrospråksyntax till C++- syntax är det mycket mer omfattande och komplext. Asymptotes främsta fördel är bättre stöd för PostScript- funktioner .

Funktionell MetaPost  är en grafisk DSL inbyggd i Haskell som genererar MetaPost-kod. [åtta]

METAGRAF  är ett grafiskt gränssnitt över MetaPost. Skrivet i Java . Liknande funktioner som xfig . Bilder sparas i MetaPost-format. [9]

Bland LaTeX-programmiljön har PSTricks- och PGF/TikZ-paketen också liknande funktionalitet som MetaPost .

Baserat på MetaPosts mjukvarubas skapades METATYPE1- verktyget för att utveckla Type1-teckensnitt.

Anteckningar

  1. John D. Hobby, A METAFONT-like System with PostScript Output, Tugboat, TeX User's Group Newsletter, 10(4), 1989. (död länk) . Hämtad 4 januari 2011. Arkiverad från originalet 15 maj 2012. 
  2. John D. Hobby, Introduktion till MetaPost, Proceedings of EuroTeX '92, 1992. Arkiverad 15 maj 2012 på Wayback-maskinen MetaPost är ett bildritningsspråk väldigt likt METAFONT förutom med PostScript-utdata. Språket ger tillgång till alla viktiga funktioner i Level 1 PostScript® och det har möjligheter för att integrera grafik med inställd text.
  3. Meddelande om MetaPost 1.200 . Datum för åtkomst: 4 januari 2011. Arkiverad från originalet den 5 september 2014.
  4. John D. Hobby, Drawing Graphs with MetaPost, AT&T Bell Laboratories Computing Science Technical Report 164, 1992. (länk ej tillgänglig) . Hämtad 4 januari 2011. Arkiverad från originalet 15 maj 2012. 
  5. https://ctan.altspu.ru/graphics/metapost/contrib/macros/metaobj/doc/momanual.pdf
  6. E.M. Baldin Introduktion till MetaPost Arkiverad 4 september 2016 på Wayback Machine // Linux Format 76 (februari 2006)
  7. Asymptote: Ett språk för vektorgrafik John C. Bowman och Andy Hammerlindl, TUGBOAT: The Communications of the TeX Users Group, 29:2, 288-294 (2008). . Datum för åtkomst: 4 januari 2011. Arkiverad från originalet den 17 juli 2011.
  8. Funktionell MetaPost (nedlänk) . Hämtad 3 september 2006. Arkiverad från originalet 13 november 2008. 
  9. METAGRAF . Hämtad 3 september 2006. Arkiverad från originalet 31 augusti 2006.

Länkar

Litteratur

  • Donald Knuth . Allt om METAFONT = METAFONT-boken. - M. : Williams , 2003. - 384 sid. — ISBN 5-8459-0442-0 .
  • M. Goossens, S. Ratz, F. Mittelbach. En guide till LaTeX-paket och dess grafiktillägg = The LaTeX Graphics Companion. — M .: Mir, 2002. — 621 sid. — ISBN 5-03-003388-2 .