mf2ff mf2ff adalah alat untuk membuat font vektor dari kode Metafont menggunakan Python API of FontForge.
Ini didasarkan pada konsep bagaimana Metafont dapat bekerja sama dengan generator font vektor tanpa jalan memutar penelusuran bitmap, yang dijelaskan di bawah ini di bagian konsep MF2VEC. mf2ff adalah yang pertama dan, sepengetahuan pengembang, satu -satunya implementasi konsep ini hingga saat ini.
Di bawah ini Anda akan menemukan bantuan tentang cara mengaturnya dan cara menggunakannya.
Alat ini belum diuji secara menyeluruh, tetapi perintah Metafont yang paling umum didukung. Selain mengisi dan menggambar, juga kerning dan beberapa perintah ligatur didukung. Silakan lihat batasan yang tercantum di bawah ini.
mf2ffmf2ff Anda perlu menginstal FontForge dan Metafont untuk menggunakan mf2ff .
Anda mungkin mengalami masalah menjalankan skrip mf2ff . Satu masalah mungkin Anda perlu menjalankan Python 3 dengan modul FontForge. Di bawah ini adalah beberapa tips tentang cara membuatnya bekerja. Saya tidak dapat menjamin bahwa ini akan bekerja pada sistem Anda, tetapi Anda harus mencobanya.
Pada berbagai sistem operasi atau konfigurasi sistem di mana tips di bawah ini tidak berfungsi, periksa apakah Anda menggunakan modul Python Python dan FontForge ada:
ffpython , python3 , python ). Periksa apakah info versi menyatakan bahwa Anda menjalankan Python 3 .import fontforge di dalam penerjemah harus bekerja tanpa kesalahan.fontforge.font() tidak boleh menimbulkan kesalahan. Jika ini hanya berfungsi di beberapa direktori, Anda harus memeriksa PATH Anda atau variabel PYTHONPATH . Untuk akses sementara ke FontForge's Python Version ffpython , FontForge hadir dengan file batch:
C:Program Files (x86)FontForgeBuilds ) dan jalankan fontforge-console.bat karena perintah set windows mengubah variabel PATH hanya dalam sesi prompt perintah saat ini, ffpython hanya tersedia di setiap lokasi di command prompt di mana file batch dijalankan.Untuk akses permanen, Anda perlu mengedit variabel jalur secara permanen:
environment variables dan buka Edit the system environment variables . Klik Environment variables dan edit baik variabel PATH akun pengguna Anda atau salah satu sistem jika Anda memerlukan akses ke ffpython pada beberapa akun pengguna. Sekarang, tambahkan jalur FontForge (misalnya C:Program Files (x86)FontForgeBuildsbin , ingat bin !) Ke dalam daftar.ffpython sekarang tersedia di semua windows prompt perintah baru dan Anda harus dapat menggunakan ffpython path/to/mf2ff.py ... Untuk dengan mudah mengakses skrip mf2ff dari mana -mana, lakukan hal berikut:
mf2ff ke variabel PYTHONPATH . Jika belum ada variabel PYTHONPATH , tambahkan ke daftar.mf2ff dengan ffpython -m mf2ff ... dalam sesi prompt perintah baru.Ubuntu digunakan dalam contoh ini.
Beberapa repositori mengirimkan versi lama FontForge dengan dukungan Python 2. Anda mungkin ingin membangun fontforge dari sumber:
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 . Ini menciptakan fontforge/ direktori.fontforge/ direktori:cd fontforge; mkdir build; cd buildcmake -GNinja ..ninjasudo ninja installCatatan: Periksa dokumentasi FontFore jika Anda memiliki masalah dengan proses ini.
Untuk dengan mudah mengakses modul python fontforge, tambahkan ke pythonpath Anda:
~/.profile Anda: export PYTHONPATH=$PYTHONPATH:/path/to/fontforge/ , di mana /path/to/fontforge/ direktori adalah yang dibuat dengan mengkloning fontforge dengan git, eg $HOME/fontforge .python3 path/to/mf2ff.py ... dalam sesi shell baru. Catatan: Bergantung pada konfigurasi sistem Anda, Anda perlu mengetik python alih -alih python3 untuk menjalankan Python 3.
Untuk dengan mudah mengakses skrip mf2ff dari mana -mana, tambahkan lokasinya ke variabel PythonPath:
~/.profile Anda: export PYTHONPATH=$PYTHONPATH:/path/to/mf2ff/ , di mana /path/to/mf2ff/ direktori adalah tempat Anda meletakkan file mf2ff.py , eg $HOME/mf2ff/mf2ff .mf2ff dengan mudah dengan python3 -m mf2ff ... dalam sesi shell baru.Catatan: Bergantung pada dotfile mana yang Anda gunakan, restart shell, bukan reboot mungkin cukup.
Solusi di bawah ini menggunakan homebrew. Dengan cara ini FontForge juga dapat diakses dengan Python:
brew install fontforge .python3 path/to/mf2ff.py ... dalam sesi shell baru. Catatan: Bergantung pada konfigurasi sistem Anda, Anda perlu mengetik python alih -alih python3 untuk menjalankan Python 3.
Untuk dengan mudah mengakses skrip mf2ff dari mana -mana, tambahkan lokasinya ke variabel PYTHONPATH :
PYTHONPATH=$PYTHONPATH:/path/to/mf2ff/ .zsh . Di direktori home Anda, buat atau modifikasi file .zshenv .bash . Di direktori home Anda, buat atau modifikasi file .bash_profile .tcsh . Di direktori home Anda, buat atau modifikasi file yang sesuai dari tcsh shell.mf2ff dengan python3 -m mf2ff ... dalam sesi shell baru. Secara default, mf2ff akan menghasilkan file Spline Font Database (.sfd). Anda dapat menggunakan opsi -ttf / mf2ff.options['ttf'] = True atau -otf / mf2ff.options['otf'] = True untuk menghasilkan font secara langsung.
mf2ff tidak melakukan banyak pembersihan secara default, karena Anda mungkin ingin mengerjakan ulang mesin terbang secara manual. Anda dapat menggunakan opsi -cull-at-shipout / mf2ff.options['cull-at-shipout'] = True atau -remove-artifacts / mf2ff.options['remove-artifacts'] = True untuk melakukan pembersihan otomatis. Perhatikan bahwa perintah cull yang merupakan bagian dari definisi mesin terbang dapat mengakibatkan opsi cull-at-shipout tidak membuat perubahan lebih lanjut untuk beberapa mesin terbang.
Silakan lihat batasan yang tercantum di bawah ini.
Gagasan utama konsep MF2VEC adalah membuat Metafont untuk mengarahkan kembali geometri mesin terbang ke program lain (dalam kasus mf2ff program ini adalah FontForge) alih -alih menggunakannya untuk menghasilkan font bitmap. Hal ini dimungkinkan karena fakta bahwa Metafont secara internal menggunakan deskripsi geometris yang sama yang kemudian diperlukan dalam file font vektor - kurva Bézier.
Jalan memutar yang digunakan oleh beberapa alternatif untuk mengubah kurva Bézier menjadi raster grafik dan kembali ke kurva Bézier dielakkan. Dengan menggunakan secara langsung geometri, tidak ada informasi yang hilang.
Karena Metafont digunakan sebagai pengganti alat lain seperti Metapost untuk membaca file .mf , file kode metafont yang tidak dimodifikasi dapat digunakan dan tidak hanya geometri tetapi juga pengkodean karakter, ukuran kotak, informasi kerning dan ligatur dll. Dikirim ke font vektor tanpa pengerjaan ulang manual.
Intersepsi informasi ini dilakukan dengan mendefinisikan kembali perintah Metafont. Karena Metafont tidak dapat berinteraksi dengan program lain selama runtime, interpretasi file .mf dan generasi font perlu dipisahkan dalam waktu. Oleh karena itu, informasi yang akan digunakan MetaFont untuk menghasilkan grafik bitmap disimpan dalam file log Metafont. Perintah Metafont didefinisikan ulang sehingga Metafont menulis properti geometri dan font dalam file lognya. Setelah Metafont memproses semua perintah file Metafont, informasi dibaca dari file log, diproses untuk membuat font dan kemudian dihapus dari file log agar tetap jelas.
Gagasan untuk pendekatan ini muncul pada Oktober 2018. Untuk memeriksa kepraktisan implementasi untuk FontForge segera direalisasikan dalam Python dan berbagai perintah yang didukung secara progresif diperluas. Ketika tes awal menunjukkan bahwa ide itu berhasil, diputuskan untuk membuat mf2ff tersedia untuk pengguna lain yang tertarik. Ini telah terjadi sejak Maret 2019. Setelah beberapa perbaikan dan perbaikan bug, pengembangan dijeda selama beberapa tahun. Karena umpan balik masyarakat, pengembangan mf2ff dilanjutkan pada Juli 2023.
Ide Dasar
Konsep ini didasarkan pada mendefinisikan kembali perintah Metafont dasar. Mereka didefinisikan sedemikian rupa sehingga informasi yang biasanya digunakan Metafont untuk membuat font bitmap ditulis ke dalam file log. Selanjutnya, file log ini kemudian dibaca dan instruksi diteruskan ke program yang menghasilkan font vektor darinya. Misalnya, mf2ff menggunakan fontForge untuk tujuan ini. Setelah itu, informasi yang ditambahkan oleh perintah Metafont yang dimodifikasi dihapus dari file log agar tetap jelas.
Diagram berikut menggambarkan konsep menggunakan mf2ff sebagai contoh.
┌──────────┐
│ font.mf │
└──────────┘
v
┌──────────┐ ┌───────────┐
│ │ > │ METAFONT │
│ │ └───────────┘
│ │ v
│ │ ┌───────────┐
│ mf2ff │ < │ font.log │
│ │ └───────────┘
│ │
│ │ ┌───────────┐
│ │ > │ FontForge │
└──────────┘ └───────────┘
v v
┌──────────┐ ┌─────────────────────┐
│ font.log │ │ font.ttf / font.otf │
└──────────┘ └─────────────────────┘
Contoh sederhana
Menambahkan kode berikut ke file Metafont akan menyebabkan Metafont tidak fill kontur c , tetapi untuk menulis operasi ke file log:
def fill expr c =
message "fill"; show c;
enddef;
Setelah Metafont selesai memproses file, skrip menganalisis file log dan tahu dari itu ada perintah fill dan mengetahui kontur yang akan diisi. Informasi ini dapat diteruskan ke program pemrosesan font untuk menambahkannya ke mesin terbang.
Bahkan, proses ini jauh lebih rumit. Untuk dapat memproses file Metafont yang tidak didasarkan pada Metafont biasa, perintah seperti addto alih -alih perintah seperti fill harus didefinisikan ulang. Tetapi perintah addto itu lebih kompleks; Mereka juga membentuk dasar untuk perintah Metafont polos lainnya seperti unfill , ( un ) draw , ( un ) drawdot dan erase . Perintah -perintah ini berkembang ke beberapa kata kunci yang memisahkan berbagai bagian informasi yang diperlukan untuk melakukan operasi yang berbeda ini ( addto , also , contour , doublepath , withpen , withweight ).
Tantangan lain adalah usus besar dalam kondisi dan loop. Struktur ini dapat muncul dalam perintah lain, bahkan dalam perintah yang menggunakan usus besar sebagai pemisah ( ligtable dan fontdimen ), jadi : harus didefinisikan ulang seperti kata kunci lainnya untuk mengeluarkan informasi ke file log. Pergantian canggih antara berbagai redefinisi usus besar diperlukan dalam perintah -perintah ini.
Selain itu, suatu proses perlu diimplementasikan untuk memudahkan menemukan semua perintah dalam file log bahkan jika ada perintah pesan dalam file Metafont yang tidak terkait dengan redefinisi primitif Metafont. Itu tidak boleh ditafsirkan sebagai informasi untuk pembuatan font. Oleh karena itu semua informasi yang ditulis dalam file log perlu dilampirkan dalam kata kunci khusus yang tidak mungkin digunakan dalam perintah pesan file Metafont.
Metafont, dikembangkan oleh De Knuth sejak 1977, adalah program yang menghasilkan font bitmap dari file yang ditulis dalam bahasa Metafont. Font Bitmap memiliki kelemahan yang menjadi kabur di bawah perbesaran. Metafont dikembangkan sehingga untuk resolusi tertentu dari printer, font terpisah dihasilkan. Saat ini, font vektor adalah standar, yang tidak memiliki masalah ini di bawah perbesaran. Oleh karena itu, mereka lebih cocok untuk digunakan pada layar. Selain itu, mereka dapat digunakan dengan setiap printer tanpa batasan apa pun.
Selain pendekatan MF2VEC dengan mf2ff yang disajikan di sini, skrip berikut untuk mengonversi file Metafont ke font vektor tersedia:
| Nama | Metode |
|---|---|
| Metatype1 | Metapost |
| mf2pt1 | Metapost |
| mftrace | Penelusuran bitmap |
| Textrace | Penelusuran bitmap |
Dalam konteks ini, Metapost berarti bahwa program Metapost digunakan untuk mengonversi setiap karakter tunggal file Metafont ke grafik vektor. Setelah itu, grafik vektor disatukan untuk mendapatkan font vektor. Metode ini memiliki kelemahan yang hanya dapat diproses Metapost dapat memproses bagian dari bahasa Metafont.
Penelusuran bitmap berarti bahwa Metafont menghasilkan font bitmap terlebih dahulu. Dalam program terpisah, bitmap setiap mesin terbang dilacak dan kemudian disatukan untuk mendapatkan font vektor.
Masing -masing metode memiliki kelemahan spesifik. Silakan lihat perbandingan di bawah ini untuk detail lebih lanjut.
Pada tabel berikut menunjukkan perbandingan skrip yang tersedia untuk mengonversi file Metafont ke font vektor.
| Ciri | Metafont | mf2ff | Metatype1 | mf2pt1 | mftrace | Textrace |
|---|---|---|---|---|---|---|
| Skrip ditulis | - - | Python 3 | Perl | Perl | Python 2 | Perl |
| Pemrosesan File Metafont | Metafont | Metafont | Metapost | Metapost | Metafont | Metafont |
| Pemrosesan selanjutnya | - - | FontForge | AWK / T1ASM | t1asme | Autotrace atau Potrace / T1ASM | Autotrace |
| Format output | GF / TFM | ✅ TTF, OTF, SFD | ? Pfb | ? Pfb | ✅ AFM / PFA / PFB / TTF / SVG | ? Pfb |
| Kualitas output | Bitmap | ✅ Grafik vektor | ✅ Grafik vektor | ✅ Grafik vektor | ? Bitmap yang dilacak | ? Bitmap yang dilacak |
| Mendefinisikan kembali non-primitif / membutuhkan non-primitif | ✅ Tidak | ✅ Tidak | Ya | Ya | ✅ Tidak | ✅ Tidak |
| Dukungan Unicode | TIDAK | ✅ Ya | ❔ | TIDAK | TIDAK | TIDAK |
| Mendukung Pernyataan Pen | ✅ Ya | ? Terbatas | TIDAK | ? Terbatas | ✅ Ya | ✅ Ya |
| Mendukung perintah ligature dan kerning | ✅ Ya | ? Terbatas | ❔ | ❔ | ❔ | TIDAK |
| Mendukung font variabel | TIDAK | Tidak, mungkin di masa depan | TIDAK | TIDAK | ❔ | TIDAK |
Berikut ini adalah beberapa contoh yang dibuat dengan mf2ff . Garis besar dan karakter diisi ditampilkan saat ditampilkan di FontForge. Perhatikan bahwa hasilnya belum sempurna.
Beberapa mesin terbang komputer modern belum diproses dengan benar, yaitu bagian tengah modal S dan sloped_serif dalam huruf kecil.

