Metafont - Metafont

Metafont
METAFONT logo.svg
Desarrollador (es) Donald Knuth
Lanzamiento estable
2.71828182 / enero de 2021 ; hace 9 meses ( 01/01/2021 )
Sistema operativo Multiplataforma
Escribe Lenguaje de ordenador
Licencia Permisivo

Metafont es un lenguaje de descripción que se utiliza para definir fuentes ráster. También es el nombre del intérprete que ejecuta el código Metafont, generando las fuentes de mapa de bits que se pueden incrustar en, por ejemplo, PostScript . Donald Knuth diseñó Metafont como complemento de su sistema de composición tipográfica TeX .

Una de las características de Metafont es que los puntos que definen las formas de los glifos —por ejemplo, la parte superior de un tallo o la intersección de un tallo y una barra transversal— se definen con ecuaciones geométricas; La intención de que los tres tallos de una 'm' estén igualmente espaciados horizontalmente podría expresarse como si los puntos 1, 2 y 3 estuvieran en los extremos inferiores de los tres tallos, mientras que la intención de que todos terminen en la misma posición vertical sería ser .

Metafont es un lenguaje de macros , donde operaciones como "dibujar una parte superior minúscula de la raíz serif en el punto 4" pueden aparecer como una macroinstrucción (con el punto como argumento) en el programa para una letra. Para describir formas, Metafont tiene un amplio conjunto de operaciones de construcción de rutas que, en su mayoría, alivia al usuario de tener que calcular puntos de control.

Muchas familias de fuentes Metafont están configuradas para que el archivo fuente principal para una fuente solo defina una pequeña cantidad de parámetros de diseño ( altura x , ancho em, inclinación, ancho de trazo vertical, etc.), luego llamando a un archivo fuente separado común para una amplia gama de fuentes para dibujar los glifos individuales; este es el meta aspecto del sistema.

Modos de operacion

La mayoría de las veces, Metafont se ejecuta como ayuda para los controladores de dispositivos de salida (impresora, pantalla); en esos casos, su trabajo 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, ver más abajo). Estos mapas de bits generalmente se almacenan para su posterior reutilización, por lo que Metafont no tiene que ejecutarse cada vez que se muestra un documento, pero por otro lado, las distribuciones de TeX con un componente Metafont generalmente no han incluido ninguna fuente de mapa de bits precompilada, ya que serían preferibles. grandes en comparación con las fuentes a partir de las cuales podrían generarse. Dado que las fuentes Metafont eran tradicionalmente las fuentes predeterminadas de TeX de las cuales otros formatos de fuente eran excepciones, una instalación incompleta de una fuente que no es Metafont a veces puede resultar en que se llame a Metafont y se emita un mensaje de error confuso " somefont .mf not found".

Igualmente importante, pero no tan común, es ejecutar Metafont para generar un archivo de métrica de fuente (TFM); un archivo TFM solo se genera si la variable de tipografía es positiva. Tradicionalmente, las distribuciones de TeX a menudo vienen con todos los archivos TFM pregenerados (ya que son bastante pequeños), pero alguien que instale una fuente Metafont desde las fuentes tendrá que generar su archivo TFM antes de que TeX pueda usarlo.

Una tercera forma de operar Metafont es 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 a través de specialcomandos, en particular, las posiciones y los nombres de los puntos que el diseñador de fuentes consideró importantes para el diseño. Si utiliza la gftodviutilidad separada para generar imágenes ampliadas de los glifos de fuente, se incluye esta información de los especiales; las posiciones de los puntos no se limitan a la resolución de píxeles.

Metafont también se puede ejecutar de forma interactiva y tiene comandos para mostrar en la pantalla las imágenes que produce. Knuth ha dicho que usa Metafont como una especie de calculadora de escritorio para resolver ecuaciones complicadas, aunque ahora usa MetaPost para ilustraciones matemáticas.

Metafont puede generar cualquier tipo de salida gráfica, no solo glifos. Sin embargo, se prefieren MetaPost y Asymptote para ilustraciones matemáticas. Metafont se invoca con mayor frecuencia sin una solicitud directa del usuario. Los archivos DVI solo pueden contener referencias a tipos de letra, en lugar de los conjuntos de glifos vectoriales o ráster que permiten otros formatos como PostScript. En consecuencia, es necesario acceder a los glifos de los tipos de letra cada vez que se solicita ver, imprimir o convertir un archivo DVI.

Archivos de salida

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

  • NAME.NNNNgf - Archivo con salida raster a resolución NNNN (2602 por defecto).
  • NAME.tfm: archivo con información de métrica de fuente TeX , que es la información que necesita TeX. Por lo general, se debe indicar a metafont que genere este archivo.
  • NAME.log: salida del archivo de registro del procesamiento

Después de ejecutar Metafont, normalmente se usa el programa gftopk para convertir los archivos NNNNgf al formato pk (empaquetado) (.NNNNpk). El formato pk se introdujo principalmente para reducir el tamaño del archivo (a aproximadamente la mitad), pero se esperaba que también acelerara el procesamiento, ya que se tendría que ingresar / salir menos datos . Los formatos GF y 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 un procesamiento previo de los mapas de bits (cuadro delimitador, elidiendo filas repetidas) y codifica todas las filas de un carácter como una secuencia de bits larga.

