Метафонт

редактировать
Метафонт
МЕТАФОНТ logo.svg
Разработчики) Дональд Кнут
Стабильный выпуск 2.71828182 / январь 2021 г. ; 9 месяцев назад (2021-01)
Операционная система Кроссплатформенность
Тип Компьютерный язык
Лицензия Разрешительный

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

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

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

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

СОДЕРЖАНИЕ

  • 1 Режимы работы
    • 1.1 Выходные файлы
  • 2 Язык
    • 2.1 Переменные и уравнения
    • 2.2 Синтаксис
    • 2.3 Графика
  • 3 Использование
  • 4 История
  • 5 Пример
  • 6 Создание шрифтов PostScript Type 1
  • 7 См. Также
  • 8 Примечания
  • 9 ссылки
    • 9.1 Источники
  • 10 Внешние ссылки

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

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

  • NAME.NNNNgf - файл с растровым выводом с разрешением NNNN (по умолчанию 2602).
  • NAME.tfm - файл с метрической информацией шрифта TeX, которая является информацией, необходимой TeX. Обычно нужно указать метафонту, чтобы он сгенерировал этот файл.
  • NAME.log - вывод файла журнала из обработки

После запуска Metafont обычно используется программа gftopk для преобразования файлов NNNNgf в формат pk (упакованный) (.NNNNpk). Формат pk был в первую очередь введен для уменьшения размера файла (примерно до половины), но ожидалось, что он также ускорит обработку, поскольку для ввода / вывода потребуется меньше данных. Оба формата GF и PK используют кодирование длин серий растровых изображений, но делают разные двоичные кодировки длин серий. Формат PK также выполняет некоторую предварительную обработку растровых изображений (ограничивающий прямоугольник, исключение повторяющихся строк) и кодирует все строки символа как одну длинную последовательность битов.

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

Язык

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

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

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

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

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

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

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

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

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-файл должен выглядеть так: Tex mf beta.pdf

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

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

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

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

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

Примечания

использованная литература

Источники

внешние ссылки

Последняя правка сделана 2024-01-02 08:24:39
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте