Articulo de referencia

Metafont

Metafont is a description language used to define raster fonts . It is also the name of the interpreter that executes Metafont code, generating the bitmap fonts that can be embe...

Metafont is a description language used to define raster fonts. It is also the name of the interpreter that executes Metafont code, generating the bitmap fonts that can be embedded into e.g. PostScript. Metafont was devised by Donald Knuth as a companion to his TeX typesetting system.

One of the characteristics of Metafont is that the points defining the shapes of the glyphs—for example top of a stem, or intersection of a stem and crossbar—are defined with geometrical equations; the intent that the three stems of an ‘m’ are equally spaced horizontally might be expressed as x2x1=x3x2{\displaystyle x_{2}-x_{1}=x_{3}-x_{2}} if points 1, 2, and 3 are at the bottom ends of the three stems, whereas the intent that they all end on the same vertical position would be y1=y2=y3{\ Displaystyle y_ {1} = y_ {2} = y_ {3}}.

Metafont is a macro language, where operations such as "draw a lower case top of stem serif at point 4" might appear as one macro instruction (with the point as argument) in the program for a letter. For describing shapes, Metafont has a rich set of path construction operations that mostly relieves the user of having to calculate control points.

Many families of Metafont fonts are set up so that the main source file for a font only defines a small number of design parameters (x-height, em width, slant, vertical stroke width, etc.), then calling a separate source file common for a whole range of fonts to actually draw the individual glyphs; this is the meta aspect of the system.

Modes of operation

Metafont se suele ejecutar como asistente para los controladores de dispositivos de salida (impresora, pantalla); en estos casos, su función es generar mapas de bits para una fuente para una combinación específica de dispositivo de salida (llamado modo en Metafont) y resolución (visible en el nombre del archivo de salida, véase más abajo). Estos mapas de bits se suelen almacenar para su posterior reutilización, de modo que no es necesario ejecutar Metafont cada vez que se muestra un documento. Sin embargo, las distribuciones de TeX con un componente Metafont normalmente no incluyen fuentes de mapa de bits predefinidas, ya que serían bastante grandes en comparación con los archivos fuente a partir de los cuales se podrían generar. Dado que las fuentes Metafont eran tradicionalmente el formato predeterminado de TeX, del que otros formatos de fuente eran excepciones, una instalación incompleta de una fuente que no sea Metafont puede provocar que se llame a Metafont y se muestre un mensaje de error confuso: " somefont.mf no encontrado".

Igualmente importante, aunque menos común, es ejecutar Metafont para generar un archivo de métricas de fuente (TFM); este archivo solo se genera si la variable de creación de fuente es positiva. Tradicionalmente, las distribuciones de TeX suelen incluir todos los archivos TFM pregenerados (ya que son bastante pequeños), pero quien instale una fuente de Metafont desde el código fuente tendrá que generar su archivo TFM antes de que TeX pueda utilizarlo.

Una tercera forma de operar Metafont es mediante el modo de prueba : si la variable de prueba es positiva, el archivo de fuente de mapa de bits también contiene información adicional proporcionada mediante specialcomandos, en particular las posiciones y los nombres de los puntos que el diseñador de la fuente consideró importantes para el diseño. Si se utiliza la gftodviutilidad independiente para generar imágenes ampliadas de los glifos de la fuente, esta información de los caracteres especiales se incluye; las posiciones de los puntos no están limitadas a la resolución de píxeles.

Metafont también puede ejecutarse de forma interactiva y cuenta con comandos para mostrar en pantalla las imágenes que produce. Knuth ha comentado que utiliza Metafont como una especie de calculadora de escritorio para resolver ecuaciones complejas, aunque ahora usa MetaPost para ilustraciones matemáticas.

Metafont puede generar cualquier tipo de salida gráfica, no solo glifos. Sin embargo, MetaPost y Asymptote son las opciones preferidas para ilustraciones matemáticas. Metafont se suele invocar sin una solicitud directa del usuario. Los archivos DVI solo pueden contener referencias a tipografías, en lugar de los conjuntos de glifos rasterizados o vectoriales que permiten otros formatos como PostScript. Por consiguiente, es necesario acceder a los glifos de las tipografías cada vez que se solicita visualizar, imprimir o convertir un archivo DVI.

Archivos de salida

Metafont genera varios tipos de archivos: para un archivo llamado NOMBRE.mf, puede generar:

  • NOMBRE.NNNNgf – Archivo con salida ráster a resolución NNNN (2602 por defecto).
  • NAME.tfm: archivo con información métrica de la fuente TeX , que es la información que TeX necesita. Normalmente, hay que indicarle a metafont que genere este archivo.
  • NOMBRE.log – Archivo de registro de salida del procesamiento

