Разработчики) | Дональд Кнут |
---|---|
Стабильный выпуск | 2.71828182 / январь 2021 г. ; 9 месяцев назад (2021-01) |
Операционная система | Кроссплатформенность |
Тип | Компьютерный язык |
Лицензия | Разрешительный |
Metafont - это язык описания, используемый для определения растровых шрифтов. Это также имя интерпретатора, который выполняет код Metafont, генерируя растровые шрифты, которые могут быть встроены, например, в PostScript. Metafont был разработан Дональдом Кнутом в качестве дополнения к его системе набора текста TeX.
Одной из характеристик Metafont является то, что точки, определяющие формы глифов - например, вершина стержня или пересечение стержня и перекладины - определяются с помощью геометрических уравнений; Намерение, что три стержня буквы «m» расположены на одинаковом расстоянии по горизонтали, может быть выражено так, как если бы точки 1, 2 и 3 находились на нижних концах трех стержней, тогда как намерение, чтобы все они заканчивались в одном и том же вертикальном положении, быть.
Metafont - это макроязык, где такие операции, как «нарисовать верхнюю часть нижнего регистра основной засечек в точке 4», могут отображаться в программе для буквы как одна макро-инструкция (с точкой в качестве аргумента). Для описания форм в Metafont есть богатый набор операций построения пути, который в основном избавляет пользователя от необходимости вычислять контрольные точки.
Многие семейства шрифтов Metafont настроены так, что основной исходный файл для шрифта определяет только небольшое количество параметров дизайна ( x-высота, ширина em, наклон, ширина вертикального штриха и т. Д.), А затем вызывает отдельный общий исходный файл. для целого ряда шрифтов для рисования отдельных глифов; это мета- аспект системы.
Метафонт чаще всего запускается как помощник для драйверов устройств вывода (принтер, экран); в этих случаях его задача - генерировать растровые изображения для шрифта для определенной комбинации устройства вывода (называемого режимом в Metafont) и разрешения (видимого в имени выходного файла, см. ниже). Эти растровые изображения обычно сохраняются для последующего повторного использования, поэтому Metafont не нужно запускать каждый раз при отображении документа, но, с другой стороны, дистрибутивы TeX с компонентом Metafont обычно не включают никаких предварительно созданных растровых шрифтов, поскольку они скорее большие по сравнению с источниками, из которых они могли быть получены. Поскольку шрифты Metafont традиционно использовались TeX по умолчанию, из которых другие форматы шрифтов были исключением, неполная установка шрифта, отличного от Metafont, иногда может приводить к вызову Metafont и выдаче сбивающего с толку сообщения об ошибке « somefont.mf not found».
Не менее важно, но не так часто, запуск Metafont для создания файла метрики шрифта (TFM); файл TFM создается только в том случае, если переменная создания шрифтов положительна. Традиционно дистрибутивы TeX часто поставляются с заранее созданными файлами TFM (поскольку они довольно малы), но кто-то, кто устанавливает шрифт Metafont из источников, должен будет сгенерировать его файл TFM, прежде чем TeX сможет его использовать.
Третий способ работы с Metafont - это режим проверки: если переменная проверки положительна, то файл растрового шрифта также содержит дополнительную информацию, предоставляемую с помощью special
команд, в частности положения и названия точек, которые дизайнер шрифтов считал важными для дизайна. Если вы используете отдельную gftodvi
утилиту для генерации увеличенных изображений глифов шрифтов, эта информация из спец. положения точек не ограничиваются разрешением в пикселях.
Metafont также может работать в интерактивном режиме и имеет команды для отображения на экране изображений, которые он создает. Кнут сказал, что он использует Metafont как своего рода настольный калькулятор для решения сложных уравнений, хотя теперь он использует MetaPost для математических иллюстраций.
Metafont может отображать любой графический вывод, а не только глифы. Однако для математических иллюстраций предпочтительны MetaPost и Asymptote. Метафонт чаще всего запускается без прямого запроса пользователя. Файлы DVI могут содержать только ссылки на гарнитуры шрифтов, а не наборы растровых или векторных глифов, которые допускаются другими форматами, такими как PostScript. Следовательно, к глифам в гарнитурах необходимо обращаться всякий раз, когда делается запрос на просмотр, печать или преобразование файла DVI.
Metafont выводит несколько типов файлов: для файла с именем NAME.mf он может выводить:
После запуска Metafont обычно используется программа gftopk для преобразования файлов NNNNgf в формат pk (упакованный) (.NNNNpk). Формат pk был в первую очередь введен для уменьшения размера файла (примерно до половины), но ожидалось, что он также ускорит обработку, поскольку для ввода / вывода потребуется меньше данных. Оба формата GF и PK используют кодирование длин серий растровых изображений, но делают разные двоичные кодировки длин серий. Формат PK также выполняет некоторую предварительную обработку растровых изображений (ограничивающий прямоугольник, исключение повторяющихся строк) и кодирует все строки символа как одну длинную последовательность битов.
В стандарте TeX Directory Structure имена файлов ограничены 8 + 3 символами, поэтому файлы GF и PK будут иметь только расширения .gf
и .pk
. Файлы для разных разрешений хранятся отдельно, помещая их в отдельные каталоги с именем dpi
NNNN, например dpi300/cmr10.pk
.
Язык Metafont - это интерпретируемый язык для программ, которые по сути являются декларативными, а не императивными.
Переменные в Metafont могут быть восьми разных типов:
Metapost добавляет цвет (тройку цифр) в качестве девятого типа и имеет совершенно другую (не растровую) модель для изображений; последнее является основным моментом расхождения между двумя программами. Макросы Metafont vardef также находятся в том же пространстве имен, что и переменные, и в некотором смысле могут рассматриваться как девятый тип переменных, хотя макросы не существуют как значения первого класса в Metafont.
Как ни странно, имена переменных - это не простые токены, а последовательности символьных токенов и числовых индексов; имя переменной, x2r
таким образом, представляет собой не одну буквенно-цифровую лексему, а последовательность из трех лексем x
(символьных), 2
(числовых) и r
(символьных). Типы записей и массивов можно моделировать с помощью коллекций переменных, которые имеют общий префикс имени, идиому, поддерживаемую системой объявления типов, которая дает всем переменным, имена которых отличаются только числовыми индексами, один и тот же тип (как и ожидалось для массивов), сохраняя при этом переменные целыми. name отличаются некоторым отдельным символическим токеном (как и положено для записей).
Отличительной особенностью Metafont является использование уравнений для определения переменных. Числовая переменная (или компонент пары или переменной преобразования) может находиться в трех состояниях: известное (набор), неизвестно независимое (не установлено) и неизвестно зависимое (не установлено, но задано линейным выражением одного или нескольких независимых).. Когда Metafont выполняет оператор уравнения, он превращает одну из вовлеченных независимых зависимостей в зависимую и удаляет ее из выражений для всех остальных зависимых; когда в выражении для зависимой переменной не остается независимых переменных, эта переменная становится известной. Таким образом, решение систем линейных уравнений является встроенной функцией языка Metafont, и рекомендуемый метод присвоения большинства переменных (особенно тех, значения которых имеют геометрическое значение) - это формулирование уравнений, определяющих их значения. Системы уравнений часто смешивают числовые (скалярные) уравнения с парными (векторными) уравнениями.
Исключением из вышесказанного является класс внутренних количественных переменных. Они имеют имена, состоящие только из одной символической лексемы, всегда числовые и всегда известны. Они имеют более прямое внутреннее представление, чем обычные переменные, что позволяет использовать их неявно для примитивных операций в Metafont (или его расширениях).
Metafont имеет числовые и строковые константы с обычным синтаксисом; строки разделяются "
кавычками, числовые константы могут иметь десятичные дроби, но не показательную часть. Все остальные токены классифицируются как символические и могут быть произвольно переопределены; Нет ограничений на то, что токены с определенными значениями должны иметь имена, состоящие из определенных символов. Во время выполнения могут дополнительно существовать токены капсулы, которые фактически представляют собой токены постоянного значения произвольного типа; в исходном коде они отображаются как символические токены.
За исключением случаев, когда символы включены в числовые или строковые константы, размер токена, содержащего конкретный символ, зависит от того, к какому классу принадлежит символ; в отличие от TeX, Metafont имеет фиксированные классы символов. Символы ,
, ;
, (
, и )
являются «одиночками» и образуют только одиночные маркеры символов. Для классов символов lt;=gt;:|
, ‘’
(одиночные кавычки), +-
, /*\
, !?
, #amp;@$
, ^~
, [
, ]
, {}
, и .
, а также класс подчеркивания вместе с верхним и нижним регистром A-Z, маркер состоит из длинной части последовательности символов из того же самого класс. Пробельные символы не добавляют токены. %
начинает комментарий до конца строки.
Заметным применением этих правил является то, что они #
часто появляются как часть имен переменных в коде Metafont, например, em#
и pt#
.
Разделители (например, круглые скобки) не имеют встроенного значения, вместо этого есть команда, которая превращает два символических токена в пару совпадающих разделителей, но обычно программы Metafont используют только обычные круглые скобки. Помимо переопределения приоритетов в выражениях, также необходимы разделители вокруг определенных типов аргументов макроса.
Кривые в Metafont определяются как кубические сплайны, а не как квадратичные, для большей универсальности за счет более сложной арифметики.
В отличие от более распространенных форматов шрифтов контура (таких как TrueType или PostScript Type 1 ), шрифт Metafont в основном состоит из штрихов с «перьями» конечной ширины и заполненных областей. Таким образом, вместо непосредственного описания контура глифа файл Metafont описывает пути пера. Некоторые более простые шрифты Metafont, такие как шрифты каллиграфической математики в семействе Computer Modern, используют один штрих пера с относительно большим пером для определения каждого визуального «штриха» глифов. Более сложные шрифты, такие как римские текстовые шрифты в семействе Computer Modern, используют маленькое перо для обводки контура визуальных «штрихов», которые затем заполняются; результат очень похож на контурный шрифт, но со слегка сглаженными углами, определяемыми формой пера.
Поскольку формы шрифтов определяются уравнениями, а не непосредственно закодированными числами, можно обрабатывать такие параметры, как соотношение сторон, наклон шрифта, ширина штриха, размер засечек и т. Д., Как входные параметры в каждом определении глифа (которые затем определяют не одного шрифта, но мета -font). Таким образом, изменяя значение одного из этих параметров в одном месте в файле Metafont, можно произвести согласованное изменение во всем шрифте. Computer Modern Roman иллюстрирует множество вариантов использования этой функции; типичная установка TeX включает в себя несколько версий шрифта размером от 5 до 17 пунктов, с одинаковой шириной штриха для всех размеров (а не увеличивающейся по мере увеличения шрифта) и расширением соотношений сторон в меньших размерах для повышения удобочитаемости. Кроме того, шрифты для пишущей машинки Computer Modern и шрифты без засечек определяются с использованием по существу того же файла Metafont, что и шрифт Roman, но с другими глобальными параметрами.
Хотя известные шрифтовые дизайнеры, такие как Герман Цапф, сотрудничали с Кнутом для создания новых шрифтов с помощью Metafont, эта система не получила широкого распространения среди профессиональных шрифтовых дизайнеров. Кнут объясняет это тем, что «просить художника стать достаточно математиком, чтобы понять, как написать шрифт с 60 параметрами, - это слишком много». Джонатан Хёфлер отметил, что система Metafont в конечном итоге стала «технологией, лежащей в основе нуля ваших любимых шрифтов... Идея Кнута о том, что буквы начинаются со скелетных форм, ошибочна».
Система Metafont позволяет обрабатывать шрифты необычными способами; В 1982 году Кнут показал, как его можно использовать для преобразования шрифтов, при этом шрифт с засечками постепенно переходит в дизайн без засечек по ходу текста.
Дональд Кнут начал работу над программным обеспечением для создания шрифтов в 1977 году и выпустил первую версию Metafont в 1979 году. Из-за недостатков исходного языка Metafont, Кнут разработал совершенно новую систему Metafont в 1984 году, и именно эта пересмотренная система используется сегодня. ; Metafont имеет систему управления версиями, аналогичную TeX, где число асимптотически приближается к e с каждой ревизией.
В следующем примере создается замкнутая бобоподобная форма для символа «B» шрифта:
%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
Это дает следующий глиф:
Приведенный выше пример будет обработан с помощью командной строки, например:
mf '\mode=ljfour; mode_setup; input beta.mf'; gftopk beta.600gf beta.600pk
Затем его можно использовать в файле LaTeX, например (все файлы должны находиться в одном каталоге или система TeX должна быть проинформирована о них соответствующими методами):
\documentclass{article} \newfont{\letterbeta}{beta} \newcommand{\otherbeta}{{\letterbeta B}} \begin{document} Let's try having a strange \otherbeta\ here. \end{document}
В результате PDF-файл должен выглядеть так:
Существует несколько инструментов для преобразования программ Metafont в шрифты PostScript Type 1. Большинство из них используют способность MetaPost преобразовывать подмножество языка Metafont в контуры EPS, которые впоследствии могут быть преобразованы в шрифты PostScript Type 1. Создание векторных контуров штрихов пера Metafont нетривиально, поскольку модель глифа Metafont представляет собой растровое изображение, а точные очертания большинства штрихов не являются кривыми Безье.
Обычным подходом к созданию шрифтов типа 1 с помощью штрихов пера остается создание растрового изображения с высоким разрешением и последующее использование автотрейсера, реализованного такими пакетами, как mftrace и TeXtrace.