Metapost

metapost
Sprog klasse bydende nødvendigt
Dukkede op i 1994
Forfatter John Hobby
Frigøre 1,8 ( 17. juni 2013 )
Test version 2.0rc2 ( 19. februar 2018 )
Type system implicit , dynamisk , streng
Blev påvirket METAFONT
påvirket Asymptote
Licens GNU LGPL
Internet side tug.org/metapost
 Mediefiler på Wikimedia Commons

MetaPost  er en META - programmeringssprogsfortolker, der kan bruges til at skabe grafiske illustrationer. MetaPost blev oprettet af John Hobbie , mens han var kandidatstuderende hos Donald Knuth . METAFONT [1] skrifttypeoprettelsessystemet blev taget som grundlag .

Ved indgangen får tolken tekst i META, og outputtet er en grafisk fil i PostScript -format [2] . Fra version 1.200 understøtter MetaPost SVG -grafik som outputformat [3] .

META-sproget, arvet fra METAFONT, giver dig mulighed for at operere på geometriske objekter, såsom: et punkt, en sti, et billede og udføre forskellige algebraiske operationer på dem, såsom skift , rotation og andre lineære transformationer .

De vigtigste forskelle mellem MetaPost og METAFONT, bortset fra outputformatet, er farveunderstøttelse og muligheden for at indsætte tekst. Tekstindsættelser oprettes med TeX , så enhver konstruktion, der kan oprettes i TeX, kan også indsættes i et MetaPost-billede. Derudover udviklede MetaPost-forfatteren John Hobby oprindeligt METAOBJ-biblioteket (“metapost-objekter”) til visualisering af todimensionelle grafer [4] [5] .

MetaPost-fortolkeren (mpost eksekverbar) sammen med standard makrobiblioteker distribueres som open source-software , normalt som en del af TeX-distributioner.

MetaPost pipeline

Indgangen til mpost- programmet er et "META-billede". Et "META-billede" er en tekstfil med filtypenavnet .mp (i det følgende forkortet benævnt en mp-fil) med instruktioner på META-sproget. Du kan gemme flere beskrivelser af billeder i én mp-fil. Kompilering med mpost opretter filer med samme navn som kildefilen, men med udvidelser i form af tal, som er angivet i beginfig. De resulterende filer kan straks indsættes i LaTeX-tekster ved hjælp af den sædvanlige \includegraphics. For at gøre dette skal du blot tilføje kommandoen fra graphicx LaTeX-pakken til overskriften på tex-filen:

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

De adskiller sig kun fra de "korrekte" eps-filer ved, at de ikke har "indlejrede" skrifttyper, så de kan ikke ses uden yderligere behandling.

Skrifttyper kan indlejres ved hjælp af latex- og dvips- programmerne med resultatet i form af en eps-fil eller mptopdf- scriptet med resultatet i form af en pdf-fil. Disse billeder kan allerede bruges uafhængigt af ethvert program, der understøtter disse vektorformater.

Kyrillisk og MetaPost

Du kan kun integrere kyrillisk i MetaPost-tags ved hjælp af LaTeX. For at gøre dette skal mp-filen have noget i stil med følgende header:

verbatimtex \documentclass [12pt] { minimal } %simpel kyrillisk \usepackage [koi8-r] { inputenc } \usepackage [engelsk,russisk] { babel } \begin { document } etex;

Denne overskrift vil blive brugt hver gang MetaPost når teksten mellem taggene btexog etex. Hvis en etiket kræver en LaTeX-pakke, skal du følgelig tilføje denne pakke til overskriften på standardmåden.

For at latex kan bruges ved oprettelse af en inskription , skal mpost- fortolkeren startes med -tex=latex- indstillingen . Hvis denne mulighed ikke er til stede, så leder mpost efter information om, hvad der skal køres i TEX - miljøvariablen . Som standard køres tex i stedet for latex .

Hvis variablen er defineret i teksten prologues, så skal den være lig med 0. I dette tilfælde er alle de nødvendige skrifttyper "vedhæftet" til billedet i det øjeblik, hvor eps og pdf-filer oprettes.

