Метафонт - Metafont

Метафонт
МЕТАФОНТ logo.svg
Разработчики)Дональд Кнут
Стабильный выпуск
2.7182818 / январь 2014; 6 лет назад (2014-01)
Операционная системаКроссплатформенность
ТипКомпьютерный язык
ЛицензияРазрешительный
Интернет сайтwww.CTAN.org Отредактируйте это в Викиданных

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

Одна из характеристик Metafont заключается в том, что точки, определяющие формы глифы - например, вершина корень, или пересечение ствола и перекладины - определяются геометрическими уравнениями; Намерение, что три основы буквы "m" расположены на одинаковом расстоянии по горизонтали, может быть выражено как если точки 1, 2 и 3 находятся на нижних концах трех стержней, тогда как намерение, чтобы все они заканчивались в одном и том же вертикальном положении, было бы . Еще одна особенность заключается в том, что Metafont - это макрос язык, где такие операции, как «нарисовать верхнюю часть нижнего регистра основной засечек в точке 4», могут отображаться в программе как одна макро-инструкция (с точкой в ​​качестве аргумента) для буквы. Для описания форм в Metafont есть богатый набор дорожка строительные работы, которые в основном избавляют пользователя от необходимости вычислять контрольные точки. Наконец, многие семейства шрифтов Metafont настроены таким образом, что основной исходный файл шрифта определяет только небольшое количество параметров дизайна (x-высота, ширина em, наклон, ширина вертикального штриха и т. д.), а затем вызов отдельного исходного файла, общего для всего диапазона шрифтов, для фактического рисования отдельных глифов; это мета аспект системы.

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

Учебное пособие по METAFONT, v. 0.33

Метафонт чаще всего запускается как помощник для драйверов устройств вывода (принтер, экран); в этих случаях его задача - генерировать растровые изображения для шрифта для конкретной комбинации устройства вывода (называемого Режим в 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 и Асимптота предпочтительны для математических иллюстраций. Метафонт чаще всего запускается без прямого запроса пользователя. Файлы DVI может содержать только ссылки на гарнитуры шрифтов, а не наборы растровых или векторных глифов, которые допускаются в других форматах, например PostScript. Следовательно, к глифам в гарнитурах необходимо обращаться всякий раз, когда делается запрос на просмотр, печать или преобразование файла DVI.

Выходные файлы

Metafont выводит несколько типов файлов: для файла с именем NAME.mf он может выводить:

  • NAME.NNNNgf - файл с растровым выводом с разрешением NNNN (по умолчанию 2602).
  • NAME.tfm - файл с Метрика шрифта TeX информация, которая нужна TeX. Обычно нужно указать метафонту, чтобы он сгенерировал этот файл.
  • 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 ). Это значение по умолчанию для переменных, не объявленных как принадлежащие к другому типу.
  • Пара: пара чисел, используемая в основном для представления точек на плоскости.
  • Путь: как в PostScript /PDF /SVG, а параметрическая кривая на плоскости, координатные функции которой равны кусочно кубические многочлены. Как и в других системах, сегменты пути кодируются как Кривые Безье с точки зрения узлов и контрольных точек.
  • Преобразование: аффинное преобразование плоскости, что эквивалентно «матрице (преобразования)» в PostScript / PDF.
  • Перо: выпуклый многоугольник, представляющий форму «пера», используемого для рисования.
  • Картина: а растровое изображение с целым числом со знаком для каждого пикселя.
  • Булево
  • Строка (из 8-битных символов)

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

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

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

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

Синтаксис

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

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

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

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

Графика

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

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

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

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

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

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

История

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

Пример

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

% имя файла: beta.mf% mode_setup;% Определите бобообразную форму для символа Bbeginchar("B",11pt#,11pt#,0);  % Установить координаты как систему уравнений  y1=y2=y3=0;  y4=y5=y6=час;  x1=x4=0;  x2=x5=ш;  x3=x6=2*ш;  % Определить перо  подбирать карандаш xscaled 0,2 Вт масштабированный 0,04 Вт повернутый 45;  % Нарисуйте кривую персонажа  % z1 совпадает с (x1, y1)  рисовать z1..z3..z6 {z2-z6} .. z5 .. {z4-z2} z4..cycle;конец;конец

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

Метафон-пример-output.svg

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

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

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

 documentclass{статья} newfont{ letterbeta}{бета} newcommand{ otherbeta}{{ letterbeta B}}начинать{документ}Попробуем странную  otherbeta  здесь.конец{документ}

В результате PDF-файл должен выглядеть так:Tex mf beta.pdf

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

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

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

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

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

Примечания

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

Рекомендации

  1. ^ Рокицки, Томас (1985). «Упакованный (PK) формат файла шрифтов» (PDF). ТУГбоат. 6 (3): 115–120. Получено 2019-08-09.
  2. ^ Кнут, Дональд (1986). МЕТАФОНТбук. Эддисон Уэсли. 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.
  7. ^ «Кнут: компьютеры и набор текста».
  8. ^ а б Кристоф Грансир. "Учебное пособие по МЕТАФОНТ".
  9. ^ "CTAN: текс-архив / шрифты / утилиты / metatype1".
  10. ^ "CTAN: tex-archive / support / mf2pt1".
  11. ^ "Р. Дж. Кинч," MetaFog: преобразование форм Metafont в контуры ", ТУГбоат 16(3), 233–43 (1995)" (PDF).
  12. ^ К. Пишка, 2004 г.
  13. ^ mftrace - небольшая программа на Python, которая позволяет преобразовать растровый шрифт TeX в шрифт PFA или PFB (масштабируемый шрифт PostScript Type1) или шрифт TTF (TrueType). Он находится под лицензией GNU GPL. Создано Han-Wen Nienhuys. Версии до 1.0.5 назывались «pktrace».
  14. ^ TeXtrace - набор скриптов для UNIX, которые преобразуют любой шрифт TeX в контурный шрифт Type1 .pfb, который сразу же подходит для использования с dvips, pdftex, acroread (и многими другими программами). Создано Питером Сабо.

Источники

внешняя ссылка