![]() | ![]() | ![]() |
Gambar di sebelah kiri dibuat dengan menonaktifkan perintah cull .
Pohon Redwood Gaya El Palo Alto yang disajikan pada halaman 124-126 dari Metafontbook. Di versi kiri, opsi cull-at-shipout diaktifkan. Karena batang dan cabang paling atas berbagi titik di kurva, implementasi saat ini menyebabkan hasil yang salah di sana.
![]() | ![]() | ![]() | ![]() |
Logo, yang disajikan pada halaman 138, Metafontbook. Di versi kiri, opsi cull-at-shipout diaktifkan. Logo yang diisi adalah sama dalam kedua kasus.
![]() | ![]() | ![]() |
mf2ff Karena mf2ff masih dalam pengembangan dan tidak diuji secara menyeluruh, ada beberapa keterbatasan. Mereka mungkin ditangani dalam pembaruan mendatang.
Jika batasan spesifik menahan proyek Anda, buka masalah sehingga pembaruan di masa depan dapat fokus pada kebutuhan pengguna.
penrazor tidak didukung (lihat contoh Dangerous_Bend_Symbol), fontForge: "Lebar stroke tidak bisa nol"penspeck meningkatkan peringatan tetapi output tampaknya baik -baik saja dalam beberapa kasus.cull terbatas.: :: , kern , skipto serta operator ligatur =: , |=: :, =:| dan |=:| didukung. Perintah ligtable mengabaikan > di operator. Selain itu, operator ||: tidak didukung.charlist atau perintah extensible belum didukung.picture harus didefinisikan ulang untuk menginisialisasi variabel gambar sebagai lapisan vektor fontforge. Karena Metafont menggunakan kata kunci tipe untuk keduanya, tes deklarasi dan tipe variabel dalam ekspresi boolean, kata kunci picture tidak dapat digunakan untuk menguji jika suatu variabel adalah jenis picture .makepen dan makepath tidak berpengaruh. Pena dan jalur tidak dapat dibedakan menggunakan pen atau path dalam ekspresi boolean. Ada opsi is_type yang memperkenalkan is_pen atau is_path yang mungkin membantu Anda menghindari masalah ini.ligtable dan fontdimenmf2ff perlu mendefinisikan kembali usus besar ( : . Ini dapat menyebabkan masalah dalam memproses beberapa bersarang if ... ( elseif ) ... ( end ) ... fi dan / atau for / forsuffixes / forever ... endfor dari dalam perintah yang menggunakan usus besar dalam sintaks mereka sendiri, yaitu ligtable dan fontdimen .charlist dan extensibleAda beberapa hal, yang mungkin membantu. Perlu diingat bahwa saya tidak memahaminya 100%:
/usr/local/lib/python3/dist-packages KEPADA $PYTHONPATH ANDAexport PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3/dist-packages ke ~/.profile Anda)/usr/local/lib/python3.4/site-packages ke jalur Python