Struktur af en mp-fil

Titlen efterfølges af beskrivelser af billederne. Hvert billede er indesluttet mellem kommandoer beginfigog endfig. beginfigBilledets indeksnummer er angivet som en parameter . Ved kompilering vil dette nummer blive tilføjet til billedet som en udvidelse. Eksempel:

Matematik HelloWorld beginfig(3) ; for alfa:=90 trin -9 indtil 0: label(btex \( f ( x )= \frac { 1 }{ \sqrt { 2 \pi } \,\sigma } \int\limits _{ - \infty }^{ \infty } e^{ - \frac {x^ 2 }{ 2 \sigma ^ 2 }}dx \) etex skaleret (5*(1-alpha/100)) roteret alfa,(0,0)) medfarve(maks(1-alfa/45,0)*rød+min(alfa/45,2-alfa/45)*grøn+maks(alfa/45-1,0)*blå); endfor; slutfig ;

Filen skal slutte med kommandoen end.eller bye. Disse kommandoer fortæller mpost- fortolkeren , at behandlingen er færdig.

Automatisering

For at automatisere at få billeder ved hjælp af MetaPost, kan du bruge følgende 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] - hvor n er billednummeret" %.eps :  % @echo "\documentclass[12pt]{minimal}" > $( tmp_file ) .tex @echo "\usepackage[koi8-r]{inputenc}" >> $( tmp_file ) .tex @echo "\usepackage[engelsk,russisk]{babel}" >> $( tmp_file ) .tex @echo "\usepackage{graphicx}" >> $( tmp_file ) .tex @echo "\DeclareGraphicsRule{*}{eps}{*}{}" >> $( tmp_file ) .tex @echo "\nofiler" >> $( tmp_fil ) .tex @echo "\begin{dokument}" >> $( tmp_file ) .tex @echo "\thispagestyle{empty}" >> $( tmp_file ) .tex @echo "\includegraphics{ $( basename $@ ) }" >> $( tmp_file ) .tex @echo "\end{dokument}" >> $( tmp_file ) .tex @ $( LATEX ) $( tmp_file ) @ $( DVIPS ) -E -o $@ $( tmp_file ) @rm $( tmp_file ) .* %.pdf :  % @ $( MPTOPDF ) $< @ $( MV ) ` ekko $< | sed -e "s/\.\([0-9]\+\) $$ /-\1.pdf/" ` $<.pdf ren : @rm -f mpx* *~ *.log *.mpx @rm -f $( tmp_file ) .* #Afhængigheder for mpost-billeder. #En for hvert tal i startfig %.1 : %. mp $( MPOST ) $< … %.64 : %. mp $( MPOST ) $<

For at få et færdiglavet eps-billede med allerede "indlejrede" skrifttyper ved outputtet, som kan indsættes hvor som helst, skal du blot køre følgende kommando:

lav <mp-filnavn>.<billednummer>. [ eps | pdf ]

Normalt får mp-filer korte navne.

Alternativt er der et shell-script ( mp2pdf.sh ), der gør næsten det samme. GNU/Linux (eller lignende OS) formodes at blive brugt.

Scriptet for hver beginfig(n)-blok vil lave filerne fil.eps og fil.pdf , hvor fil  er navnet på den originale MetaPost-fil, n  er bloknummeret. Scriptet giver mulighed for at placere de modtagne filer i separate mapper. Katalognavnene er givet af variablerne EPS_DIR og PDF_DIR. Hvis mapper med sådanne navne ikke findes, opretter scriptet dem automatisk.

