mf2ff mf2ff - это инструмент для создания векторных шрифтов из кода MetaFont с использованием Python API FontForge.
Он основан на концепции того, как Metafont может работать вместе с генератором векторного шрифта без обхода растровой трассировки, описанного ниже в разделе концепции MF2VEC. mf2ff является первой и, к знанию разработчика, единственной реализацией этой концепции на сегодняшний день.
Ниже вы найдете некоторую помощь о том, как его настроить и как его использовать.
Инструмент еще не был тщательно протестирован, но большинство распространенных команд Metafont поддерживаются. Помимо заполнения и рисунка, также поддерживаются некоторые команды лигатуры. Пожалуйста, посмотрите на ограничения, перечисленные ниже.
mf2ffmf2ff Вам нужно установить Fontforge и Metafont для использования mf2ff .
У вас могут возникнуть проблемы с запуском сценария mf2ff . Одна проблема может заключаться в том, что вам нужно запустить Python 3 с помощью модуля Fontforge. Ниже приведены несколько советов о том, как заставить его работать. Я не могу гарантировать, что это будет работать в вашей системе, но вы должны попробовать.
В различных операционных системах или конфигурациях системы, где приведенные ниже советы не работают, проверьте, присутствуют ли вы модуль Python и Fontforge Python:
ffpython , python3 , python ). Убедитесь, что информация о версии гласит, что вы запускаете Python 3 .import fontforge в пределах интерпретатора должен работать без ошибок.fontforge.font() не должен вызывать ошибку. Если это работает только в некоторых каталогах, вы должны проверить свой PATH или переменную PYTHONPATH . Для временного доступа к версии Python от Fontforge ffpython , Fontforge поставляется с пакетным файлом:
C:Program Files (x86)FontForgeBuilds ) и выполните fontforge-console.bat , поскольку команда set Windows 'изменяет переменную PATH только в сеансе текущей командной строки, FFPYTHON доступна только в каждом месте в командной строке, в которой был выполнен файл партии.Для постоянного доступа вам необходимо постоянно редактировать переменную пути:
environment variables и открывайте Edit the system environment variables . Нажмите на Environment variables и отредактируйте либо переменную PATH вашей учетной записи пользователя, либо на систему, если вам нужен доступ к ffpython на нескольких учетных записях пользователей. Теперь добавьте путь Fontforge (например C:Program Files (x86)FontForgeBuildsbin , возражайте за bin !) В список.ffpython теперь доступен во всех новых Windows командной строки, и вы сможете использовать ffpython path/to/mf2ff.py ... Чтобы легко получить доступ к сценарию mf2ff повсюду, сделайте следующее:
mf2ff к переменной PYTHONPATH . Если еще нет переменной PYTHONPATH , добавьте ее в список.mf2ff с ffpython -m mf2ff ... в новой командной строке.Ubuntu используется в этом примере.
Некоторые репозитории отправляют старые версии Fontforge с поддержкой Python 2. Вы можете построить Fontforge из источника:
sudo apt install libjpeg-dev libtiff5-dev libpng-dev libfreetype6-dev libgif-dev libgtk-3-dev libxml2-dev libpango1.0-dev libcairo2-dev libspiro-dev libuninameslist-dev python3-dev ninja-build cmake build-essentialsudo apt install gitgit clone https://github.com/fontforge/fontforge . Это создает fontforge/ Directory.fontforge/ Directory:cd fontforge; mkdir build; cd buildcmake -GNinja ..ninjasudo ninja installПримечание. Проверьте документацию Fontfore, если у вас есть проблемы с этим процессом.
Чтобы легко получить доступ к модулю Python Fontforge, добавьте его в свой PythonPath:
~/.profile File: export PYTHONPATH=$PYTHONPATH:/path/to/fontforge/ , где /path/to/fontforge/ каталог - это тот, который создан путем клонирования Fontforge с GIT, Eg $HOME/fontforge .python3 path/to/mf2ff.py ... в новых сеансах оболочки. ПРИМЕЧАНИЕ. В зависимости от конфигурации вашей системы вам необходимо ввести python вместо python3 для запуска Python 3.
Чтобы легко получить доступ к сценарию mf2ff от повсюду, добавьте его местоположение в переменную PythonPath:
~/.profile File: export PYTHONPATH=$PYTHONPATH:/path/to/mf2ff/ , где /path/to/mf2ff/ directory - это тот, где вы ставите файл mf2ff.py , например, $HOME/mf2ff/mf2ff .mf2ff с python3 -m mf2ff ... в новых сеансах оболочки.Примечание. В зависимости от того, какой DotFile вы используете, может быть достаточным перезагрузкой оболочки вместо перезагрузки.
В решении ниже используется домашний заправочный. Таким образом, Fontforge также доступен с Python:
brew install fontforge .python3 path/to/mf2ff.py ... в новых сеансах оболочки. ПРИМЕЧАНИЕ. В зависимости от конфигурации вашей системы вам необходимо ввести python вместо python3 для запуска Python 3.
Чтобы легко получить доступ к сценарию mf2ff от повсюду, добавьте его местоположение в переменную PYTHONPATH :
PYTHONPATH=$PYTHONPATH:/path/to/mf2ff/ .zsh . В вашем домашнем каталоге создайте или измените файл .zshenv .bash . В вашем домашнем каталоге создайте или измените файл .bash_profile .tcsh . В вашем домашнем каталоге создайте или измените соответствующий файл оболочки tcsh .mf2ff с python3 -m mf2ff ... в новых сеансах оболочки. По умолчанию mf2ff будет генерировать файл базы данных шрифтов сплайна (.SFD). Вы можете использовать параметры -ttf / mf2ff.options['ttf'] = True или -otf / mf2ff.options['otf'] = True для напряжения генерации шрифтов.
mf2ff не делает много очистки по умолчанию, так как вы можете вручную переделать глифы вручную. Вы можете использовать Options -cull-at-shipout / mf2ff.options['cull-at-shipout'] = True или -remove-artifacts / mf2ff.options['remove-artifacts'] = True для выполнения некоторой автоматизированной очистки. Обратите внимание, что команды Cull, которые являются частью определения глифа, могут привести к тому, что опция cull-at-shipout не внесет никаких дальнейших изменений для некоторых глифов.
Пожалуйста, посмотрите на ограничения, перечисленные ниже.
Основная идея концепции MF2VEC состоит в том, чтобы сделать MetaFont перенаправить геометрию Glyphs в другую программу (в случае mf2ff эта программа является FontForge) вместо того, чтобы использовать их для генерации растрового шрифта. Это возможно из -за того, что Metafont внутренне использует то же геометрическое описание, которое впоследствии необходимо в файлах векторных шрифтов - кривых Bézier.
Обход обхода изгиб, используемых некоторыми альтернативами преобразования кривых Bézier в растровую графику и обратно в кривые Bézier. Используя непосредственно геометрию, информация не теряется.
Поскольку вместо других инструментов, таких как Metapost, используется .mf , можно использовать файлы кода Metafont, а также не только геометрия, но и кодирование символов, размеры ящиков, информация о кернинге и лигатуре и т. Д. Поставляется в векторный шрифт без ручной работы.
Этот перехват информации осуществляется путем переопределения команд Metafont. Поскольку Metafont не может взаимодействовать с другими программами во время выполнения, интерпретация файла .mf и генерацию шрифта должны быть разделены во времени. Следовательно, информация Metafont будет использовать для создания растровой графики, сохраняется в файле журнала Metafont. Команды Metafont переопределены, так что Metafont записывает геометрию и свойства шрифта в своем файле журнала. После того, как Metafont обработал все команды файлов Metafont, информация считывается из файла журнала, обрабатывается для создания шрифта, а затем удаляется из файла журнала, чтобы убедить его.
Идея этого подхода появилась в октябре 2018 года. Чтобы проверить практическую реализацию для Fontforge, была немедленно реализована в Python, и диапазон поддерживаемых команд был постепенно расширен. Когда первоначальные тесты показали, что идея сработала, было решено сделать mf2ff доступным для других заинтересованных пользователей. Это происходит с марта 2019 года. После нескольких улучшений и исправлений ошибок разработка была приостановлена в течение нескольких лет. Из -за отзывов сообщества, разработка mf2ff была продолжена в июле 2023 года.
Основная идея
Концепция основана на переопределении основных команд Metafont. Они определяются таким образом, что информация, которую Metafont обычно использует для создания шрифта растрового изображения, записывается в файл журнала. Впоследствии этот файл журнала затем читается, и инструкции передаются в программу, генерирующую векторную шрифт из него. Например, mf2ff использует FontForge для этой цели. После этого информация, добавленная модифицированными командами Metafont, удаляется из файла журнала, чтобы убедить ее.
Следующая диаграмма иллюстрирует концепцию с использованием mf2ff в качестве примера.
┌──────────┐
│ font.mf │
└──────────┘
v
┌──────────┐ ┌───────────┐
│ │ > │ METAFONT │
│ │ └───────────┘
│ │ v
│ │ ┌───────────┐
│ mf2ff │ < │ font.log │
│ │ └───────────┘
│ │
│ │ ┌───────────┐
│ │ > │ FontForge │
└──────────┘ └───────────┘
v v
┌──────────┐ ┌─────────────────────┐
│ font.log │ │ font.ttf / font.otf │
└──────────┘ └─────────────────────┘
Простой пример
Добавление следующего кода в файл Metafont приведет к тому, что Metafont не fill контур c , а для записи операций в файл журнала:
def fill expr c =
message "fill"; show c;
enddef;
После того, как Metafont завершил обработку файла, сценарий анализирует файл журнала и знает, что была команда fill , и он знает, что контур будет заполнен. Эта информация может быть передана в программу обработки шрифтов, чтобы добавить ее в глиф.
На самом деле, этот процесс намного сложнее. Чтобы иметь возможность обрабатывать файлы Metafont, не основанные на простом метафонте, такие команды, как addto вместо fill команд, должны быть переопределены. Но эти команды addto более сложны; Они также формируют основу для других простых команд Metafont, таких как unfill , ( un ) draw , ( un ) drawdot и erase . Эти команды расширяются до нескольких ключевых слов contour разделяющих различные части информации, необходимые для выполнения этих различных операций ( also addto , doublepath , withpen , withweight ).
Еще одна проблема - толстая кишка в условиях и петлях. Эти структуры могут отображаться в любой другой команде, даже в командах, которые используют толстую кишку в качестве разделителя ( ligtable и fontdimen ), поэтому : должно быть переопределено, как и другие ключевые слова для вывода информации в файл журнала. В этих командах требуется сложное переключение между различными переопределениями толстой кишки.
В дополнение к этому, необходимо реализовать процесс, чтобы легко найти все команды в файле журнала, даже если в файле Metafont есть команды сообщений, не связанные с переопределением примитивов Metafont. Они не должны интерпретироваться как информация для генерации шрифтов. Поэтому вся информация, написанная в файле журнала, должна быть заключена в специальные ключевые слова, которые вряд ли будут использоваться в командах сообщений Metafont.
Metafont, разработанный De Knuth с 1977 года, представляет собой программу, которая генерирует растровые шрифты из файлов, написанных на языке Metafont. Растровые шрифты имеют невыгодное положение, что они размыты при увеличении. Metafont был разработан таким образом, чтобы для конкретного разрешения принтера был сгенерирован отдельный шрифт. В настоящее время векторные шрифты являются стандартными, которые не имеют этой проблемы при увеличении. Поэтому они более подходят для использования на дисплее. Более того, их можно использовать с каждым принтером без каких -либо ограничений.
Помимо подхода MF2VEC с mf2ff , представленным здесь, доступны следующие сценарии для преобразования файлов MetaFont в векторные шрифты:
| Имя | Метод |
|---|---|
| Метатип1 | Метапост |
| MF2PT1 | Метапост |
| mftrace | Расиджарная трассировка |
| Textrace | Расиджарная трассировка |
В этом контексте Metapost означает, что программа Metapost используется для преобразования каждого отдельного символа файла Metafont в векторную графику. После этого векторная графика собирается вместе, чтобы получить векторный шрифт. Этот метод имеет недостаток, который Metapost может обрабатывать только часть языка метафонта.
Отслеживание растрового изображения означает, что Metafont генерирует растровый шрифт в первую очередь. В отдельной программе прослеживается растровая карта каждого глифа, а затем собирается, чтобы получить векторный шрифт.
Каждый из методов имеет определенные недостатки. Пожалуйста, посмотрите на сравнение ниже для получения более подробной информации.
В следующей таблице показано сравнение доступных сценариев для преобразования файлов Metafont в векторные шрифты.
| Характеристика | Metafont | mf2ff | Метатип1 | MF2PT1 | mftrace | Textrace |
|---|---|---|---|---|---|---|
| Сценарий написан в | - | Питон 3 | Перв | Перв | Питон 2 | Перв |
| Обработка файлов Metafont | Metafont | Metafont | Метапост | Метапост | Metafont | Metafont |
| Последующая обработка | - | Fontforge | Awk / t1asm | T1asm | AutoTrace или Potrace / T1asm | Автотерация |
| Выходной формат | GF / TFM | ✅ TTF, OTF, SFD | ? PFB | ? PFB | ✅ AFM / PFA / PFB / TTF / SVG | ? PFB |
| Качество вывода | растровый карта | ✅ Vector Graphic | ✅ Vector Graphic | ✅ Vector Graphic | ? Прослеживаемая растровая карта | ? Прослеживаемая растровая карта |
| Переопределяет неприимтивы / требует непреднамеренных | ✅ Нет | ✅ Нет | Да | Да | ✅ Нет | ✅ Нет |
| Поддержка Unicode | Нет | ✅ Да | ❔ | Нет | Нет | Нет |
| Поддерживает Pen-Commands | ✅ Да | ? Ограничен | Нет | ? Ограничен | ✅ Да | ✅ Да |
| Поддерживает команды лигатуры и кернина | ✅ Да | ? Ограничен | ❔ | ❔ | ❔ | Нет |
| Поддерживает переменные шрифты | Нет | Нет, возможно в будущем | Нет | Нет | ❔ | Нет |
Ниже приведены некоторые примеры, созданные с mf2ff . Схемы и заполненные символы показаны, поскольку они отображаются в Fontforge. Обратите внимание, что результаты еще не идеальны.
Некоторые глифы компьютерных современных шрифтов еще не обработаны, т.е. средняя часть капитала S и sloped_serif в строчных буквах.