Después de ejecutar Metafont, normalmente se utiliza el programa gftopk para convertir los archivos NNNNgf al formato pk (comprimido) (.NNNNpk). El formato pk se introdujo principalmente para reducir el tamaño del archivo (aproximadamente a la mitad), pero también se esperaba que acelerara el procesamiento, ya que se tendría que introducir/emitir menos datos . Tanto el formato GF como el PK emplean codificación de longitud de ejecución de mapas de bits, pero realizan diferentes codificaciones binarias de las longitudes de ejecución. El formato PK también realiza cierto preprocesamiento de los mapas de bits (cuadro delimitador, eliminación de filas repetidas) y codifica todas las filas de un carácter como una secuencia de bits larga. [ 1 ]

En el estándar de estructura de directorios de TeX , los nombres de archivo están limitados a 8+3 caracteres, por lo que los archivos GF y PK solo tendrían extensiones .gfy .pk. Los archivos para diferentes resoluciones se mantienen separados colocándolos en directorios separados, llamados dpiNNNN, por ejemplo dpi300/cmr10.pk.

Idioma

El lenguaje Metafont es un lenguaje interpretado para programas que son esencialmente declarativos en lugar de imperativos . [ 2 ]

Variables y ecuaciones

Las variables en Metafont pueden ser de ocho tipos diferentes:

  • Numéricos: números con signo de punto fijo con un épsilon de216{\displaystyle 2^{-16}}, limitado a ser menor que 4096 ( Q12.16 ). Este es el valor predeterminado para las variables que no se declaran como de otro tipo.
  • Par: un par de números, utilizados principalmente para representar puntos en el plano.
  • Ruta: al igual que en PostScript , PDF o SVG , se trata de una curva paramétrica en el plano cuyas funciones de coordenadas son polinomios cúbicos por partes . Como en esos otros sistemas, los segmentos de ruta se codifican como curvas de Bézier mediante nodos y puntos de control.
  • Transformación: una transformación afín del plano, equivalente a una "(matriz de transformación)" en PostScript/PDF.
  • Pluma: un polígono convexo que representa la forma de una "pluma" utilizada para dibujar.
  • Imagen: una imagen rasterizada con un valor entero con signo para cada píxel.
  • Booleano
  • Cadena (de caracteres de 8 bits)

Metapost añade el color (una tripleta de valores numéricos) como un noveno tipo y utiliza un modelo completamente diferente (no rasterizado) para las imágenes; este último es el principal punto de divergencia entre ambos programas. Las macros vardef de Metafont también se encuentran en el mismo espacio de nombres que las variables y, en cierto modo, pueden considerarse un noveno tipo de variable, aunque las macros no existen como valores de primera clase en Metafont.

De manera inusual, los nombres de las variables no son simples tokens, sino secuencias de tokens simbólicos e índices numéricos; x2rpor lo tanto, el nombre de la variable no es un solo token alfanumérico , sino una secuencia de los tres tokens x: (simbólico), 2(numérico) y r(simbólico). Los tipos de registro y de matriz se pueden simular mediante colecciones de variables que comparten un prefijo de nombre común, una convención respaldada por el sistema de declaración de tipos que asigna el mismo tipo a todas las variables cuyos nombres difieren solo en índices numéricos (como se espera para las matrices), mientras que mantiene separadas las variables cuyos nombres completos difieren en algún token simbólico (como se espera para los registros).

Una característica distintiva de Metafont es el uso de ecuaciones para definir variables. Una variable numérica (o un componente de un par o variable de transformación) puede encontrarse en tres estados: conocida (establecida), independiente desconocida (no establecida) y dependiente desconocida (no establecida, pero dada por una expresión lineal de una o varias independientes). Cuando Metafont ejecuta una ecuación, convierte una de las independientes involucradas en una dependiente y la elimina de las expresiones de las demás dependientes; cuando no quedan independientes en la expresión de una variable dependiente, esta se considera conocida. Por lo tanto, la resolución de sistemas de ecuaciones lineales es una característica inherente del lenguaje Metafont, y el método recomendado para asignar la mayoría de las variables (especialmente aquellas cuyos valores tienen significado geométrico) es mediante ecuaciones que determinen sus valores. Los sistemas de ecuaciones suelen combinar ecuaciones numéricas (escalares) con ecuaciones de pares (vectoriales).

Una excepción a lo anterior son las variables de cantidad internas . Estas tienen nombres compuestos por un único símbolo, son siempre numéricas y siempre se conocen. Su representación interna es más directa que la de las variables ordinarias, lo que facilita su uso implícito en operaciones primitivas de Metafont (o sus extensiones).

