Метафонт

Язык описания, используемый для определения растровых шрифтов
Метафонт
Разработчик(и)Дональд Кнут
Стабильный релиз
2.71828182 / Январь 2021 ; 4 года назад ( 2021-01 )
Операционная системаКроссплатформенный
Типкомпьютерный язык
ЛицензияРазрешительный

Metafont — это язык описания, используемый для определения растровых шрифтов . Это также название интерпретатора , который выполняет код Metafont, генерируя растровые шрифты, которые могут быть встроены, например, в PostScript . Metafont был разработан Дональдом Кнутом в качестве дополнения к его системе набора TeX .

Одной из особенностей Metafont является то, что точки, определяющие формы глифов , например, вершина стержня или пересечение стержня и перекладины, определяются с помощью геометрических уравнений; намерение, чтобы три стержня буквы «m» были равномерно распределены по горизонтали, можно выразить так, как если бы точки 1, 2 и 3 находились на нижних концах трех стержней, тогда как намерение, чтобы все они заканчивались в одной и той же вертикальной позиции, было бы . х 2 х 1 = х 3 х 2 {\displaystyle x_{2}-x_{1}=x_{3}-x_{2}} у 1 = у 2 = у 3 {\displaystyle y_{1}=y_{2}=y_{3}}

Metafont — это макроязык , в котором такие операции, как «нарисовать верхний нижний регистр засечки в точке 4», могут отображаться как одна макроинструкция (с точкой в ​​качестве аргумента) в программе для буквы. Для описания фигур Metafont имеет богатый набор операций построения пути , что в основном избавляет пользователя от необходимости вычислять контрольные точки.

Многие семейства шрифтов Metafont настроены таким образом, что основной исходный файл для шрифта определяет только небольшое количество параметров дизайна ( x-height , em width, slant, vertical stroke width и т. д.), а затем вызывает отдельный исходный файл, общий для целого ряда шрифтов, для фактической отрисовки отдельных глифов; это метааспект системы .

Режимы работы

Metafont чаще всего запускается как помощник для драйверов устройств вывода (принтера, экрана); в этих случаях его работа заключается в создании растровых изображений для шрифта для определенной комбинации устройства вывода (называемого режимом в Metafont) и разрешения (видимого в имени выходного файла, см. ниже). Эти растровые изображения обычно сохраняются для последующего повторного использования, так что Metafont не нужно запускать каждый раз при отображении документа, но, с другой стороны, дистрибутивы TeX с компонентом Metafont обычно не включают никаких готовых растровых шрифтов, поскольку они были бы довольно большими по сравнению с источниками, из которых они могли быть сгенерированы. Поскольку шрифты Metafont традиционно были шрифтами TeX по умолчанию, из которых другие форматы шрифтов были исключениями, неполная установка шрифта, не относящегося к Metafont, иногда может приводить к вызову Metafont и выдаче запутанного сообщения об ошибке « somefont .mf not found».

Не менее важным, но не таким распространенным, является запуск Metafont для генерации файла метрики шрифта (TFM); файл TFM генерируется только в том случае, если переменная fontmaking положительна. Традиционно дистрибутивы TeX часто поставляются со всеми предварительно сгенерированными файлами TFM (так как они довольно малы), но тот, кто устанавливает шрифт Metafont из исходников, должен будет сгенерировать его файл TFM, прежде чем TeX сможет его использовать.

Третий способ работы Metafont — режим проверки : если переменная проверки положительна, то файл растрового шрифта также содержит дополнительную информацию, предоставленную через specialкоманды, в частности, позиции и названия точек, которые дизайнер шрифта посчитал важными для дизайна. При использовании отдельной gftodviутилиты для генерации увеличенных изображений глифов шрифта эта информация из specials включается; позиции точек не ограничиваются разрешением в пикселях.

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 (упакованный) (.NNNNpk). Формат pk был в первую очередь введен для уменьшения размера файла (примерно вдвое), но также ожидалось, что он ускорит обработку, поскольку в этом случае придется вводить/выводить меньше данных . Форматы GF и PK используют кодирование длин серий растровых изображений, но создают разные двоичные кодировки длин серий. Формат PK также выполняет некоторую предварительную обработку растровых изображений (ограничивающий прямоугольник, исключение повторяющихся строк) и кодирует все строки символа как одну длинную битовую последовательность. [1]