#!/bin/sh # Script til at omdanne MetaPost-fil til EPS- og PDF-tegninger # mapper til lagring af eps og pdf-filer EPS_DIR = ./eps PDF_DIR = ./pdf TMP_FILE = tmp hvis [[ " $@ " == "" ]] ; derefter behandler echo echo Script mp-fil, opretter eps og pdf-filer og echo flytter dem til henholdsvis $EPS_DIR og $PDF_DIR mapper echo Brug: ./mp2pdf.sh file.mp echo exit fi hvis [  ! -d $EPS_DIR ] ; derefter echo ======== Opret mappe til eps-filer mkdir $EPS_DIR fi if [  ! -d $PDF_DIR ] ; derefter echo ======== Opret mappe til pdf-filer mkdir $PDF_DIR fi echo ======== Kildefil: $@ list = ` grep beginfig $1 | sed -e 's/beginfig(//' -e 's/);//' ` echo ======== Blokliste : $list echo ======== Kører mpost... mpost -tex = latex $1 for i i $list # loop over blokke beginfig() gør epsi = ${ 1 %mp } $i eps = ${ 1 %.mp }${ i } .eps pdf = ${ 1 %.mp }${ i } .pdf echo Bloker ${ i } : ' >> ' $epsi ' >> ' $eps ' >> ' $pdf hvis [  ! -e $epsi ] ; derefter echo echo Fejl under behandling af mp-fil! echo exit else echo ======== MetaPost ===== Ok! fi echo ======== Genererer en midlertidig LaTeX-fil... echo \\ documentclass [ 12pt ]{ article } > ${ TMP_FILE } .tex echo \\ usepackage { mathtext } >> ${ TMP_FILE } .tex echo \\ usepackage { amsmath } >> $ { TMP_FILE } .tex echo \\ use _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ .tex echo \\ usepackage [ engelsk, russisk ]{ babel } >> ${ TMP_FILE } .tex echo \\ usepackage { grafik } >> ${ TMP_FILE } .tex echo \\ start { document } >> ${ TMP_FILE } .tex echo \\ sidestil { tom } >> ${ TMP_FILE } .tex echo \\ includegraphics { ${ epsi } } >> ${ TMP_FILE } .tex echo \\ end { document } >> ${ TMP_FILE } .tex echo ======== Starter LaTeX... latex ${ TMP_FILE } hvis [  ! -e ${ TMP_FILE } .dvi ] ; derefter echo echo ======== Ingen dvi-fil fundet! echo exit else echo ======== LaTeX ===== Ok! fi echo ======== Kører dvips... dvips -E ${ TMP_FILE } -o $eps echo ======== Kører epstopdf... epstopdf $eps hvis [[ -e $pdf ]] ; derefter mv $eps $EPS_DIR mv $pdf $PDF_DIR echo ======== Flyt $eps og $pdf til det rigtige sted... fi echo ======== Oprydning... rm *.log *.mpx ${ TMP_FILE } .* *.aux *.dvi *.tex $ epsi 2 >>/dev/null Færdig

Scriptet skal gøres eksekverbart:

chmod +x ./mp2pdf.sh

Anvendelse:

./mp2pdf.sh fil.mp

Eksempel MetaPost-fil til test:

%% Skabelon til mp-filer prologer:=0; %LaTeX; fungerer sammen med "mpost -tex=latex fil.mp" (se scriptet ovenfor) verbatimtex \documentclass [12pt] { article } \usepackage { mathtext } \usepackage { amsmath } \usepackage [T2A] { fontenc } \usepackage [koi8 - r] { inputenc } \usepackage [engelsk, russisk] { babel } \begin { document } etex; startfig(1); tegne (0,0)--(0,100)--(100,100)--(100,0)--cyklus; label(btex Label: $ \alpha _ 1 $ etex, (50,50)); slutfig; ende.

META sprog

Som basissprog, hvis instruktioner føres til input fra MetaPost-programmet, bruges META -sproget [6] .

I MetaPost kan du arbejde med følgende datatyper:

  • boolsk - boolsk (sandt/falsk)
  • numerisk - almindelige tal
  • pen (pen) - hvad computeren tegner med (i de fleste tilfælde bruges en rund pen pencircle)
  • par (punkt) - et par tal (x, y) i tilfælde af kartesiske koordinater eller R * dir (α) i tilfælde af polære koordinater
  • sti (sti) - et sæt punkter med en beskrivelse af typen af ​​forbindelser mellem dem
  • farve (farve) - en tredobbelt af tal (r, g, b) svarer til RGB -farvemodellen
  • billede (billede) - en samling af stier og punkter
  • streng (streng) - ASCII streng,
  • transformation (lineære transformationer) - lineære transformationer, der kan anvendes på objekter af typen pair, pen, pathog picture.

