Metapost

metapost
clase de idioma imperativo
Apareció en 1994
Autor Juan Hobby
Liberar 1.8 ( 17 de junio de 2013 )
Versión de prueba 2.0rc2 ( 19 de febrero de 2018 )
sistema de tipos implícito , dinámico , estricto
sido influenciado METAFUENTE
influenciado Asíntota
Licencia GNU LGPL
Sitio web tug.org/metapost
 Archivos multimedia en Wikimedia Commons

MetaPost  es un intérprete del lenguaje de programación META que se puede utilizar para crear ilustraciones gráficas. MetaPost fue creado por John Hobbie cuando era estudiante de posgrado con Donald Knuth . Se tomó como base el sistema de creación de fuentes METAFONT [1] .

En la entrada, el intérprete recibe texto en META y la salida es un archivo gráfico en formato PostScript [2] . A partir de la versión 1.200, MetaPost admite gráficos SVG como formato de salida [3] .

El lenguaje META, heredado de METAFONT, le permite operar sobre objetos geométricos, como: un punto, un camino, una imagen, y realizar varias operaciones algebraicas sobre ellos, como desplazamiento , rotación y otras transformaciones lineales .

Las principales diferencias entre MetaPost y METAFONT, además del formato de salida, son la compatibilidad con el color y la capacidad de insertar texto. Las inserciones de texto se crean con TeX , por lo que cualquier construcción que se pueda crear en TeX también se puede insertar en una imagen de MetaPost. Además, el autor de MetaPost, John Hobby , desarrolló originalmente la biblioteca METAOBJ ("Objetos metapost") para visualizar gráficos bidimensionales [4] [5] .

El intérprete de MetaPost (mpost ejecutable) junto con las bibliotecas de macros estándar se distribuye como software de código abierto , generalmente como parte de las distribuciones de TeX.

Canalización de MetaPost

La entrada del programa mpost es una "META-imagen". Una "imagen META" es un archivo de texto con extensión .mp (en lo sucesivo, archivo mp para abreviar) con instrucciones en el lenguaje META. Puede almacenar varias descripciones de imágenes en un archivo mp. La compilación con mpost crea archivos con el mismo nombre que el archivo fuente, pero con extensiones en forma de números, que se especifican en el archivo beginfig. Los archivos resultantes se pueden insertar inmediatamente en textos LaTeX usando el habitual \includegraphics. Para hacer esto, simplemente agregue el comando del paquete graphicx LaTeX al encabezado del archivo tex:

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

Se diferencian de los archivos eps "correctos" solo en que no tienen fuentes "incrustadas", por lo que no se pueden ver sin un procesamiento adicional.

Las fuentes se pueden incrustar utilizando los programas latex y dvips con el resultado en forma de archivo eps o el script mptopdf con el resultado en forma de archivo pdf. Estas imágenes ya pueden ser utilizadas de forma independiente por cualquier programa que admita estos formatos vectoriales.

Cirílico y MetaPost

Solo puede incrustar cirílico en etiquetas MetaPost usando LaTeX. Para hacer esto, el archivo mp debe tener algo como el siguiente encabezado:

verbatimtex \documentclass [12pt] { minimal } % cirílico simple \usepackage [koi8-r] { inputenc } \usepackage [inglés, ruso] { babel } \begin { documento } etex;

Este encabezado se utilizará cada vez que MetaPost alcance el texto entre las etiquetas btexy etex. Si una etiqueta requiere un paquete LaTeX, entonces, en consecuencia, debe agregar este paquete al encabezado de la manera estándar.

Para que se utilice látex al crear una inscripción , el intérprete de mpost debe iniciarse con la opción -tex=latex . Si esta opción no está presente, mpost busca información sobre qué ejecutar en la variable de entorno TEX . De forma predeterminada, se ejecuta tex en lugar de latex .