В стандарте структуры каталогов TeX имена файлов ограничены 8+3 символами, поэтому файлы GF и PK будут иметь только расширения .gfи .pk. Файлы для разных разрешений хранятся отдельно, помещая их в отдельные каталоги с именами dpiNNNN, например dpi300/cmr10.pk.

Язык

Язык Metafont — это интерпретируемый язык для программ, которые по сути являются декларативными , а не императивными . [2]

Переменные и уравнения

Переменные в Metafont могут быть восьми различных типов:

  • Числовые: числа с фиксированной точкой и знаком с эпсилоном , ограниченные значением менее 4096 ( Q12.16 ). Это значение по умолчанию для переменных, не объявленных как имеющие другой тип. 2 16 {\displaystyle 2^{-16}}
  • Пара: пара чисел, используемых в основном для представления точек на плоскости.
  • Path: как в PostScript / PDF / SVG , параметрическая кривая на плоскости, координатные функции которой являются кусочно -кубическими полиномами. Как и в этих других системах, сегменты пути кодируются как кривые Безье в терминах узлов и контрольных точек.
  • Преобразование: аффинное преобразование плоскости, эквивалентное «матрице (преобразования)» в PostScript/PDF.
  • Перо: выпуклый многоугольник, представляющий собой форму «пера», используемого для рисования.
  • Рисунок: растровое изображение со знаковым целочисленным значением для каждого пикселя.
  • Булев
  • Строка (из 8-битных символов)

Metapost добавляет цвет (тройку чисел) как девятый тип и имеет совершенно иную (не растровую) модель для изображений; последнее является основной точкой расхождения между двумя программами. Макросы Metafont vardef также находятся в том же пространстве имен, что и переменные, и в некотором смысле могут рассматриваться как девятый тип переменных, хотя макросы не существуют как значения первого класса в Metafont.

Необычно, что имена переменных не являются простыми токенами, а последовательностями символических токенов и числовых индексов; x2rтаким образом, имя переменной представляет собой не один буквенно-цифровой токен, а последовательность из трех токенов x(символический), 2(числовой) и r(символический). Типы записей и массивов могут быть смоделированы с помощью коллекций переменных, которые имеют общий префикс имени, идиома, поддерживаемая системой объявления типов, дающая всем переменным, имена которых отличаются только числовыми индексами, один и тот же тип (как и ожидается для массивов), при этом сохраняя переменные, все имена которых отличаются некоторым символическим токеном, отдельными (как и ожидается для записей).

Очень отличительной особенностью Metafont является использование уравнений для определения переменных. Числовая переменная (или компонент пары или переменной преобразования) может находиться в трех состояниях: известное (установлено), неизвестное независимое (не установлено) и неизвестное зависимое (не установлено, но задано линейным выражением одной или нескольких независимых). Когда Metafont выполняет оператор уравнения, он превращает одну из задействованных независимых переменных в зависимую и исключает ее из выражений для всех других зависимых переменных; когда в выражении для зависимой переменной не остается независимых переменных, эта переменная становится известной. Таким образом, решение систем линейных уравнений является встроенной функцией языка Metafont, и рекомендуемый метод назначения большинства переменных (особенно тех, значения которых имеют геометрическое значение) заключается в том, чтобы указать уравнения, определяющие их значения. Системы уравнений часто смешивают числовые (скалярные) уравнения с парными (векторными) уравнениями.

Исключением из вышесказанного является класс внутренних количественных переменных. Они имеют имена, состоящие всего из одного символического токена, всегда числовые и всегда известны. Они имеют более прямое внутреннее представление, чем обычные переменные, что делает их удобными для примитивных операций в Metafont (или его расширениях) для неявного использования.

Синтаксис

Metafont имеет числовые и строковые константные токены с общепринятыми синтаксисами; строки разделяются кавычками ", числовые константы могут иметь десятичные знаки, но не экспоненциальную часть . Все остальные токены классифицируются как символьные и могут быть переопределены произвольно; нет ограничений, что токены с определенными значениями должны иметь имена, состоящие из определенных символов. Во время выполнения могут быть дополнительно капсульные токены, которые фактически являются токенами постоянного значения произвольного типа; в исходном коде они отображаются как символьные токены.