Variablenavne i META kan bestå af flere tokens. Tokens kan enten være alfabetiske eller numeriske. For eksempel x1lbestår en variabel af tre tokens. Det kan omskrives på en mere forståelig måde x[1].l, det vil sige, at det numeriske token i det væsentlige angiver nummeret på elementet i arrayet, og bogstavet efter det angiver elementet i strukturen. Mulighed for at udelade "[]." ved at skrive variabelnavne forenkler det i nogle tilfælde opfattelsen af ​​koden (  dette er f.eks. x-koordinaten for linjegrænsen til venstre i bevægelsesretningen for det første punkt af stien ) og reducerer volumen af programmet. I stedet, hvis du bare har brug for variabler uden sådanne funktioner, så bliver du nødt til at begrænse dig til kun bogstavkombinationer. z[]

Alle variabler skal deklareres før brug. Undtagelsen er variabler af typen numeric. Arrays erklæres og bruges på følgende måde:

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

Interaktionen mellem variabler, tal og operatorer er ret naturlig, men snarere ikke-triviel. Denne beskrivelse er værdig til et separat afsnit. Under alle omstændigheder bør du følge reglen: hvis du er i tvivl, så sæt beslagene de rigtige steder.

I META kan du udelade nogle af operatorerne for at forkorte indtastninger, såsom 2*xmatcher indtastning 2x. Samtidig er det 1/2x , 0.5xhvad der er mere naturligt set ud fra matematikkens synspunkt, men ikke programmeringen. I META behandles numeriske tokens først.

Sættet af standardberegningsoperationer er blevet udvidet for at tage højde for sprogets specialisering. De understøttede operationer er især Pythagoras addition , Pythagoras subtraktion , heltalsdivision og eksponentiering . div

Sproget indeholder loop-operatorer, betingede spring og lignende. Et karakteristisk træk ved META er evnen til at løse systemer af lineære ligninger. For eksempel betyder et udtryk som , at punkt C er præcis i midten mellem punkt A og B.

Mpost - programmet kan bruges i lommeregnertilstand til beregninger i META-sproget. Dette giver dig mulighed for at kontrollere, om dine antagelser om sproget er korrekte. Et eksempel på en session er vist nedenfor:

baldin@evgueni:~$ mpost Dette er MetaPost, version 0.901 (Web2C 7.5.5) **\slap af *a:=10; *b:=8; *c:=a+-+b; *vis c; >> 6 *vis(3-sqrt 5)/2; >> 0,38197 *vis vinkel(1,sqrt 3); >> 60.00008 *vis 2**10; >> 1024.00003 *vis uendelighed; >> 4095.99998 *vis epsilon; >> 0,00002 *vis uendelig-uendelighed; >> 0 *ende Transskription skrevet på mpout.log.

Når prompten **er vist, skal du skrive kommandoen \relax. Dernæst kan du indtaste MetaPost-kommandoer. Dette skal gøres omhyggeligt, da denne tilstand ikke understøtter "kommandohistorik". I begyndelsen var det ikke antaget, at MetaPost også kunne bruges på denne måde. Ved hjælp af kommandoen showkan du få vist resultatet på skærmen. Du kan afslutte en session med kommandoen end. Bemærk venligst, at når du blev bedt om at vise infinity ( infinity), returnerede MetaPost 4095.99998 - dette er den maksimale værdi, som en variabel af typen kan tage numeric. Desuden kan resultatet under beregningen overstige "uendeligt", men svaret skal være mindre end eller lig med det, ellers vil der blive genereret en fejl. Det mindste typeændringstrin numericer epsiloneller mere præcist 1/256/256. Når du opretter en tegning, er disse begrænsninger ikke væsentlige, da rækken af ​​tal er ret stor for at rumme alle elementerne. Men det skal der i hvert fald også tages højde for.

