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.
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.
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.
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.
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 GjortSkriptet måste göras körbart:
chmod +x ./mp2pdf.shAnvändande:
./mp2pdf.sh fil.mpExempel 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.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:
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,66667aMetaPost-logotypen på Wikipedia.
Sköldpadda mönster. Ett exempel på användning av bildobjektet.
Pascals triangel . Ett exempel på att infoga text.
Banor av punkter på ett hjul under framåtrörelse utan slirning. Ett exempel på användning av en cykel .
Ett exempel på användning av linjära transformationer.
Antalet inlägg på LOR från månadens nummer under året. Ett exempel på ett enkelt diagram.
fraktala mönster. Rekursionsexempel . _
Fördelning av materia i universum. Exempel på cirkeldiagram
Koden för varje exempel anges i beskrivningen av motsvarande bild.
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.
Gratis typografi | |
---|---|
Operativsystem headset |
|
Andra headset |
|
programvara |
|
Licenser |
|
Grupper och människor |
|
|
Τ Ε Χ | |
---|---|
Makropaket | |
Alternativa motorer Τ Ε Χ | |
distributioner | |
gemenskap |
|
Diverse |
|