![]() | ![]() | ![]() |
Изображение слева было создано путем деактивации команд cull .
Стилизованное побережье красного дерева El Palo Alto, представленное на страницах 124-126 Metafontbook. В левой версии активируется опция cull-at-shipout . Поскольку ствол и самая верхняя ветвь имеют точку в ходе кривой, текущая реализация приводит к неправильным результатам.
![]() | ![]() | ![]() | ![]() |
Логотип, который представлен на странице 138, Metafontbook. В левой версии активируется опция cull-at-shipout . Заполненный логотип одинаковы в обоих случаях.
![]() | ![]() | ![]() |
mf2ff Поскольку mf2ff все еще находится в стадии разработки и не тщательно проверяется, есть несколько ограничений. Они могут быть рассмотрены в будущих обновлениях.
Если конкретное ограничение сдерживает ваш проект, откройте проблему, чтобы будущие обновления могли сосредоточиться на потребностях пользователей.
penrazor не поддерживается (см. Пример Dangerous_bend_symbol), Fontforge: «Ширина хода не может быть нулевой»penspeck повышает предупреждение, но в некоторых случаях вывод, кажется, в порядке.cull ограничена.: :: , kern , skipto , а также операторы лигатуры =: |=: =:| и |=:| поддерживаются. Команда Ligtable игнорирует > в операторах. Более того, оператор ||: не поддерживается.charlist , ни extensible команды еще не поддерживаются.picture должно быть переопределено, чтобы инициализация переменных изображения в виде векторного слоя Fontforge. Поскольку Metafont использует ключевые слова Type для обоих, объявление переменных и тест типа в логических выражениях, ключевое слово picture нельзя использовать для проверки, имеет ли переменную picture типа.makepen и makepath не имеют никакого эффекта. Ручки и путь нельзя различить, используя pen или path в логическом выражении. Существует опция is_type , которая вводит is_pen или is_path , которая может помочь вам обойти эту проблему.ligtable и fontdimenmf2ff необходимо переопределить толстую кишку ( : . Это может вызвать проблемы при обработке нескольких вложенных if ... ( elseif ) ... ( end ) ... fi и / или for / forsuffixes / forever ... endfor inder of Commands, которые используют толстую кишку в их собственном синтаксисе, то есть ligtable и fontdimen .charlist и extensibleЕсть несколько вещей, которые могут помочь. Имейте в виду, что я не понимаю их на 100%:
/usr/local/lib/python3/dist-packages в $PYTHONPATHexport PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3/dist-packages to ~/.profile )/usr/local/lib/python3.4/site-packages lib/python3.4/site-packages на путь Python