Hvis du har brug for at evaluere et enkelt-linjes udtryk, så **kan du indtaste expr. I dette tilfælde læser mpost filen expr.mf, og der vil blive udsendt et svar for enhver handling:

baldin@evgueni:~$ mpost Dette er MetaPost, version 0.901 (Web2C 7.5.5) **udg (/usr/local/texlive/2005/texmf-dist/metafont/base/expr.mf giv et udtryk: 2(a+3b)-2b >> 4b+2a giv mig et udtryk: 1/3[a,b] >> 0,33333b+0,66667a

Eksempler

Koden for hvert eksempel er angivet i beskrivelsen af ​​det tilsvarende billede.

Analoger

MetaPost har en række begrænsninger arvet fra METAFONT. Et forsøg på at omgå disse begrænsninger dannede grundlaget for skabelsen af ​​Asymptote -softwarefortolkeren [7] . Sproget, der bruges af Asymptote, ligner META, men er på grund af skiftet fra makrosprogsyntaks til C++ syntaks meget mere omfattende og komplekst. Asymptotes største fordel er bedre understøttelse af PostScript -funktioner .

Funktionel MetaPost  er en grafisk DSL indbygget i Haskell , der genererer MetaPost-kode. [otte]

METAGRAF  er en grafisk grænseflade over MetaPost. Skrevet i Java . Funktionerne ligner xfig . Billeder gemmes i MetaPost-format. [9]

Blandt LaTeX-softwaremiljøet har PSTricks- og PGF/TikZ-pakkerne også lignende funktionalitet som MetaPost .

Baseret på MetaPost-softwarebasen blev METATYPE1- værktøjet skabt til at udvikle Type1-skrifttyper.

Noter

  1. John D. Hobby, A METAFONT-lignende system med PostScript-output, Tugboat, TeX User's Group Newsletter, 10(4), 1989. (dødt link) . Hentet 4. januar 2011. Arkiveret fra originalen 15. maj 2012. 
  2. John D. Hobby, Introduction to MetaPost, Proceedings of EuroTeX '92, 1992. Arkiveret 15. maj 2012 på Wayback Machine MetaPost er et billedtegnesprog, der ligner METAFONT, undtagen med PostScript-output. Sproget giver adgang til alle de vigtigste funktioner i Level 1 PostScript®, og det har faciliteter til at integrere grafik med typesæt tekst.
  3. MetaPost 1.200 meddelelse . Dato for adgang: 4. januar 2011. Arkiveret fra originalen 5. september 2014.
  4. John D. Hobby, Drawing Graphs with MetaPost, AT&T Bell Laboratories Computing Science Technical Report 164, 1992. (link utilgængeligt) . Hentet 4. januar 2011. Arkiveret fra originalen 15. maj 2012. 
  5. https://ctan.altspu.ru/graphics/metapost/contrib/macros/metaobj/doc/momanual.pdf
  6. E.M. Baldin Introduktion til MetaPost Arkiveret 4. september 2016 på Wayback Machine // Linux Format 76 (februar 2006)
  7. Asymptote: Et vektorgrafiksprog John C. Bowman og Andy Hammerlindl, TUGBOAT: The Communications of the TeX Users Group, 29:2, 288-294 (2008). . Dato for adgang: 4. januar 2011. Arkiveret fra originalen den 17. juli 2011.
  8. Funktionel MetaPost (downlink) . Hentet 3. september 2006. Arkiveret fra originalen 13. november 2008. 
  9. METAGRAF . Hentet 3. september 2006. Arkiveret fra originalen 31. august 2006.

Links

Litteratur

  • Donald Knuth . Alt om METAFONT = METAFONTbogen. - M. : Williams , 2003. - 384 s. — ISBN 5-8459-0442-0 .
  • M. Goossens, S. Ratz, F. Mittelbach. En guide til LaTeX-pakker og dets grafikudvidelser = LaTeX Graphics Companion. — M .: Mir, 2002. — 621 s. — ISBN 5-03-003388-2 .