Si la variable está definida en el texto prologues, entonces debe ser igual a 0. En este caso, todas las fuentes necesarias se "adjuntan" a la imagen en el momento en que se crean los archivos eps y pdf.

Estructura de un archivo mp

El título va seguido de descripciones de las imágenes. Cada imagen está encerrada entre los comandos beginfigy endfig. beginfigEl número de índice de la imagen se especifica como parámetro . Al compilar, este número se agregará a la imagen como una extensión. Ejemplo:

%Matemáticas HolaMundo comienzofig(3) ; para alfa:=90 paso -9 hasta 0: etiqueta(btex \( f ( x )= \frac { 1 }{ \sqrt { 2 \pi } \,\sigma } \int\limits _{ - \infty }^{ \infty } e^{ - \frac {x^ 2 }{ 2 \sigma ^ 2 }}dx \) etex escalado (5*(1-alfa/100)) alfa rotado,(0,0)) withcolor(max(1-alpha/45.0)*red+min(alpha/45.2-alpha/45)*green+max(alpha/45-1.0)*blue); fin de; higo final;

El archivo debe terminar con el comando end.o bye. Estos comandos le dicen al intérprete de mpost que el procesamiento está completo.

Automatización

Para automatizar la obtención de imágenes usando MetaPost, puede usar el siguiente Makefile :

#archivo temporal tmp_file : = tmp_file #programas LATEX : = latex MPOST := mpost -tex = latex DVIPS := dvips MPTOPDF := mptopdf MV := mv all : @echo "run: make mpfile.n.[eps|pdf] - donde n es el número de imagen" %.eps :  % @echo "\documentclass[12pt]{mínimo}" > $( tmp_file ) .tex @echo "\usepackage[koi8-r]{inputenc}" >> $( tmp_file ) .tex @echo "\usepackage[inglés,ruso]{babel}" >> $( tmp_file ) .tex @echo "\usepackage{graphicx}" >> $( tmp_file ) .tex @echo "\DeclareGraphicsRule{*}{eps}{*}{}" >> $( tmp_file ) .tex @echo "\noarchivos" >> $( tmp_file ) .tex @echo "\begin{documento}" >> $( tmp_file ) .tex @echo "\thispagestyle{vacío}" >> $( tmp_file ) .tex @echo "\includegraphics{ $( nombre base $@ ) }" >> $( tmp_file ) .tex @echo "\end{documento}" >> $( 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 ) .* #Dependencias para imágenes mpost. #Uno para cada número en beginfig %.1 : %. MP $( MPOST ) $< … %.64 : %. MP $( MPOST ) $<

Para obtener una imagen eps lista con fuentes ya "incrustadas" en la salida, que se puede insertar en cualquier lugar, simplemente ejecute el siguiente comando:

make <nombre de archivo mp>.<número de imagen>. [ eps | pdf ]

Por lo general, los archivos mp reciben nombres cortos.

Alternativamente, hay un script de shell ( mp2pdf.sh ) que hace casi lo mismo. Se supone que debe usarse GNU/Linux (o un sistema operativo similar).

El script para cada beginfig(n)bloque creará archivos filen.eps y filen.pdf , donde file  es el nombre del archivo MetaPost original, n  es el número de bloque. El script permite colocar los archivos recibidos en directorios separados. Los nombres de los catálogos vienen dados por las variables EPS_DIR y PDF_DIR. Si no existen directorios con tales nombres, el script los crea automáticamente.

#!/bin/sh # Script para convertir un archivo MetaPost en dibujos EPS y PDF # directorios para almacenar archivos eps y pdf EPS_DIR = ./eps PDF_DIR = ./pdf TMP_FILE = tmp si [[ " $@ " == "" ]] ; luego echo echo Script procesa el archivo mp, crea archivos eps y pdf y echo los mueve a los directorios $EPS_DIR y $PDF_DIR respectivamente echo Uso: ./mp2pdf.sh file.mp echo exit fi si [  ! -d $EPS_DIR ] ; luego echo ======== Crear directorio para archivos eps mkdir $EPS_DIR fi si [  ! -d $PDF_DIR ] ; luego echo ======== Crear directorio para archivos pdf mkdir $PDF_DIR fi echo ======== Archivo fuente: $@ lista = ` grep beginfig $1 | sed -e 's/beginfig(//' -e 's/);//' ` echo ======== Lista de bloqueo: $lista echo ======== Ejecutando mpost... mpost -tex = látex $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 Bloque ${ i } : ' >> ' $epsi ' >> ' $eps ' >> ' $pdf si [  ! -e $epsi ] ; luego echo echo ¡Errores al procesar el archivo mp! echo exit else echo ======== MetaPost ===== Ok! fi echo ======== Generando un archivo LaTeX temporal... echo \\ documentclass [ 12pt ]{ artículo } > ${ 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 [ inglés, ruso ]{ babel } >> ${ TMP_FILE } .tex echo \\ usepackage { gráficos } >> ${ TMP_FILE } .tex echo \\ begin { documento } >> ${ TMP_FILE } .tex echo \\ pagestyle { vacío } >> ${ TMP_FILE } .tex echo \\ includegraphics { ${ epsi } } >> ${ TMP_FILE } .tex echo \\ end { documento } >> ${ TMP_FILE } .tex echo ======== Iniciando LaTeX... látex ${ TMP_FILE } si [  ! -e ${ TMP_FILE } .dvi ] ; entonces echo echo ======== ¡No se encontró ningún archivo dvi! echo exit else echo ======== LaTeX ===== Ok! fi echo ======== Ejecutando dvips... dvips -E ${ TMP_FILE } -o $eps echo ======== Ejecutando epstopdf... epstopdf $eps si [[ -e $pdf ]] ; luego mv $eps $EPS_DIR mv $pdf $PDF_DIR echo ======== Mover $eps y $pdf al lugar correcto... fi echo ======== Limpieza... rm *.log *.mpx ${ TMP_FILE } .* *.aux *.dvi *.tex $ epsi 2 >>/dev/null hecho

El script debe hacerse ejecutable:

chmod +x ./mp2pdf.sh

Uso:

./mp2pdf.sh archivo.mp

Ejemplo de archivo MetaPost para probar:

%% Plantilla para archivos mp prólogos:=0; %Látex; funciona junto con "mpost -tex=latex file.mp" (ver script arriba) verbatimtex \documentclass [12pt] { artículo } \usepackage { mathtext } \usepackage { amsmath } \usepackage [T2A] { fontenc } \usepackage [koi8 - r] { inputenc } \usepackage [inglés, ruso] { babel } \begin { documento } etex; comienzofig(1); dibujar (0,0)--(0,100)--(100,100)--(100,0)--ciclo; etiqueta(btex Etiqueta: $ \alpha _ 1 $ etex, (50,50)); higo final; final.

Lenguaje META

Como lenguaje base, cuyas instrucciones se alimentan a la entrada del programa MetaPost, se utiliza el lenguaje META [6] .

En MetaPost, puede operar con los siguientes tipos de datos:

  • booleano - booleano (Verdadero/Falso)
  • numérico - números ordinarios
  • bolígrafo (bolígrafo): con lo que dibuja la computadora (en la mayoría de los casos, se usa un bolígrafo redondo pencircle)
  • par (punto) - un par de números (x, y) en el caso de coordenadas cartesianas o R * dir (α) en el caso de coordenadas polares
  • ruta (ruta): un conjunto de puntos con una descripción del tipo de conexiones entre ellos
  • color (color): un triple de números (r, g, b) corresponde al modelo de color RGB
  • imagen (imagen) - una colección de caminos y puntos
  • cadena (cadena) - cadena ASCII,
  • transform (transformaciones lineales): transformaciones lineales que se pueden aplicar a objetos de tipo pair, peny .pathpicture

Los nombres de variables en META pueden consistir en múltiples tokens. Los tokens pueden ser alfabéticos o numéricos. Por ejemplo, una variable x1lconsta de tres tokens. Se puede reescribir de una manera más comprensible x[1].l, es decir, el token numérico indica esencialmente el número del elemento en la matriz, y la letra que le sigue especifica el elemento de la estructura. Posibilidad de omitir "[]". al escribir nombres de variables, en algunos casos simplifica la percepción del código (por ejemplo,  esta es la coordenada x del límite de la línea a la izquierda en la dirección del movimiento para el primer punto de la ruta ) y reduce el volumen de el programa. En cambio, si solo necesita variables sin tales características, tendrá que limitarse solo a combinaciones de letras. z[]

Todas las variables deben declararse antes de su uso. La excepción son las variables de tipo numeric. Los arreglos se declaran y utilizan de la siguiente manera:

parw[]; w1:=(10.5); w2:=w1;

La interacción de variables, números y operadores es bastante natural, pero no trivial. Esta descripción es digna de una sección aparte. En cualquier caso, debe seguir la regla: en caso de duda, coloque los corchetes en los lugares correctos.

En META, puede omitir algunos de los operadores para acortar las entradas, como la 2*xentrada de coincidencias 2x. A su vez 1/2x , esto 0.5xes lo más natural desde el punto de vista de las matemáticas, pero no de la programación. En META, los tokens numéricos se procesan primero.

El conjunto de operaciones computacionales estándar se ha ampliado para tener en cuenta la especialización del lenguaje. En particular, las operaciones admitidas son la suma de Pitágoras, la resta de Pitágoras , la división de enteros y la exponenciación . div

El lenguaje contiene operadores de bucle, saltos condicionales y similares. Una característica distintiva de META es la capacidad de resolver sistemas de ecuaciones lineales. Por ejemplo, una expresión como , significa que el punto C está exactamente en el medio entre los puntos A y B.

El programa mpost se puede utilizar en modo calculadora para cálculos en el lenguaje META. Esto le permite verificar si sus suposiciones sobre el idioma son correctas. A continuación se muestra una sesión de ejemplo:

baldin@evgueni:~$ mensaje Esto es MetaPost, Versión 0.901 (Web2C 7.5.5) **\relax *a:=10; *b:=8; *c:=a+-+b; *mostrar c; >> 6 *mostrar(3-sqrt 5)/2; >> 0.38197 *mostrar ángulo(1,raíz cuadrada 3); >> 60.00008 *mostrar 2**10; >> 1024.00003 * mostrar infinito; >> 4095.99998 *mostrar épsilon; >> 0.00002 *mostrar infinito-infinito; >> 0 *final Transcripción escrita en mpout.log.

Después de **que se muestre el indicador, escriba el comando \relax. A continuación, puede ingresar comandos de MetaPost. Esto debe hacerse con cuidado, ya que este modo no es compatible con el "historial de comandos". Al principio, no se asumió que MetaPost también podría usarse de esta manera. Con la ayuda del comando show, puede mostrar el resultado en la pantalla. Puede finalizar una sesión con el comando end. Tenga en cuenta que cuando se le pidió que mostrara infinito ( infinity), MetaPost devolvió 4095.99998; este es el valor máximo que puede tomar una variable de tipo numeric. Además, durante el cálculo, el resultado puede exceder el "infinito", pero la respuesta debe ser menor o igual, de lo contrario se generará un error. El paso de cambio de tipo mínimo numerices epsilon, o más precisamente, 1/256/256. Al crear un dibujo, estas restricciones no son significativas, ya que el rango de números es bastante grande para acomodar todos los elementos. Pero en cualquier caso, esto también hay que tenerlo en cuenta.

Si necesita evaluar una expresión de una sola línea, en el mensaje inicial **puede ingresar expr. En este caso, mpost lee el archivo expr.mf y se emitirá una respuesta para cualquier acción:

baldin@evgueni:~$ mensaje Esto es MetaPost, Versión 0.901 (Web2C 7.5.5) **expr (/usr/local/texlive/2005/texmf-dist/metafont/base/expr.mf dame una expresión: 2(a+3b)-2b >> 4b+2a dame una expresión: 1/3[a,b] >> 0.33333b+0.66667a

Ejemplos

El código de cada ejemplo se encuentra en la descripción de la imagen correspondiente.

Análogos

MetaPost tiene una serie de limitaciones heredadas de METAFONT. Un intento de sortear estas limitaciones formó la base para la creación del intérprete de software Asymptote [7] . El lenguaje utilizado por Asymptote es similar a META, pero debido al cambio de la sintaxis del lenguaje de macros a la sintaxis de C++ , es mucho más detallado y complejo. La principal ventaja de Asymptote es una mejor compatibilidad con las funciones de PostScript .

MetaPost funcional  es un DSL de gráficos integrado en Haskell que genera código MetaPost. [ocho]

METAGRAF  es una interfaz gráfica sobre MetaPost. Escrito en Java . Similar en características a xfig . Las imágenes se guardan en formato MetaPost. [9]

Entre el entorno de software LaTeX, los paquetes PSTricks y PGF/TikZ también tienen una funcionalidad similar a MetaPost .

Sobre la base del software MetaPost, se creó la herramienta METATYPE1 para desarrollar fuentes Type1.

Notas

  1. John D. Hobby, A METAFONT-like System with PostScript Output, Tugboat, the TeX User's Group Newsletter, 10(4), 1989. (enlace muerto) . Consultado el 4 de enero de 2011. Archivado desde el original el 15 de mayo de 2012. 
  2. John D. Hobby, Introducción a MetaPost, Actas de EuroTeX '92, 1992. Archivado el 15 de mayo de 2012 en Wayback Machine . MetaPost es un lenguaje de dibujo de imágenes muy parecido a METAFONT excepto con salida PostScript. El lenguaje proporciona acceso a todas las funciones principales de PostScript® de nivel 1 y tiene funciones para integrar gráficos con texto tipográfico.
  3. Anuncio de MetaPost 1.200 . Fecha de acceso: 4 de enero de 2011. Archivado desde el original el 5 de septiembre de 2014.
  4. John D. Hobby, Drawing Graphs with MetaPost, AT&T Bell Laboratories Computing Science Technical Report 164, 1992. (enlace no disponible) . Consultado el 4 de enero de 2011. Archivado desde el original el 15 de mayo de 2012. 
  5. https://ctan.altspu.ru/graphics/metapost/contrib/macros/metaobj/doc/momanual.pdf
  6. E. M. Baldin Introducción a MetaPost Archivado el 4 de septiembre de 2016 en Wayback Machine // Linux Format 76 (febrero de 2006)
  7. Asymptote: A vector graphics language John C. Bowman y Andy Hammerlindl, TUGBOAT: The Communications of the TeX Users Group, 29:2, 288-294 (2008). . Fecha de acceso: 4 de enero de 2011. Archivado desde el original el 17 de julio de 2011.
  8. MetaPost funcional (enlace descendente) . Consultado el 3 de septiembre de 2006. Archivado desde el original el 13 de noviembre de 2008. 
  9. METÁGRAFO . Consultado el 3 de septiembre de 2006. Archivado desde el original el 31 de agosto de 2006.

Enlaces

Literatura

  • Donald Knuth . Todo sobre METAFONT = El libro METAFONT. - M. : Williams , 2003. - 384 p. — ISBN 5-8459-0442-0 .
  • M. Goossens, S. Ratz, F. Mittelbach. Una guía de los paquetes LaTeX y sus extensiones gráficas = The LaTeX Graphics Companion. — M .: Mir, 2002. — 621 p. — ISBN 5-03-003388-2 .