Введение
Язык описания, используемый для определения растровых шрифтов. Metafont — это язык описания, используемый для определения растровых шрифтов. Он также является названием интерпретатора, выполняющего код Metafont и генерирующего растровые шрифты, которые могут быть встроены, например, в PostScript. Metafont был разработан Дональдом Кнутом как дополнение к его системе компьютерной наборки TeX. Одной из особенностей Metafont является то, что точки, определяющие форму глифов — например, верхняя часть штриха или пересечение штриха и перекладины — задаются геометрическими уравнениями. Намерение, что три штриха буквы «m» расположены на одинаковом горизонтальном расстоянии, может быть выражено так, будто точки 1, 2 и 3 находятся в нижних концах этих штрихов, в то время как намерение, что они все заканчиваются на одной вертикальной линии, будет… Metafont — это язык макросов, где такие операции, как «нарисовать засечку верхней части штриха в точке 4», могут быть представлены в виде одной макроинструкции (с точкой в качестве аргумента) в программе для буквы. Для описания форм Metafont располагает богатым набором операций для построения контуров, которые в значительной степени избавляют пользователя от необходимости вычислять контрольные точки. Многие семейства шрифтов Metafont устроены таким образом, что основной исходный файл шрифта определяет лишь небольшое количество параметров дизайна (высота x, ширина em, наклон, толщина вертикального штриха и т. д.), а затем вызывает отдельный исходный файл, общий для целого ряда шрифтов, для фактического рисования отдельных глифов; это и есть мета-аспект системы.
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 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
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.
Способы работы
Metafont чаще всего используется в качестве вспомогательной программы для драйверов выходного устройства (принтера, экрана); в этих случаях его задача состоит в генерации растровых изображений для шрифта для конкретной комбинации выходного устройства (называемой режимом в Metafont) и разрешения (отображаемого в имени выходного файла, см. ниже). Эти растровые изображения обычно сохраняются для последующего повторного использования, чтобы Metafont не приходилось запускать каждый раз при отображении документа, но, с другой стороны, дистрибутивы TeX с компонентом Metafont обычно не включают предварительно сгенерированные растровые шрифты, поскольку они были бы довольно большими по сравнению с исходными файлами, из которых их можно создать. Поскольку шрифты Metafont традиционно были шрифтами по умолчанию в TeX, в отличие от других форматов шрифтов, неполная установка шрифта, не являющегося Metafont, иногда может привести к вызову Metafont и выдаче непонятного сообщения об ошибке "somefont.mf не найден". Не менее важно, но менее распространено, запускать Metafont для генерации файла метрик шрифта (TFM); файл TFM генерируется только в том случае, если переменная создания шрифта положительна. Традиционно дистрибутивы TeX часто поставляются со всеми предварительно сгенерированными файлами TFM (поскольку они относительно небольшие), но пользователю, устанавливающему шрифт Metafont из исходников, потребуется сгенерировать его файл TFM, прежде чем TeX сможет его использовать. Третий способ работы с Metafont — это режим проверки: если переменная проверки положительна, то файл растрового шрифта также содержит дополнительную информацию, предоставляемую с помощью специальных команд, в частности, положения и имена точек, которые дизайнер шрифта считал важными для разработки. При использовании отдельной утилиты gftodvi для создания увеличенных изображений символов шрифта эта информация из специальных команд включается; положения точек не ограничиваются разрешением в пикселях. Metafont также может работать в интерактивном режиме и имеет команды для отображения на экране создаваемых им изображений. Кнут говорил, что использует Metafont как своего рода настольный калькулятор для решения сложных уравнений, хотя теперь он использует MetaPost для математических иллюстраций. Metafont может генерировать любые графические выходные данные, а не только символы. Однако для математических иллюстраций предпочтительнее MetaPost и Asymptote. Metafont чаще всего вызывается без прямого запроса от пользователя. DVI-файлы могут содержать только ссылки на шрифты, а не на наборы растровых или векторных символов, как это допускают другие форматы, такие как PostScript. Следовательно, доступ к символам в шрифтах необходим каждый раз, когда делается запрос на просмотр, печать или преобразование DVI-файла.
Выходные файлы
Metafont выводит несколько типов файлов: для файла NAME.mf он может вывести:
NAME.NNNNgf – Файл с растровым выводом с разрешением NNNN (по умолчанию – 2602). NAME.tfm – Файл с метрической информацией о шрифте TeX, представляющей собой информацию, необходимую TeX. Обычно Metafont необходимо указать создать этот файл. NAME.log – Файл журнала вывода от обработки.
После запуска Metafont обычно используется программа gftopk для преобразования файлов NNNNgf в формат pk (упакованный). Формат pk был введен в первую очередь для уменьшения размера файла (примерно вдвое), но также ожидалось, что он ускорит обработку, поскольку потребуется вводить/выводить меньше данных. Форматы GF и PK используют кодирование длин серий для растровых изображений, но используют различные двоичные кодировки длин серий. Формат PK также выполняет предварительную обработку растровых изображений (ограничивающий прямоугольник, отбрасывание повторяющихся строк) и кодирует все строки символа как одну длинную битовую последовательность. В стандарте ТеХ Directory Structure имена файлов ограничены 8+3 символами, поэтому файлы GF и PK будут иметь только расширения gf и pk. Файлы для разных разрешений хранятся отдельно, помещая их в отдельные каталоги с именем dpiNNNN, например dpi300/cmr10.pk.
Язык
Язык Metafont — это интерпретируемый язык для программ, которые по своей сути являются декларативными, а не императивными.
Синтаксис
Metafont имеет числовые и строковые постоянные токены с общепринятым синтаксисом; строки заключаются в двойные кавычки, числовые константы могут содержать десятичные дроби, но не экспоненциальную часть. Все остальные токены классифицируются как символические и могут быть произвольно переопределены; нет ограничений на то, что токены с определенным значением должны иметь имена, состоящие из определенных символов. Во время выполнения могут также появляться капсульные токены, которые фактически являются токенами постоянного значения произвольного типа; в исходном коде они представлены как символические токены. За исключением случаев, когда символы входят в состав числовых или строковых констант, размер токена, содержащего конкретный символ, зависит от класса, к которому принадлежит этот символ; в отличие от TeX, Metafont имеет фиксированные классы символов. Символы ,, ;, (, и ) являются "одиночками" и формируют только односимвольные токены. Для классов символов <=>:|, ‘’ (одиночные кавычки), +, /*\, ! ?, #&@$, ^~, [, ], {}, и ., а также класса подчеркивания вместе с прописными и строчными буквами A–Z, токен состоит из самой длинной непрерывной последовательности символов одного и того же класса. Пробельные символы не формируют токены. % начинает комментарий, который продолжается до конца строки. Важным применением этих правил является то, что символ # часто встречается в качестве части имен переменных в коде Metafont, например, em# и pt#. Разделители (например, скобки) не имеют встроенных значений; вместо этого существует команда, которая преобразует два символических токена в пару соответствующих разделителей, но обычно программы Metafont используют только обычные скобки. Помимо переопределения приоритетов в выражениях, разделители также требуются вокруг определенных типов аргументов макросов.
Графика
Кривые в Metafont определяются как кубические сплайны, а не квадратичные, для большей гибкости, хотя это и требует более сложной арифметики. В отличие от более распространенных форматов шрифтов с контурами (таких как TrueType или PostScript Type 1), шрифт Metafont в основном состоит из штрихов заданной ширины "пером" и залитых областей. Таким образом, файл Metafont описывает траектории пера, а не контуры глифа напрямую. Некоторые более простые шрифты Metafont, такие как каллиграфические математические шрифты семейства Computer Modern, используют один штрих пером относительно большой ширины для определения каждого визуального "штриха" глифа. Более сложные шрифты, такие как шрифты с засечками Computer Modern, используют тонкое перо для обводки контуров визуальных "штрихов", которые затем заливаются; результат во многом напоминает шрифт с контурами, но с немного сглаженными углами, определяемыми формой пера. Поскольку формы шрифтов задаются уравнениями, а не напрямую закодированными числами, такие параметры, как соотношение сторон, наклон шрифта, толщина штриха, размер засечек и так далее, можно рассматривать как входные параметры в определении каждого глифа (что определяет не один шрифт, а мета-шрифт). Таким образом, изменив значение одного из этих параметров в одном месте файла Metafont, можно добиться согласованного изменения во всем шрифте. Computer Modern Roman демонстрирует множество примеров использования этой возможности; типичная установка TeX включает несколько версий шрифта с размерами от 5 до 17 символов на дюйм, при этом толщина штриха остается одинаковой во всех размерах (вместо увеличения при масштабировании шрифта). Кроме того, шрифты Computer Modern без засечек и моноширинные шрифты определены с использованием, по сути, того же файла Metafont, что и шрифт с засечками, но с различными глобальными параметрами.
Использование
Хотя известные дизайнеры шрифтов, такие как Герман Запф, сотрудничали с Кнутом для создания новых шрифтов с использованием Metafont, система не получила широкого распространения среди профессиональных дизайнеров шрифтов. Кнут объясняет это тем, что "требовать от художника обладать достаточными математическими знаниями, чтобы понять, как создать шрифт с 60 параметрами, – это слишком сложно". Джонатан Хофлер заметил, что система Metafont в конечном итоге не легла в основу ни одного из ваших любимых шрифтов, а идея Кнута о том, что буквы начинаются с базовых форм, ошибочна. Система Metafont позволяет обрабатывать шрифты необычными способами; в 1982 году Кнут продемонстрировал, как с ее помощью можно плавно трансформировать шрифты, например, постепенно превращать шрифт с засечками в шрифт без засечек в процессе набора текста.
"asking an artist to become enough of a mathematician to understand how to write a font with 60 parameters is too much." Jonathan Hoefler commented that the Metafont system ultimately became "a technology behind zero of your favourite fonts Knuth's idea that letters start with skeletal forms is flawed." The Metafont system allows fonts to be processed in unusual ways; in 1982 Knuth showed how it could be used to morph fonts, with a serif font slowly transitioning into a sans serif design over the course of a text.
История
Дональд Кнут начал работу над программным обеспечением для создания шрифтов в 1977 году и выпустил первую версию Metafont в 1979 году. Из-за недостатков оригинального языка Metafont, Кнут разработал совершенно новую систему Metafont в 1984 году, и именно эта обновлённая система используется и сегодня. Metafont имеет систему версионирования, аналогичную TeX, где номер версии асимптотически приближается к числу e с каждой новой редакцией.