Sintaxis

Metafont utiliza tokens numéricos y de cadena constantes con sintaxis estándar; las cadenas se delimitan con "comillas, y las constantes numéricas pueden tener decimales, pero no exponentes . Todos los demás tokens se clasifican como simbólicos y pueden redefinirse arbitrariamente; no existe ninguna restricción que exija que los tokens con ciertos significados tengan nombres compuestos por determinados caracteres. En tiempo de ejecución, también pueden existir tokens cápsula , que son tokens de valor constante de tipo arbitrario; en el código fuente, estos aparecen como tokens simbólicos.

Excepto cuando los caracteres están involucrados en constantes numéricas o de cadena, la extensión del token que contiene un carácter particular depende de a qué clase pertenece el carácter; a diferencia de TeX , Metafont tiene clases de caracteres fijas. Los caracteres ,, ;, (, y )son "solitarios" y solo forman tokens de un solo carácter. Para las clases de caracteres <=>:|, ‘’(comillas simples), +-, /*\, , , !?, #&@$, ^~, [, y , así como la clase de guion bajo junto con ]las letras mayúsculas y minúsculas A–Z, el token consiste en la secuencia consecutiva más larga de caracteres de la misma clase. Los caracteres de espacio en blanco no contribuyen a los tokens. inicia un comentario que dura hasta el final de la línea.{}.%

Una aplicación notable de estas reglas es que #aparece con frecuencia como parte de los nombres de variables en el código Metafont, por ejemplo em#y pt#.

Los delimitadores (como los paréntesis) no tienen significados predefinidos; en su lugar, existe un comando que convierte dos tokens simbólicos en un par de delimitadores coincidentes, pero normalmente los programas Metafont solo utilizan los paréntesis comunes. Además de para anular prioridades en las expresiones, los delimitadores también son necesarios alrededor de ciertos tipos de argumentos de macro.

Gráficos

Las curvas en Metafont se definen como splines cúbicos , en lugar de cuadráticos, para una mayor versatilidad a costa de una aritmética más compleja. [ 3 ]

A diferencia de los formatos de fuente de contorno más comunes (como TrueType o PostScript Type 1 ), una fuente Metafont se compone principalmente de trazos con "plumas" de ancho finito, junto con regiones rellenas. Por lo tanto, en lugar de describir el contorno del glifo directamente, un archivo Metafont describe las trayectorias de la pluma. Algunas fuentes Metafont más simples, como las fuentes caligráficas matemáticas de la familia Computer Modern , utilizan un único trazo de pluma con una pluma relativamente grande para definir cada "trazo" visual de los glifos. Las fuentes más complejas, como las fuentes de texto Roman de la familia Computer Modern, utilizan una pluma pequeña para trazar el contorno de los "trazos" visuales, que luego se rellenan; el resultado es muy similar a una fuente de contorno, pero con esquinas ligeramente suavizadas definidas por la forma de la pluma.

Dado que las formas de la fuente se definen mediante ecuaciones en lugar de números codificados directamente, es posible tratar parámetros como la relación de aspecto, la inclinación de la fuente, el grosor del trazo, el tamaño de la serifa , etc., como parámetros de entrada en cada definición de glifo (que define no una sola fuente, sino una metafuente ). De este modo, al cambiar el valor de uno de estos parámetros en una ubicación del archivo Metafont, se puede producir un cambio consistente en toda la fuente. Computer Modern Roman ilustra muchos usos de esta característica; una instalación típica de TeX incluye varias versiones de la fuente en pasos de 5 a 17 cpi, con el mismo grosor de trazo en todos los tamaños (en lugar de aumentar a medida que se amplía la fuente). Además, las fuentes Computer Modern (tanto la de máquina de escribir como la sans-serif) se definen utilizando esencialmente el mismo archivo Metafont que la fuente Roman, pero con diferentes parámetros globales.

Usar

Si bien diseñadores tipográficos de renombre, como Hermann Zapf , han colaborado con Knuth para crear nuevas fuentes utilizando Metafont, el sistema no ha sido ampliamente adoptado por los diseñadores tipográficos profesionales. Knuth atribuye esto al hecho de que «pedirle a un artista que se convierta en un matemático lo suficientemente competente como para comprender cómo escribir una fuente con 60 parámetros es demasiado». [ 4 ] Jonathan Hoefler opinó que «la idea de Knuth de que las letras comienzan con formas esqueléticas es errónea». [ 5 ]

El sistema Metafont permite procesar fuentes de formas inusuales; en 1982, Knuth demostró cómo se podía utilizar para transformar fuentes, con una fuente con serifa que se convertía gradualmente en un diseño sin serifa a lo largo de un texto. [ 6 ]

Historia

Donald Knuth comenzó a trabajar en software de creación de fuentes en 1977 y produjo la primera versión de Metafont en 1979. Debido a las deficiencias del lenguaje Metafont original, Knuth desarrolló un sistema Metafont completamente nuevo en 1984, y es este sistema revisado el que se utiliza hoy en día; Metafont tiene un sistema de versiones similar al de TeX , donde el número se aproxima asintóticamente a e con cada revisión. [ 7 ]

Ejemplo

El siguiente ejemplo crea una forma cerrada similar a un frijol para el carácter "B" de una fuente:

%nombre del archivo: beta.mf %mode_setup; % Definir una forma de frijol para el carácter B beginchar ( "B" , 11 pt # , 11 pt # , 0 ); % Establecer coordenadas como un sistema de ecuaciones y1 = y2 = y3 = 0 ; y4 = y5 = y6 = h ; x1 = x4 = 0 ; x2 = x5 = w ; x3 = x6 = 2 * w ;% Definir recogida de pluma pencircle xscaled 0 . 2 w yscaled 0 . 04 w rotated 45 ;% Dibujar la curva del carácter % z1 es igual a (x1, y1) dibujar z1 .. z3 .. z6 { z2 - z6 }.. z5 ..{ z4 - z2 } z4 .. ciclo ; fin del carácter ;fin

Esto produce el siguiente glifo:

El ejemplo anterior se procesará con una línea de comandos como: [ 8 ]

mf '\mode=ljfour; mode_setup; input beta.mf' ; gftopk beta.600gf beta.600pk 

Luego se puede usar en un archivo LaTeX como el siguiente [ 8 ] (todos los archivos deben estar en el mismo directorio, o se debe informar al sistema TeX sobre ellos usando los métodos apropiados):

\documentclass { article }\newfont { \letterbeta }{ beta } \newcommand { \otherbeta }{{ \letterbeta B }}\begin { document } Intentemos tener una \otherbeta\ extraña aquí. \end { document }

El archivo PDF resultante debería tener este aspecto:

Creación de fuentes PostScript Tipo 1

Existen varias herramientas para convertir programas Metafont a fuentes PostScript Tipo 1. La mayoría aprovecha la capacidad de MetaPost para convertir un subconjunto del lenguaje Metafont en contornos EPS , que posteriormente pueden convertirse a fuentes PostScript Tipo 1. Generar contornos vectoriales de trazos de pluma Metafont no es trivial, ya que el modelo Metafont de un glifo es una imagen rasterizada y los contornos exactos de la mayoría de los trazos no son curvas de Bézier . [ nota 1 ]

  • El equipo polaco JNS desarrolló METATYPE1 [ 9 ] (basado en MetaPost) para crear fuentes PostScript Type 1. Su gran desventaja es que no se pueden usar plumas, lo que reduce considerablemente la potencia del lenguaje Metafont. Inicialmente, la herramienta fue utilizada por la fundición tipográfica polaca GUST para producir una variante modernizada y extendida de Computer Modern , llamada Latin Modern .
  • mf2pt1 , [ 10 ] que también se basa en Metapost, fue desarrollado por Scott Pakin con algunas contribuciones de Werner Lemberg . También tiene varias limitaciones detalladas en su manual, la más significativa es la restricción de que cada glifo debe dibujarse completamente a partir de trazados cerrados. Para superar las limitaciones de mf2pt1, la salida EPS de Metapost se puede posprocesar con FontForge , que es capaz de interpretar trazados PostScript complejos generados por Metapost a partir de las plumas elípticas de Metafont, y también capaz de eliminar superposiciones de contorno. Dado que FontForge admite scripts, este paso de posprocesamiento también se puede automatizar. Este enfoque se utilizó para producir contornos de tipo 1 para la fuente matemática MnSymbol desarrollada por Achim Blumensath; MnSymbol fue diseñada como complemento de Minion Pro .
  • MetaFog [ 11 ] es un convertidor propietario que puede convertir analíticamente trazos de pluma, pero requiere un procesamiento posterior manual para eliminar casos degenerados y no está disponible públicamente. Solo puede procesar la salida de Metapost. [ 12 ]

El enfoque común para generar fuentes Tipo 1 con trazos de pluma sigue siendo generar un mapa de bits de alta resolución y luego usar un autotrazador , implementado por paquetes como mftrace [ 13 ] y TeXtrace [ 14 ].

Véase también

Notas

  1. Técnicamente, Metafont genera contornos vectoriales como paso intermedio en la rasterización de un trazo, pero estos contornos intermedios están adaptados a la resolución rasterizada actual y no son tan simples como las curvas, por lo que están lejos de poder usarse como contornos de Tipo 1. Una consecuencia de esta complejidad son los píxeles espurios en el lado cóncavo del trazo, que obtienen un valor de 2 en lugar de 1; sin embargo, el descarte automático de imágenes que se envían como glifos en una fuente normalmente evita que esto aparezca en el mapa de bits final.

Referencias

  1. Rokicki, Tomas (1985). "Packed (PK) Font File Format" (PDF) . TUGboat . 6 (3): 115–120 . Archivado (PDF) del original el 6 de noviembre de 2011. Recuperado el 9 de agosto de 2019 .
  2. Knuth, Donald (1986). The METAFONTbook . Addison Wesley. ISBN 0-201-13445-4.
  3. Knuth, Donald (25 de enero de 2000). "Entrevista: Donald E. Knuth" (Entrevista). Entrevista realizada por Advogato. Archivado del original el 22 de enero de 2009. Recuperado el 13 de enero de 2016. ... las matemáticas son realmente sencillas para una ecuación cuadrática. Lo correspondiente para una ecuación cúbica es seis veces más complicado...
  4. CSTUG, Universidad Carolina, Praga, marzo de 1996, Preguntas y respuestas con el Prof. Donald E. Knuth, reproducido en TUGboat 17 (4) (1996), 355–67. La cita proviene de la página 361. Disponible en línea en
  5. Hoefler, Jonathan. «La idea de Knuth de que las letras comienzan con formas esqueléticas es errónea. Pero su trabajo es importante y tuvo un impacto duradero» . Twitter . Consultado el 18 de agosto de 2018 .
  6. Knuth, Donald (1982). "El concepto de metafuente" (PDF) . Visible Language . 16 (1): 3– 27. Archivado del original (PDF) el 7 de julio de 2020.
  7. "Knuth: Computadoras y composición tipográfica" .
  8. ^ Christophe Grandsir. «Tutorial METAFONT» .
  9. "CTAN: tex-archive/fonts/utilities/metatype1" .
  10. "CTAN: tex-archive/support/mf2pt1" .
  11. "RJ Kinch, "MetaFog: conversión de formas de Metafont a contornos", TUGboat 16(3) , 233–43 (1995)" (PDF) . Archivado (PDF) del original el 5 de octubre de 2000.
  12. K. Píška, 2004
  13. mftrace : un pequeño programa en Python que permite convertir una fuente de mapa de bits de TeX a una fuente PFA o PFB (fuente escalable PostScript Type1) o TTF (TrueType). Tiene licencia GNU GPL. Creado por Han-Wen Nienhuys. Las versiones anteriores a la 1.0.5 se denominaban 'pktrace'.
  14. TeXtrace : una colección de scripts para UNIX que convierten cualquier fuente TeX en una fuente de contorno Type1 .pfb, lista para usarse con dvips, pdftex, acroread (y muchos otros programas). Creado por Peter Szabo.

Fuentes

  • Donald Knuth : Metafont: El programa , Addison-Wesley, 1986. ISBN 0-201-13438-1
  • Donald Knuth: The Metafontbook , Addison-Wesley, 1986. ISBN 0-201-13444-6 El código fuente del libro en TeX (y una macro necesaria ) está disponible en línea en CTAN .
  • Donald Knuth: El código fuente de Metafont está escrito en el lenguaje de programación WEB e incluye una documentación muy completa sobre los algoritmos utilizados en Metafont.
  • Yannis Haralambous, "Fuentes y codificaciones", O'Reilly 2007, ISBN 0-596-10242-9Apéndice F: "METAFONT y sus derivados"
  • K. Píška, «Creación de fuentes Type 1 a partir de fuentes Metafont: comparación de herramientas, técnicas y resultados», en TeX, XML y tipografía digital (Springer-Verlag, Berlín, 2004), Lect. Notes Comput. Sci., vol. 3130, pp.  240–56. Preimpresión
  • Hofstadter, Douglas R., «Metafuente, metamatemáticas y metafísica: comentarios sobre el artículo de Donald Knuth "El concepto de metafuente"», Visible Language , vol. XVI, n.º 4, págs.  309-338 (republicado en el libro de Hofstadter Metamagical Themas , Nueva York: Basic Books, 1985).
  • Tutorial de Metafont (PDF). Christophe Grandsire, 2004.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Metafont&oldid=1358543352 "