En el estándar TeX Directory Structure , 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 .

Variables y ecuaciones

Las variables en Metafont pueden ser de ocho tipos diferentes:

  • Numérico: números con signo de coma fija con un épsilon de , con un límite inferior a 4096 ( Q12.16 ). Este es el valor predeterminado para las variables que no se declaran de otro tipo.
  • Par: un par de números que se utilizan principalmente para representar puntos en el plano.
  • Ruta: como en PostScript / PDF / SVG , 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 la trayectoria se codifican como curvas de Bézier en términos de nudos y puntos de control.
  • Transformar: 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 agrega color (un triple de números) como noveno tipo y tiene un modelo completamente diferente (no rasterizado) para imágenes; este último es el principal punto de divergencia entre los dos programas. Las macros vardef de Metafont también viven en el mismo espacio de nombres que las variables y, de alguna manera, pueden considerarse como un noveno tipo de variable, aunque las macros no existen como valores de primera clase en Metafont.

Inusualmente, los nombres de las variables no son simples tokens, sino secuencias de tokens simbólicos e índices numéricos; el nombre de la variable x2rno es, por tanto, un token alfanumérico , sino una secuencia de los tres tokens x(simbólico), 2(numérico) y r(simbólico). Los tipos de registros y matrices se pueden simular a través de colecciones de variables que comparten un prefijo de nombre común, un idioma admitido por el sistema de declaración de tipos que proporciona a todas las variables cuyos nombres que difieren solo en índices numéricos del mismo tipo (como se esperaba para las matrices) mientras se mantienen las variables completas el nombre difiere en algún token simbólico por separado (como se esperaba para los registros).

Una característica muy distintiva de Metafont es el uso de ecuaciones para definir variables. Una variable numérica (o componente de un par o variable de transformación) puede estar en los tres estados conocido (conjunto), desconocido independiente (no establecido) y desconocido dependiente (no establecido, pero dado por una expresión lineal de uno o varios independientes) . Cuando Metafont ejecuta una declaración de ecuación, convierte uno de los independientes involucrados en un dependiente y lo elimina de las expresiones para todos los demás dependientes; cuando no quedan independientes en la expresión de una variable dependiente, esa variable se vuelve conocida. Por lo tanto, resolver sistemas de ecuaciones lineales es una característica incorporada del lenguaje Metafont, y el método recomendado para asignar la mayoría de las variables (especialmente aquellas cuyos valores tienen importancia geométrica) es establecer ecuaciones que determinen sus valores. Los sistemas de ecuaciones frecuentemente mezclan ecuaciones numéricas (escalares) con ecuaciones de pares (vectoriales).

Una excepción a lo anterior es la clase de variables de cantidad interna . Estos tienen nombres que consisten en un solo token simbólico, son siempre numéricos y siempre se conocen. Tienen una representación interna más directa que las variables ordinarias, por lo que es conveniente que las operaciones primitivas en Metafont (o extensiones de las mismas) las usen implícitamente.

Sintaxis

Metafont tiene tokens constantes numéricos y de cadena con sintaxis convencionales; las cadenas están delimitadas por "comillas, las constantes numéricas pueden tener decimales pero no una parte de exponente . Todos los demás tokens se clasifican como simbólicos y se pueden redefinir arbitrariamente; No hay ninguna restricción de que los tokens con ciertos significados deban tener nombres que constan de ciertos caracteres. En tiempo de ejecución, puede haber adicionalmente tokens de cápsula , que son efectivamente tokens de valor constante de tipo arbitrario; en el código fuente 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 en particular depende de a qué clase pertenece el carácter; a diferencia de TeX , Metafont tiene clases de caracteres fijas. Los personajes ,, ;, (, y )son "solitarios" y sólo forman fichas de personajes individuales. Para las clases de personajes <=>:|, ‘’(comillas simples), +-, /*\, !?, #&@$, ^~, [, ], {}, y ., así como la clase de guión junto con mayúsculas y minúsculas A-Z, el token consiste en la secuencia consecutiva más larga de caracteres de la misma clase. Los personajes de espacios en blanco no contribuyen con tokens. %comienza un comentario que dura hasta el final de la línea.

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

Los delimitadores (como los paréntesis) no tienen significados incorporados, en su lugar hay un comando que convierte dos tokens simbólicos en un par de delimitadores coincidentes, pero normalmente los programas Metafont usan solo los paréntesis ordinarios. Además de anular las prioridades en las expresiones, también se requieren delimitadores en torno a ciertos tipos de argumentos macro.

