mf2ff mf2ff Fontforge의 Python API를 사용하여 Metafont 코드에서 벡터 글꼴을 생성하는 도구입니다.
MF2VEC 개념 섹션에 설명 된 비트 맵 추적을 우회하지 않고 Metafont가 벡터 글꼴 생성기와 함께 작동 할 수있는 개념을 기반으로합니다. mf2ff 는 최초이며 개발자의 지식에 따르면 현재 까지이 개념의 유일한 구현입니다.
아래에서 설정하는 방법과 사용 방법에 대한 도움이 있습니다.
이 도구는 아직 철저히 테스트되지 않았지만 대부분의 일반적인 Metafont 명령이 지원됩니다. 채우기 및 그리기 외에도 Kerning 및 일부 합자 명령이 지원됩니다. 아래에 나열된 제한 사항을 살펴보십시오.
mf2ffmf2ff 의 현재 한계 mf2ff 사용하려면 Fontforge 및 Metafont를 설치해야합니다.
mf2ff 스크립트를 실행하는 데 문제가있을 수 있습니다. 한 가지 문제는 Fontforge 모듈로 Python 3을 실행해야한다는 것입니다. 다음은 작동하는 방법에 대한 몇 가지 팁입니다. 나는 이것이 당신의 시스템에서 작동한다는 것을 보장 할 수는 없지만 시도해 볼 수 있어야합니다.
아래 팁이 작동하지 않는 다른 운영 체제 또는 시스템 구성에서 Python 및 Fontforge의 Python 모듈을 사용하는지 확인하십시오.
ffpython , python3 , python )을 실행하십시오. 버전 정보에 Python 3 실행하고 있음을 확인하십시오.import fontforge 오류없이 작동해야합니다.fontforge.font() 오류를 제기해서는 안됩니다. 이것이 일부 디렉토리에서만 작동하는 경우 PATH 또는 PYTHONPATH 변수를 확인해야합니다. Fontforge의 Python 버전 ffpython 에 대한 임시 액세스를 위해 Fontforge는 배치 파일과 함께 제공됩니다.
C:Program Files (x86)FontForgeBuilds )로 이동하여 fontforge-console.bat Windows의 명령이 현재 명령 프롬프트 세션에서만 PATH 변수를 변경하므로 FfpyThon은 set 파일이 실행 된 명령 프롬프트의 모든 위치에서만 사용할 수 있습니다.영구 액세스하려면 경로 변수를 영구적으로 편집해야합니다.
environment variables 검색하고 Edit the system environment variables . Environment variables 클릭하고 여러 사용자 계정에서 ffpython 에 액세스 해야하는 경우 사용자 계정의 PATH 변수 또는 시스템 중 하나를 편집하십시오. 이제 Fontforge의 경로 (예 : C:Program Files (x86)FontForgeBuildsbin , 마음을 bin !) 추가하십시오.ffpython 은 이제 모든 새로운 명령 프롬프트 Windows에서 사용할 수 있으며 ffpython path/to/mf2ff.py ... 어디에서나 mf2ff 스크립트에 쉽게 액세스하려면 다음을 수행하십시오.
mf2ff 의 경로를 PYTHONPATH 변수에 추가하십시오. 아직 PYTHONPATH 변수가 없으면 목록에 추가하십시오.ffpython -m mf2ff ... 사용하여 mf2ff 실행할 수 있어야합니다.이 예에서는 우분투가 사용됩니다.
일부 리포지토리는 Python 2 지원을 통해 오래된 버전의 Fontforge를 배송합니다. 소스에서 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의 문서를 확인하십시오.
Fontforge의 Python 모듈에 쉽게 액세스하려면 PythonPath에 추가하십시오.
~/.profile 파일의 끝에 다음 줄을 넣으십시오. export PYTHONPATH=$PYTHONPATH:/path/to/fontforge/ , /path/to/fontforge/ directory는 git, eg $HOME/fontforge 로 fontforge를 클로닝하여 만든 것입니다.python3 path/to/mf2ff.py ... 사용할 수 있어야합니다. 참고 : 시스템 구성에 따라 Python 3을 실행하려면 python3 대신 python 입력해야합니다.
어디에서나 mf2ff 스크립트에 쉽게 액세스하려면 위치를 PythonPath 변수에 추가하십시오.
~/.profile 파일의 끝에 이것을 넣으십시오 : export PYTHONPATH=$PYTHONPATH:/path/to/mf2ff/ , 여기서 /path/to/mf2ff/ directory는 mf2ff.py 파일을 넣는 곳입니다. eg $HOME/mf2ff/mf2ff .python3 -m mf2ff ... 로 항상 mf2ff 쉽게 실행할 수 있습니다.참고 : 사용중인 DotFile에 따라 재부팅 대신 쉘을 다시 시작하면 충분할 수 있습니다.
아래 솔루션은 홈브류를 사용합니다. 이런 식으로 Fontforge는 파이썬으로도 액세스 할 수 있습니다.
brew install fontforge 실행하십시오.python3 path/to/mf2ff.py ... 사용할 수 있습니다. 참고 : 시스템 구성에 따라 Python 3을 실행하려면 python3 대신 python 입력해야합니다.
어디에서나 mf2ff 스크립트에 쉽게 액세스하려면 위치를 PYTHONPATH 변수에 추가하십시오.
PYTHONPATH=$PYTHONPATH:/path/to/mf2ff/ 로 추가하십시오.zsh 사용할 수 있습니다. 홈 디렉토리에서 .zshenv 파일을 만들거나 수정하십시오.bash 사용할 수 있습니다. 홈 디렉토리에서 파일 .bash_profile 파일을 만들거나 수정하십시오.tcsh 사용할 것입니다. 홈 디렉토리에서 tcsh 쉘의 해당 파일을 만들거나 수정하십시오.python3 -m mf2ff ... 로 mf2ff 실행할 수 있습니다. 기본적으로 mf2ff 스플라인 글꼴 데이터베이스 (.SFD) 파일을 생성합니다. 옵션 -ttf / mf2ff.options['ttf'] = True 또는 -otf / mf2ff.options['otf'] = True 사용할 수 있습니다.
mf2ff 기본적으로 많은 정리를 수행하지 않으므로 글리프를 수동으로 재 작업하고 싶을 수도 있습니다. 옵션 -cull-at-shipout / mf2ff.options['cull-at-shipout'] = True 또는 -remove-artifacts / mf2ff.options['remove-artifacts'] = True 사용할 수 있습니다. Glyph 정의의 일부인 Cull 명령은 cull-at-shipout 옵션이 일부 글리프에 대해 추가 변경을 수행하지 않을 수 있습니다.
아래에 나열된 제한 사항을 살펴보십시오.
MF2VEC 개념의 주요 아이디어는 Metafont를 Glyphs의 형상을 다른 프로그램 ( mf2ff 의 경우이 프로그램의 경우 Fontforge입니다)을 사용하여 비트 맵 글꼴을 생성하는 것입니다. 이는 Metafont가 내부적으로 동일한 기하학적 설명을 사용하여 벡터 글꼴 파일 (Bézier 곡선)에 필요하기 때문에 가능합니다.
Bézier 곡선을 래스터 그래픽으로 변환하고 Bézier 곡선으로 돌아가는 일부 대안에 의해 사용되는 우회는 우회됩니다. 형상을 직접 사용하면 정보가 손실되지 않습니다.
Metafont가 Metapost와 같은 다른 도구 대신 .mf 파일을 읽는 대신 Metafont가 사용되므로, Unedified Metafont 코드 파일을 사용할 수 있으며 지오메트리뿐만 아니라 문자 인코딩, 박스 크기, Kerning 및 Ligature Information 등이 수동 재 작업없이 벡터 글꼴로 선적됩니다.
이 정보의 차단은 Metafont 명령을 재정의하여 수행됩니다. Metafont는 런타임 동안 다른 프로그램과 상호 작용할 수 없으므로 .mf 파일의 해석과 글꼴 생성을 제 시간에 분리해야합니다. 따라서 Metafont가 비트 맵 그래픽을 생성하는 데 사용할 정보는 Metafont의 로그 파일에 저장됩니다. Metafont의 명령은 다시 정의되어 Metafont가 로그 파일에 지오메트리 및 글꼴 속성을 씁니다. Metafont가 Metafont 파일의 모든 명령을 처리 한 후에는 정보를 로그 파일에서 읽고 글꼴을 작성하여 로그 파일에서 제거하여 명확하게 유지합니다.
이 접근법에 대한 아이디어는 2018 년 10 월에 나타났습니다. 실용성을 확인하기 위해 Fontforge에 대한 구현이 즉시 Python에서 실현되었으며 지원되는 명령의 범위가 점차 확장되었습니다. 초기 테스트에서 아이디어가 효과가 있음을 보여 주었을 때 다른 관심있는 사용자가 mf2ff 이용할 수 있도록 결정했습니다. 이것은 2019 년 3 월 이후에 발생해 왔습니다. 몇 가지 개선과 버그 수정이 끝난 후 몇 년 동안 개발이 멈췄습니다. 지역 사회 피드백으로 인해 mf2ff 개발은 2023 년 7 월에 계속되었습니다.
기본 아이디어
이 개념은 기본 메타 폰트 명령을 재정의하는 것을 기반으로합니다. 이들은 Metafont가 BitMap 글꼴을 작성하는 데 일반적으로 사용하는 방식으로 정의됩니다. 그런 다음이 로그 파일을 읽고 지침을 벡터 글꼴을 생성하는 프로그램으로 전달됩니다. 예를 들어, mf2ff 이 목적을 위해 Fontforge를 사용합니다. 그 후 수정 된 Metafont 명령에 의해 추가 된 정보가 로그 파일에서 제거되어 명확하게 유지됩니다.
다음 다이어그램은 mf2ff 예로 사용하는 개념을 보여줍니다.
┌──────────┐
│ font.mf │
└──────────┘
v
┌──────────┐ ┌───────────┐
│ │ > │ METAFONT │
│ │ └───────────┘
│ │ v
│ │ ┌───────────┐
│ mf2ff │ < │ font.log │
│ │ └───────────┘
│ │
│ │ ┌───────────┐
│ │ > │ FontForge │
└──────────┘ └───────────┘
v v
┌──────────┐ ┌─────────────────────┐
│ font.log │ │ font.ttf / font.otf │
└──────────┘ └─────────────────────┘
간단한 예
Metafont 파일에 다음 코드를 추가하면 Metafont가 윤곽 c fill 않고 작업을 로그 파일에 작성합니다.
def fill expr c =
message "fill"; show c;
enddef;
Metafont가 파일 처리를 완료 한 후 스크립트는 로그 파일을 분석하고 fill 명령이 있다는 것을 알고 있으며 윤곽이 채워질 윤곽을 알고 있습니다. 이 정보는 글리프에 추가하기 위해 글꼴 처리 프로그램에 전달 될 수 있습니다.
실제로이 과정은 훨씬 더 복잡합니다. 일반 Metafont를 기반으로하지 않은 Metafont 파일을 처리하려면 fill 같은 명령 대신 addto 와 같은 명령을 재정의해야합니다. 그러나 이러한 addto 명령은 더 복잡합니다. 그들은 또한 unfill , ( un ) draw , ( un ) drawdot 및 erase 와 같은 다른 일반 Metafont 명령의 기초를 형성합니다. 이 명령은 이러한 다양한 작업 contour withpen addto also doublepath withweight .
또 다른 도전은 조건과 루프의 결장입니다. 이러한 구조는 다른 명령, 구분 기호 ( ligtable 및 fontdimen )로 사용하는 명령에서도 다른 명령에 나타날 수 있으므로 : 로그 파일에 정보를 출력하려면 다른 키워드와 같이 재정의되어야합니다. 이 명령 내에서 콜론의 다른 재정의 사이에 정교한 전환이 필요합니다.
그 외에도 Metafont Primitives의 재정의와 관련이없는 Metafont 파일에 메시지 명령이 있더라도 로그 파일의 모든 명령을 쉽게 찾을 수 있도록 프로세스를 구현해야합니다. 그것들은 글꼴 생성을위한 정보로 해석해서는 안됩니다. 따라서 로그 파일에 작성된 모든 정보는 Metafont 파일의 메시지 명령에 사용되지 않을 특수 키워드로 둘러싸여 있어야합니다.
1977 년부터 De Knuth가 개발 한 Metafont는 Metafont 언어로 작성된 파일에서 비트 맵 글꼴을 생성하는 프로그램입니다. 비트 맵 글꼴은 배율로 흐려진다는 단점이 있습니다. 메타 폰트는 프린터의 특정 해상도를 위해 별도의 글꼴이 생성되도록 개발되었습니다. 오늘날, 벡터 글꼴은 표준이며,이 문제는 배율이 없습니다. 따라서 디스플레이에서 사용하기에 더 적합합니다. 또한 제한없이 모든 프린터와 함께 사용할 수 있습니다.
여기에 제시된 mf2ff 가있는 MF2VEC 접근법 외에도 MetaFont 파일을 벡터 글꼴로 변환하기위한 다음 스크립트를 사용할 수 있습니다.
| 이름 | 방법 |
|---|---|
| 메타 타입 1 | 메타 포스트 |
| MF2PT1 | 메타 포스트 |
| mftrace | 비트 맵 추적 |
| 텍스 트레이스 | 비트 맵 추적 |
이러한 맥락에서 Metapost는 프로그램 Metapost가 Metafont 파일의 모든 단일 문자를 벡터 그래픽으로 변환하는 데 사용됨을 의미합니다. 그 후, 벡터 그래픽을 모아 벡터 글꼴을 얻습니다. 이 방법은 Metapost가 Metafont 언어의 일부만 처리 할 수 있다는 단점이 있습니다.
비트 맵 추적은 Metafont가 먼저 비트 맵 글꼴을 생성 함을 의미합니다. 별도의 프로그램에서는 모든 글리프의 비트 맵이 추적 된 다음 벡터 글꼴을 얻기 위해 모입니다.
각 방법에는 특정 단점이 있습니다. 자세한 내용은 아래 비교를 살펴보십시오.
다음 표에서 Metafont 파일을 벡터 글꼴로 변환하기 위해 사용 가능한 스크립트의 비교를 보여줍니다.
| 특성 | 메타 폰트 | mf2ff | 메타 타입 1 | MF2PT1 | mftrace | 텍스 트레이스 |
|---|---|---|---|---|---|---|
| 스크립트가 작성되었습니다 | - | 파이썬 3 | 펄 | 펄 | 파이썬 2 | 펄 |
| Metafont 파일 처리 | 메타 폰트 | 메타 폰트 | 메타 포스트 | 메타 포스트 | 메타 폰트 | 메타 폰트 |
| 후속 처리 | - | Fontforge | awk / t1asm | t1asm | 오토 트레이스 또는 포트레이스 / t1asm | 오토 트레이스 |
| 출력 형식 | GF / TFM | TTF, OTF, SFD | ? PFB | ? PFB | AFM / PFA / PFB / TTF / SVG | ? PFB |
| 출력 품질 | 비트 맵 | vector 벡터 그래픽 | vector 벡터 그래픽 | vector 벡터 그래픽 | ? 추적 비트 맵 | ? 추적 비트 맵 |
| 비-프리미티브 / 비 프리플리즈가 필요합니다 | ✅ 아니요 | ✅ 아니요 | 예 | 예 | ✅ 아니요 | ✅ 아니요 |
| 유니 코드 지원 | 아니요 | ✅ 예 | ❔ | 아니요 | 아니요 | 아니요 |
| 펜-명령을 지원합니다 | ✅ 예 | ? 제한된 | 아니요 | ? 제한된 | ✅ 예 | ✅ 예 |
| 인조 및 커닝 명령을 지원합니다 | ✅ 예 | ? 제한된 | ❔ | ❔ | ❔ | 아니요 |
| 가변 글꼴을 지원합니다 | 아니요 | 아니, 아마도 미래에 | 아니요 | 아니요 | ❔ | 아니요 |
다음은 mf2ff 로 만든 몇 가지 예입니다. 개요 및 채워진 캐릭터는 Fontforge에 표시 될 때 표시됩니다. 결과는 아직 완벽하지 않습니다.
컴퓨터 현대 서체의 일부 글리프는 아직 올바르게 처리되지 않았습니다. 즉, 자본의 중간 부분과 소문자로 sloped_serif .