За исключением случаев, когда символы участвуют в числовых или строковых константах, размер токена, содержащего конкретный символ, зависит от того, к какому классу принадлежит символ; в отличие от TeX , Metafont имеет фиксированные классы символов. Символы ,, ;, (, и )являются «одиночными» и образуют только односимвольные токены. Для классов символов <=>:|, ‘’(одинарные кавычки), +-, /*\, !?, #&@$, ^~, [, ], {}, и ., а также класса подчеркивания вместе с заглавными и строчными буквами A–Z, токен состоит из самой длинной последовательной последовательности символов из того же класса. Пробельные символы не вносят токенов. %начинает комментарий, длящийся до конца строки.

Примечательным применением этих правил является то, что #они часто появляются как часть имен переменных в коде Metafont, например em#и pt#.

Разделители (например, скобки) не имеют встроенных значений, вместо этого есть команда, которая превращает два символических токена в пару соответствующих разделителей, но обычно программы Metafont используют только обычные скобки. Помимо переопределения приоритетов в выражениях, разделители также требуются вокруг определенных видов аргументов макросов.

Графика

Кривые в Metafont определяются как кубические сплайны , а не квадратичные, для большей универсальности за счет более сложной арифметики. [3]

В отличие от более распространенных форматов контурных шрифтов (таких как TrueType или PostScript Type 1 ), шрифт Metafont в основном состоит из штрихов с «перьями» конечной ширины, а также заполненных областей. Таким образом, вместо того, чтобы описывать контур глифа напрямую, файл Metafont описывает пути пера. Некоторые более простые шрифты Metafont, такие как каллиграфические математические шрифты в семействе Computer Modern , используют один штрих пера с относительно большим пером для определения каждого визуального «штриха» глифов. Более сложные шрифты, такие как римские текстовые шрифты в семействе Computer Modern, используют небольшое перо для обводки вокруг контура визуальных «штрихов», которые затем заполняются; результат очень похож на контурный шрифт, но со слегка смягченными углами, определяемыми формой пера.

Поскольку формы шрифта определяются уравнениями, а не напрямую закодированными числами, можно обрабатывать такие параметры, как соотношение сторон, наклон шрифта, ширина штриха, размер засечек и т. д., как входные параметры в каждом определении глифа (которые затем определяют не один шрифт, а меташрифт ) . Таким образом, изменяя значение одного из этих параметров в одном месте в файле Metafont, можно добиться последовательного изменения во всем шрифте. Computer Modern Roman иллюстрирует множество вариантов использования этой функции; типичная установка TeX включает в себя несколько версий шрифта с шагом от 5 до 17 cpi, при этом ширина штриха одинакова во всех размерах (а не увеличивается по мере увеличения масштаба шрифта). Кроме того, шрифты Computer Modern и sans-serif определяются с использованием по сути того же файла Metafont, что и шрифт Roman, но с другими глобальными параметрами.

Использовать

Хотя известные дизайнеры шрифтов, такие как Герман Цапф , сотрудничали с Кнутом для создания новых шрифтов с использованием Metafont, система не получила широкого распространения среди профессиональных дизайнеров шрифтов. Кнут объясняет это тем, что «требовать от художника стать достаточно математиком, чтобы понять, как написать шрифт с 60 параметрами, — это слишком». [4] Джонатан Хёфлер прокомментировал, что система Metafont в конечном итоге стала «технологией, стоящей за нулем ваших любимых шрифтов... Идея Кнута о том, что буквы начинаются со скелетных форм, ошибочна». [5] [ требуется лучший источник ]

Система Metafont позволяет обрабатывать шрифты необычными способами; в 1982 году Кнут показал, как ее можно использовать для морфинга шрифтов, при этом шрифт с засечками постепенно переходит в шрифт без засечек на протяжении всего текста. [6]

История

Дональд Кнут начал работу над программным обеспечением для создания шрифтов в 1977 году и выпустил первую версию Metafont в 1979 году. Из-за недостатков в исходном языке Metafont, Кнут разработал совершенно новую систему Metafont в 1984 году, и именно эта переработанная система используется сегодня; Metafont имеет систему управления версиями, похожую на систему TeX , где число асимптотически приближается к e с каждой ревизией. [7]

Пример

В следующем примере создается замкнутая фасолевая форма для символа «B» шрифта:

%имя файла: beta.mf %mode_setup; % Определить фасолевоподобную форму для символа B beginchar ( "B" , 11 pt # , 11 pt # , 0 ); % Установить координаты в виде системы уравнений y1 = y2 = y3 = 0 ; y4 = y5 = y6 = h ; x1 = x4 = 0 ; x2 = x5 = w ; x3 = x6 = 2 * w ;       % Определить захват пера pencircle xscaled 0.2 w yscaled 0.04 w rotated 45 ;         % Рисуем кривую символа % z1 совпадает с (x1, y1) draw z1 .. z3 .. z6 { z2 - z6 }.. z5 ..{ z4 - z2 } z4 .. cycle ; endchar ;   конец

Это дает следующий глиф:

Приведенный выше пример будет обработан с помощью командной строки, например: [8]

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

Затем его можно использовать в файле LaTeX, например, следующим образом [8] (все файлы должны находиться в одном каталоге, или система TeX должна быть уведомлена о них с помощью соответствующих методов):

\documentclass { статья }\newfont { \letterbeta }{ beta } \newcommand { \otherbeta }{{ \letterbeta B }}\begin { document }
Давайте попробуем создать здесь странную \otherbeta\ . \end { document }

Полученный PDF-файл должен выглядеть следующим образом:

Создание шрифтов PostScript Type 1

Существует несколько инструментов для преобразования программ Metafont в шрифты PostScript Type 1. Большинство из них используют способность MetaPost преобразовывать подмножество языка Metafont в контуры EPS , которые впоследствии можно преобразовать в шрифты PostScript Type 1. Создание векторных контуров штрихов пера Metafont — нетривиальная задача, поскольку модель глифа Metafont представляет собой растровое изображение, а точные контуры большинства штрихов не являются кривыми Безье . [примечание 1]

  • Польская команда JNS разработала METATYPE1 [9] (на основе MetaPost) для создания шрифтов PostScript Type 1. Его большим недостатком является то, что нельзя использовать перья, что значительно снижает мощность языка Metafont. Первоначально инструмент использовался польской литейной фабрикой шрифтов GUST для создания модернизированного и расширенного варианта Computer Modern , называемого Latin Modern .
  • mf2pt1, [10] , который также основан на Metapost, был разработан Скоттом Пакином с некоторыми вкладами Вернера Лемберга. Он также имеет несколько ограничений, подробно описанных в его руководстве, наиболее существенным из которых является ограничение, что каждый глиф должен быть нарисован полностью из замкнутых контуров. Чтобы преодолеть ограничения mf2pt1, вывод EPS Metapost может быть подвергнут постобработке с помощью FontForge , который способен интерпретировать сложные пути PostScript, созданные Metapost из эллиптических перьев Metafont, а также способен удалять перекрытия контуров. Поскольку FontForge поддерживает скрипты, этот шаг постобработки также может быть автоматизирован. Этот подход использовался для создания контуров Type 1 для математического шрифта MnSymbol, разработанного Ахимом Блюменсатом; MnSymbol был разработан как дополнение к Minion Pro .
  • MetaFog [11] — это фирменный конвертер, который может аналитически преобразовывать штрихи пера, но он требует ручной постобработки для устранения вырожденных случаев, и он не является общедоступным. Он может обрабатывать только вывод Metapost. [12]

Распространенным подходом к созданию шрифтов Type 1 с помощью штрихов пера остается создание растрового изображения высокого разрешения и последующее использование автотрассировщика , реализованного в таких пакетах, как mftrace [13] и TeXtrace [14].

Смотрите также

Примечания

  1. ^ Технически Metafont генерирует векторные контуры как промежуточный шаг растрирования штриха, но эти промежуточные контуры адаптированы к текущему разрешению растра и не являются простыми, как кривые, поэтому они очень далеки от возможности использования в качестве контуров Type 1. Эффектом непростоты являются ложные пиксели на вогнутой стороне штриха, которые получают значение 2, а не 1, однако автоматическая отбраковка изображений, отправляемых как глифы в шрифте, обычно предотвращает их отображение в конечном растровом изображении.

Ссылки

  1. ^ Рокицкий, Томас (1985). «Packed (PK) Font File Format» (PDF) . TUGboat . 6 (3): 115– 120. Архивировано (PDF) из оригинала 2011-11-06 . Получено 2019-08-09 .
  2. ^ Кнут, Дональд (1986). METAFONTbook . Эддисон Уэсли. ISBN 0-201-13445-4.
  3. ^ Кнут, Дональд (25 января 2000 г.). "Интервью: Дональд Э. Кнут" (Интервью). Интервью взято Advogato. Архивировано из оригинала 22 января 2009 г. Получено 13 января 2016 г. ... математика для квадратного уравнения действительно проста. Соответствующее уравнение для кубического уравнения в шесть раз сложнее...
  4. ^ CSTUG, Карлов университет, Прага, март 1996 г., Вопросы и ответы с профессором Дональдом Э. Кнутом, воспроизведено в TUGboat 17 (4) (1996), 355–67. Цитата со страницы 361. Доступно онлайн по адресу [1]
  5. ^ Хёфлер, Джонатан. «Идея Кнута о том, что буквы начинаются со скелетных форм, ошибочна. Но его работа важна и оказала долгосрочное влияние». Twitter . Получено 18 августа 2018 г.
  6. ^ Кнут, Дональд (1982). «Концепция меташрифта» (PDF) . Видимый язык . 16 (1): 3–27 . Архивировано из оригинала (PDF) 2020-07-07.
  7. ^ «Кнут: Компьютеры и набор текста».
  8. ^ аб Кристоф Грансир. «Урок МЕТАФОНТ».
  9. ^ "CTAN: tex-archive/fonts/utilities/metatype1".
  10. ^ "CTAN: tex-archive/support/mf2pt1".
  11. ^ "RJ Kinch, "MetaFog: преобразование фигур Metafont в контуры", TUGboat 16(3), 233–43 (1995)" (PDF) . Архивировано (PDF) из оригинала 2000-10-05.
  12. ^ К. Пишка, 2004
  13. ^ mftrace – небольшая программа на Python, которая позволяет трассировать растровый шрифт TeX в шрифт PFA или PFB (масштабируемый шрифт PostScript Type1) или шрифт TTF (TrueType). Лицензируется по GNU GPL. Создано Хан-Веном Ниенхейсом. Версии до 1.0.5 назывались «pktrace».
  14. ^ TeXtrace – набор скриптов для UNIX, которые преобразуют любой шрифт TeX в контурный шрифт Type1 .pfb, который сразу же можно использовать с dvips, pdftex, acroread (и многими другими программами). Создано Питером Сабо.

Источники

  • Дональд Кнут : Metafont: Программа , Addison-Wesley 1986. ISBN 0-201-13438-1 
  • Дональд Кнут: The Metafontbook , Addison-Wesley 1986. ISBN 0-201-13444-6 . Исходный код книги в TeX (и необходимый макрос) доступен онлайн на CTAN . 
  • Дональд Кнут: Исходный код Metafont написан на языке программирования WEB и включает в себя очень подробную документацию об алгоритмах, используемых в Metafont.
  • Яннис Хараламбус, «Шрифты и кодировки», O'Reilly 2007, ISBN 0-596-10242-9 , Приложение F: «METAFONT и его производные» 
  • К. Пишка, «Создание шрифтов Type 1 из источников Metafont: сравнение инструментов, методов и результатов», в TeX, XML и цифровая типографика (Springer-Verlag, Берлин, 2004), Lect. Notes Comput. Sci., том 3130, стр. 240–56. препринт
  • Хофштадтер, Дуглас Р., «Меташрифт, метаматематика и метафизика: комментарии к статье Дональда Кнута «Концепция меташрифта»» , Visible Language , т. XVI, № 4, стр. 309–338 (переиздано в книге Хофштадтера «Метамагические темы» , Нью-Йорк: Basic Books, 1985)
  • Учебное пособие по Metafont (PDF). Кристоф Грансир, 2004.
Взято с "https://en.wikipedia.org/w/index.php?title=Metafont&oldid=1255466797"