mf2ff mf2ff هي أداة لإنشاء خطوط متجه من رمز Metafont باستخدام Python API من Fontforge.
يعتمد على مفهوم كيف يمكن لـ Metafont العمل مع مولد خط المتجه دون تداول تتبع الصورة النقطية ، الموضحة أدناه في قسم مفهوم MF2VEC. mf2ff هو الأول ، وعلى علم المطور ، التنفيذ الوحيد لهذا المفهوم حتى الآن.
ستجد أدناه بعض المساعدة حول كيفية إعدادها وكيفية استخدامها.
لم يتم اختبار الأداة تمامًا بعد ، ولكن يتم دعم أوامر Metafont الأكثر شيوعًا. إلى جانب ملء ورسم ، يتم دعم kerning وبعض أوامر الرباط. يرجى إلقاء نظرة على القيود المذكورة أدناه.
mf2ffmf2ff تحتاج إلى تثبيت Fontforge و Metafont لاستخدام mf2ff .
قد تواجه مشاكل في تشغيل البرنامج النصي mf2ff . قد تكون هناك مشكلة واحدة في أنك تحتاج إلى تشغيل Python 3 باستخدام وحدة Fontforge. فيما يلي بعض النصائح حول كيفية تشغيلها. لا يمكنني ضمان أن هذا سيعمل على نظامك ، ولكن يجب أن تجربه.
في أنظمة التشغيل المختلفة أو تكوينات النظام حيث لا تعمل النصائح أدناه ، تحقق مما إذا كنت تستخدم وحدة Python و Fontforge's 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 متوفر الآن في جميع نوافذ موجه الأوامر الجديدة ويجب أن تكون قادرًا على استخدام 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/ دليل.fontforge/ Directory:cd fontforge; mkdir build; cd buildcmake -GNinja ..ninjasudo ninja installملاحظة: تحقق من وثائق FONTFORE إذا كانت لديك مشاكل في هذه العملية.
للوصول بسهولة إلى وحدة Python الخاصة بـ Fontforge ، أضفها إلى Pythonpath:
~/.profile : export PYTHONPATH=$PYTHONPATH:/path/to/fontforge/ ، حيث /path/to/fontforge/ directory هو الخط الذي تم إنشاؤه بواسطة cloning fontforge مع git ، على سبيل المثال $HOME/fontforge .python3 path/to/mf2ff.py ... في جلسات شل جديدة. ملاحظة: بناءً على تكوين نظامك ، تحتاج إلى كتابة python بدلاً من python3 لتشغيل Python 3.
للوصول بسهولة إلى البرنامج النصي mf2ff من كل مكان ، أضف موقعه إلى متغير Pythonpath:
~/.profile : export PYTHONPATH=$PYTHONPATH:/path/to/mf2ff/ ، where /path/to/mf2ff/ directory هو الذي تضعه في ملف mf2ff.py ، على سبيل المثال $HOME/mf2ff/mf2ff .mf2ff بسهولة باستخدام python3 -m mf2ff ... في جلسات شل جديدة.ملاحظة: اعتمادًا على dotfile التي تستخدمها ، قد تكون إعادة تشغيل القشرة بدلاً من إعادة التشغيل كافية.
الحل أدناه يستخدم homebrew. بهذه الطريقة يمكن الوصول إلى 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 بالكثير من التنظيف افتراضيًا ، حيث قد ترغب في إعادة صياغة الحروف الرسومية يدويًا. يمكنك استخدام الخيارات -cull-at-shipout / mf2ff.options['cull-at-shipout'] = True أو -remove-artifacts / mf2ff.options['remove-artifacts'] = True لأداء بعض التنظيف الآلي. لاحظ أن أوامر CULL التي تشكل جزءًا من تعريف Glyph قد يؤدي إلى عدم cull-at-shipout أي تغييرات أخرى لبعض الحروف الرسومية.
يرجى إلقاء نظرة على القيود المذكورة أدناه.
تتمثل الفكرة الرئيسية لمفهوم MF2VEC في جعل Metafont لإعادة توجيه هندسة الرسول الرسومية إلى برنامج آخر (في حالة mf2ff هذا البرنامج هو fontforge) بدلاً من استخدامها لإنشاء خط نقطية. هذا ممكن بسبب حقيقة أن Metafont يستخدم داخليًا نفس الوصف الهندسي الذي يلزم لاحقًا في ملفات خط المتجه - منحنيات Bézier.
يتم التحايل على الالتفاف المستخدم من قبل بعض بدائل تحويل منحنيات Bézier إلى الرسومات النقطية والعودة إلى منحنيات Bézier. باستخدام الهندسة مباشرة ، لا تضيع أي معلومات.
نظرًا لاستخدام Metafont بدلاً من أدوات أخرى مثل Metapost لقراءة ملفات .mf ، يمكن استخدام ملفات رمز metafont غير المعدلة ، وليس فقط الهندسة ولكن أيضًا ترميز الأحرف ، وأحجام الصناديق ، ومعلومات الربط والرباط ، وما إلى ذلك.
يتم هذا الاعتراض على المعلومات عن طريق إعادة تعريف أوامر Metafont. نظرًا لأن Metafont لا يمكنه التفاعل مع البرامج الأخرى أثناء وقت التشغيل ، يجب فصل تفسير ملف .mf وتوليد الخط في الوقت المناسب. لذلك ، يتم حفظ المعلومات التي تستخدمها Metafont لإنشاء رسومات Bitmap في ملف سجل 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 سيؤدي إلى عدم fill Metafont لملء contour c ، ولكن لكتابة العمليات إلى ملف السجل:
def fill expr c =
message "fill"; show c;
enddef;
بعد انتهاء Metafont من معالجة الملف ، يقوم البرنامج النصي بتحليل ملف السجل ويعرف من أنه كان هناك أمر fill ويعرف الكفاف الذي سيتم ملؤه. يمكن تمرير هذه المعلومات إلى برنامج معالجة الخطوط لإضافتها إلى الرسول الرسمية.
في الواقع ، هذه العملية أكثر تعقيدًا. لتكون قادرًا على معالجة ملفات metafont التي لا تستند إلى metafont العادي ، يجب إعادة تعريف الأوامر مثل addto بدلاً من أوامر مثل fill . لكن أوامر addto أكثر تعقيدًا ؛ كما أنها تشكل الأساس لأوامر metafont العادية الأخرى مثل unfill ، ( un ) (un draw ، ( un ) drawdot erase . تتوسع هذه الأوامر إلى العديد من الكلمات الرئيسية التي تفصل بين الأجزاء المختلفة من المعلومات اللازمة للقيام بهذه العمليات المختلفة ( addto ، also ، contour ، doublepath ، withpen ، withweight ).
التحدي الآخر هو القولون في الظروف والحلقات. يمكن أن تظهر هذه الهياكل في أي أمر آخر ، حتى في الأوامر التي تستخدم القولون كفاصل ( ligtable و fontdimen ) ، لذلك : يجب إعادة تعريفها مثل الكلمات الرئيسية الأخرى لإخراج المعلومات إلى ملف السجل. هناك حاجة إلى تبديل متطور بين إعادة تعريف مختلفة للقولون داخل هذه الأوامر.
بالإضافة إلى ذلك ، يجب تنفيذ العملية لتسهيل العثور على جميع الأوامر في ملف السجل حتى لو كان هناك أوامر رسائل في ملف Metafont غير مرتبط بإعادة تعريف Metafont Primitives. لا ينبغي تفسير هؤلاء على أنها معلومات لتوليد الخطوط. لذلك ، يجب إرفاق جميع المعلومات المكتوبة في ملف السجل في كلمات رئيسية خاصة من غير المحتمل استخدامها في أوامر رسائل Metafont Files.
Metafont ، الذي طورته De Knuth منذ عام 1977 ، هو برنامج ينشئ خطوط Bitmap من الملفات المكتوبة بلغة Metafont. خطوط نقطية لها عيب أنها تصبح غير واضحة تحت التكبير. تم تطوير Metafont بحيث تم إنشاء خط منفصل. في الوقت الحاضر ، تعتبر خطوط المتجهات قياسية ، والتي لا تملك هذه المشكلة تحت التكبير. لذلك ، فهي أكثر ملاءمة للاستخدام على الشاشات. علاوة على ذلك ، يمكن استخدامها مع كل طابعة دون أي قيود.
إلى جانب نهج MF2VEC مع mf2ff المقدم هنا ، تتوفر البرامج النصية التالية لتحويل ملفات metafont إلى خطوط ناقلات:
| اسم | طريقة |
|---|---|
| metatype1 | metapost |
| MF2PT1 | metapost |
| mftrace | تتبع صورة نقطية |
| Textrace | تتبع صورة نقطية |
في هذا السياق ، يعني Metapost أن برنامج metapost يتم استخدامه لتحويل كل حرف من ملف metafont إلى رسم متجه. بعد ذلك ، يتم وضع رسومات المتجه معًا للحصول على خط متجه. هذه الطريقة لها عيب أن Metapost يمكن فقط معالجة جزء من لغة metafont.
تتبع صورة نقطية يعني أن Metafont يولد خط صورة نقطية أولاً. في برنامج منفصل ، يتم تتبع صورة نقطية من كل الرسول الرمزية ثم وضعها معًا للحصول على خط متجه.
كل من الطرق لها جوانب سلبية محددة. يرجى إلقاء نظرة على المقارنة أدناه لمزيد من التفاصيل.
في الجدول التالي ، يعرض مقارنة البرامج النصية المتاحة لتحويل ملفات Metafont إلى خطوط المتجهات.
| خاصية | Metafont | mf2ff | metatype1 | MF2PT1 | mftrace | Textrace |
|---|---|---|---|---|---|---|
| نصي مكتوب في | - | بيثون 3 | بيرل | بيرل | بيثون 2 | بيرل |
| معالجة ملف metafont | Metafont | Metafont | metapost | metapost | Metafont | Metafont |
| المعالجة اللاحقة | - | fontforge | awk / t1asm | T1asm | Autotrace أو Potrace / T1asm | Autotrace |
| تنسيق الإخراج | GF / TFM | ✅ TTF ، OTF ، SFD | ؟ PFB | ؟ PFB | ✅ AFM / PFA / PFB / TTF / SVG | ؟ PFB |
| جودة الإخراج | صورة نقطية | ✅ المتجه الرسم | ✅ المتجه الرسم | ✅ المتجه الرسم | ؟ تتبع صورة نقطية | ؟ تتبع صورة نقطية |
| يعيد تعريف غير المحتملين / يتطلب غير محتملة | ✅ لا | ✅ لا | نعم | نعم | ✅ لا | ✅ لا |
| دعم يونيكود | لا | ✅ نعم | ❔ | لا | لا | لا |
| يدعم القلم | ✅ نعم | ؟ محدود | لا | ؟ محدود | ✅ نعم | ✅ نعم |
| يدعم أوامر الرباط والأربطة | ✅ نعم | ؟ محدود | ❔ | ❔ | ❔ | لا |
| يدعم الخطوط المتغيرة | لا | لا ، ربما في المستقبل | لا | لا | ❔ | لا |
فيما يلي بعض الأمثلة التي تم إنشاؤها مع mf2ff . يتم عرض الخطوط العريضة والشخصيات المملوءة عند عرضها في Fontforge. لاحظ أن النتائج ليست مثالية بعد.
لا تتم معالجة بعض الرسوم المتحركة من المحارف الحديثة للكمبيوتر بشكل صحيح حتى الآن ، أي الجزء الأوسط من رأس المال sloped_serif في الأحرف الصغيرة.

![]() | ![]() | ![]() |
تم إنشاء الصورة على اليسار عن طريق إلغاء تنشيط أوامر cull .
The Coast Redwood Tree 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 يستخدم الكلمات الرئيسية لكليهما ، إعلان متغير واختبار النوع في تعبيرات منطقية ، لا يمكن استخدام الكلمة الرئيسية picture لاختبار ما إذا كان المتغير من نوع picture .makepen و makepath أي تأثير. لا يمكن تمييز الأقلام والمسار باستخدام pen أو path في تعبير منطقي. هناك خيار is_type يقدم is_pen أو is_path والذي قد يساعدك في التحايل على هذه المشكلة.ligtable و fontdimenmf2ff إلى إعادة تعريف القولون ( : . قد يسبب هذا مشاكل في معالجة متعددة متداخلة if ... ( elseif ) ... ( end ) ... fi و / أو for / forsuffixes / forever ... endfor داخل الأوامر التي تستخدم القولون في بناء الجملة الخاص بها ، أي 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 إلى مسار بيثون