![]() | ![]() | ![]() |
왼쪽의 이미지는 cull 명령을 비활성화하여 생성되었습니다.
양식화 된 Coast Redwood Tree El Palo Alto는 Metafontbook의 124-126 페이지에 표시됩니다. 왼쪽 버전에서는 옵션 cull-at-shipout 활성화됩니다. 트렁크와 최상위 브랜치는 곡선 내 지점을 공유하기 때문에 현재 구현은 잘못된 결과를 초래합니다.
![]() | ![]() | ![]() | ![]() |
138 페이지의 MetafontBook에 표시된 로고. 왼쪽 버전에서는 옵션 cull-at-shipout 활성화됩니다. 채워진 로고는 두 경우 모두 동일합니다.
![]() | ![]() | ![]() |
mf2ff 의 현재 한계 mf2ff 여전히 개발 중이며 철저히 테스트되지 않았으므로 몇 가지 제한 사항이 있습니다. 향후 업데이트에서 해결 될 수 있습니다.
특정 제한이 프로젝트를 유지하는 경우 향후 업데이트가 사용자의 요구에 집중할 수 있도록 문제를 열어야합니다.
penrazor 는 지원되지 않습니다 (Dangerous_bend_symbol 예 참조), Fontforge : "스트로크 너비는 0이 될 수 없습니다"penspeck 사용하면 경고가 발생하지만 경우에 따라 출력은 괜찮은 것 같습니다.cull 명령의 지원은 제한적입니다.: , :: , kern , skipto 및 인대 연산자 =: , |=: , =:| 및 |=:| 지원됩니다. ligtable 명령은 연산자에서 > 합니다. 또한 연산자 ||: 지원되지 않습니다.charlist 또는 extensible 명령은 아직 지원되지 않습니다.picture 키워드를 재정의해야합니다. Metafont는 부울 표현식에서 가변 선언 및 유형 테스트 둘 다에 유형 키워드를 사용하므로 picture 키워드를 사용하여 변수가 유형의 picture 인지 테스트 할 수 없습니다.makepen 및 makepath 와 같은 명령은 영향을 미치지 않습니다. 펜과 경로는 부울 표현으로 pen 이나 path 사용하여 구별 할 수 없습니다. is_pen 또는 is_path 소개하는 is_type 옵션이 있어이 문제를 우회하는 데 도움이 될 수 있습니다.ligtable 및 fontdimen 내부의 중첩 조건 또는 루프mf2ff 결장을 재정의해야합니다 ( : . 이로 인해 다중 중첩 된 if ... ( elseif ) forsuffixes (End) ... ( end ) ... fi 및 / 또는 / for / forever ... 콜론을 자신의 구문, 즉 ligtable 및 fontdimen 에서 사용하는 명령 endfor 에 문제가 발생할 수 있습니다.charlist 와 extensible도움이 될 수있는 몇 가지가 있습니다. 나는 그들을 100%이해하지 못한다는 것을 명심하십시오.
$PYTHONPATH 에 /usr/local/lib/python3/dist-packages 추가하십시오export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3/dist-packages ~/.profile )/usr/local/lib/python3.4/site-packages 추가 할 것을 제안합니다.