Gráficos

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

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 "bolígrafos" de ancho finito, junto con regiones rellenas. Por lo tanto, en lugar de describir el contorno del glifo directamente, un archivo Metafont describe las rutas del lápiz. Algunas fuentes Metafont más simples, como las fuentes matemáticas caligráficas de la familia Computer Modern , utilizan un solo trazo de lápiz con un lápiz relativamente grande para definir cada "trazo" visual de los glifos. Las fuentes más complejas, como las fuentes de texto romanas de la familia Computer Modern, utilizan un bolígrafo pequeño para trazar el contorno de los "trazos" visuales, que luego se rellenan; el resultado es muy parecido a una fuente de contorno, pero con esquinas ligeramente suavizadas definidas por la forma del lápiz.

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 ancho del trazo, el tamaño de la serif , etc., como parámetros de entrada en cada definición de glifo (que luego no define una fuente única, sino una meta -font). Por lo tanto, al cambiar el valor de uno de estos parámetros en una ubicación en el 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 tamaños de 5 a 17 puntos, con el mismo ancho de trazo en todos los tamaños (en lugar de aumentar a medida que se amplía la fuente) y las relaciones de aspecto se amplían en los tamaños más pequeños para una mayor legibilidad . Además, la máquina de escribir Computer Modern y las fuentes sans-serif se definen utilizando esencialmente el mismo archivo Metafont que la fuente Roman, pero con diferentes parámetros globales.

Usar

Si bien los diseñadores tipográficos conocidos, 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 suficiente para entender cómo escribir una fuente con 60 parámetros es demasiado". Jonathan Hoefler comentó que el sistema Metafont finalmente se convirtió en "una tecnología detrás de cero de sus fuentes favoritas ... La idea de Knuth de que las letras comienzan con formas esqueléticas es defectuosa".

El sistema Metafont permite que las fuentes se procesen de formas inusuales; en 1982, Knuth mostró cómo se podía usar para transformar fuentes, con una fuente serif que se transformaba lentamente en un diseño sans-serif a lo largo del texto.

Historia

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

Ejemplo

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

%file name: beta.mf
%mode_setup;
% Define a beanlike shape for the character B
beginchar("B",11pt#,11pt#,0);
  % Setup coordinates as an equation system
  y1=y2=y3=0;
  y4=y5=y6=h;
  x1=x4=0;
  x2=x5=w;
  x3=x6=2*w;

  % Define pen
  pickup pencircle xscaled 0.2w yscaled 0.04w rotated 45;

  % Draw the character curve
  % z1 is the same as (x1, y1)
  draw z1..z3..z6{z2-z6}..z5..{z4-z2}z4..cycle;
endchar;

end

Esto produce el siguiente glifo:

Metafont-example-output.svg

El ejemplo anterior se procesará con una línea de comando como:

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

Luego se puede usar en un archivo LaTeX como (todos los archivos deben residir en el mismo directorio o el sistema TeX debe ser informado sobre ellos usando los métodos apropiados):

\documentclass{article}

\newfont{\letterbeta}{beta}
\newcommand{\otherbeta}{{\letterbeta B}}

\begin{document}
Let's try having a strange \otherbeta\ here.
\end{document}

El archivo PDF resultante debería verse así: Tex mf beta.pdf

Producción de fuentes PostScript Type 1

Existen varias herramientas para convertir programas Metafont a fuentes PostScript Type 1 . La mayoría hace uso de la capacidad de MetaPost para convertir un subconjunto del lenguaje de Metafont en contornos EPS , que posteriormente se pueden convertir a fuentes PostScript Type 1. La generación de contornos vectoriales de trazos de lápiz Metafont no es trivial, ya que el modelo Metafont de un glifo es una imagen ráster y los contornos exactos de la mayoría de los trazos no son curvas de Bézier .

  • El equipo polaco de JNS desarrolló METATYPE1 (basado en MetaPost) para crear fuentes PostScript Type 1. Su gran desventaja es que no se pueden usar bolígrafos, lo que reduce en gran medida el poder del lenguaje Metafont. Inicialmente, la fundición tipográfica polaca GUST utilizó la herramienta para producir una variante modernizada y extendida de Computer Modern , llamada Latin Modern .
  • mf2pt1 , 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 caminos cerrados. Para superar las limitaciones de mf2pt1, la salida EPS de Metapost se puede posprocesar con FontForge , que es capaz de interpretar rutas PostScript complejas generadas por Metapost a partir de las plumas elípticas de Metafont, y también es capaz de eliminar superposiciones de contorno. Dado que FontForge admite secuencias de comandos, este paso de posprocesamiento también se puede automatizar. Este enfoque se utilizó para producir esquemas de Tipo 1 para la fuente matemática MnSymbol desarrollada por Achim Blumensath; MnSymbol fue diseñado como complemento de Minion Pro .
  • MetaFog es un convertidor patentado que puede convertir analíticamente los trazos de lápiz, pero requiere un procesamiento posterior manual para eliminar los casos degenerados y no está disponible públicamente. Solo puede procesar la salida de Metapost.

El enfoque común para generar fuentes Type 1 con trazos de lápiz sigue siendo generar un mapa de bits de alta resolución y luego usar un autotracer , implementado por paquetes como mftrace y TeXtrace

Ver también

Notas

Referencias

Fuentes

enlaces externos