> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/ar/mqalat-mtamqh/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md).

# مقدمة إلى LuaTeX (الجزء 1): ما هو—وما الذي يجعله مختلفًا جدًا؟

LuaTeX هو *مجموعة أدوات*—فهو يضم أدوات برمجية ومكوّنات متطورة يمكنك بواسطتها إنشاء (تنضيد) مجموعة واسعة من المستندات. كما أن العنوان الفرعي لهذه المقالة يطرح سؤالين أيضًا حول LuaTeX: ما هو—وما الذي يجعله مختلفًا إلى هذا الحد؟ قد يبدو الجواب عن «ما هو؟» بديهيًا: «إنه محرك تنضيد TeX!» وهذا صحيح، لكن النظرة الأوسع، والتي يتبناها هذا الكاتب، هي أن LuaTeX هو نظام شديد التنوع قائم على TeX لـ *بناء المستندات وهندستها*.

### شرح LuaTeX: من أين نبدأ؟

الهدف من هذه المقالة الأولى عن LuaTeX هو تقديم سياق يساعد على فهم ما يوفّره هذا المحرك من TeX ولماذا/كيف يتيح تصميمه للمستخدمين بناء/تصميم/إنشاء مجموعة واسعة من الحلول لمشكلات التنضيد والتصميم المعقدة—وربما يقدّم أيضًا قدرًا من «التحصين للمستقبل» مع تزايد حاجة المستخدمين إلى برمجيات قائمة على TeX قادرة على التكيف مع النظام التقني المتغير باستمرار. ومن وجهة نظر هذا الكاتب، فإن سرد خصائصه/قدراته ووصفها ليس بالضرورة أفضل نقطة للبدء عند تطوير فهم لقدرات LuaTeX وإمكاناته. مثل هذا النهج لن يكون مفيدًا كثيرًا للقراء غير الملمين بمحركات TeX الأخرى، والذين لن تكون المقارنات القائمة على الخصائص ذات معنى خاص لهم.

على أمل ألا أستنزف صبر القارئ («فقط قل الخلاصة!») سأتبنى نهجًا أكثر «شمولية»، آملًا تقديم خلفية مفيدة، لكن على حساب بعض القراءة الإضافية—والتعمق في بعض موضوعات البرمجة للمساعدة على الفهم. في [الجزء 2](/latex/ar/mqalat-mtamqh/09-an-introduction-to-luatex-part-2-understanding-directlua.md) نستكشف استخدام `\directlua` ، لكننا في الوقت الحالي نحاول وضع الأسس الأساسية لفهم LuaTeX.

تعكس هذه المقالة بقوة «رحلة» المؤلف الشخصية في تطوير فهمه وتقديره لـLuaTeX: فبمجرد معرفة شيء عن الفلسفة الكامنة وراء تطوير LuaTeX، ورؤيته كحاوية لأدوات برمجية، ستقدّر بشكل أفضل مجالات الحلول الواسعة التي يفتحها هذا البرنامج المذهل.

## LuaTeX: ليس للأوساط الأكاديمية، أو للرياضيات فقط!

إن وفرة الخصائص والوظائف المدمجة في LuaTeX لا توفر فقط تنضيدًا عالي الجودة للغاية عبر LaTeX التقليدي، بل تتيح أيضًا مجالًا هائلًا لتطوير حلول مخصصة، غير قائمة على LaTeX، لمشكلات معقدة في إنتاج المستندات وهندستها. ويدمج LuaTeX لغة البرمجة القوية Lua داخله، ما يعني، على سبيل المثال، أنه يمكنك استخدام Lua لتحميل «ملحقات» (مكتبات برمجية خارجية) داخل LuaTeX؛ وهذا يتيح مزيدًا من الأتمتة العالية، والتكامل مع أنظمة أو سير عمل برمجية قائمة، والاستفادة من البرمجيات المتخصصة لمعالجة البيانات أو النصوص أو الرسوميات.

تاريخيًا، ارتبط TeX بالتأليف/النشر العلمي، ولا سيما في مجال الرياضيات، لكن LuaTeX، على وجه الخصوص، يملك إمكانات كبيرة للتطبيق في مجالات أخرى كثيرة—بما في ذلك إنتاج مستندات PDF التجارية. ومن الأمثلة على ذلك [speedata publisher](https://speedata.github.io/publisher/) الذي يستخدم LuaTeX بوصفه محرك توليد PDF فقط ضمن سير عمله القائم على XML—فهو لا يستخدم LaTeX إطلاقًا. بل إن speedata publisher لا يحتوي عمليًا على أي شيفرة TeX—وقد سألتُ [Patrick Gundlach](https://twitter.com/patrickgundlach)، مطور speedata publisher، الذي أكد أن إجمالي ما يستخدمه هو نحو ثلاثة أسطر من شيفرة TeX. وتُصمَّم قدراته القوية في التنضيد وتُنفَّذ في شيفرة Lua، باستخدام واجهة برمجة تطبيقات Lua الخاصة بـLuaTeX (وهو موضوع نناقشه لاحقًا في هذه المقالة).

## قصة شخصية قصيرة: كيف اكتشفت LuaTeX لأول مرة

اكتشفتُ LuaTeX لأول مرة في أواخر 2009/أوائل 2010 عندما كان لا يزال في مرحلة الإصدار التجريبي المتوسط (الإصدار 0.50). في ذلك الوقت كنت أبحث عن برمجيات قائمة على TeX لتنضيد الملاحظات المكتوبة بخط اليد الناتجة عن جهودي لتعلم بعض العربية. وأظهرت عمليات بحث Google مجموعة من مقاطع الفيديو من مؤتمر TUG 2009 ([الآن على YouTube](https://www.youtube.com/playlist?list=PL2D4DD50DC9C0BA0E)) والتي تضمنت عروضًا لتنضيد العربية بجودة عالية جدًا (عبر حزمة [ConTeXt](http://wiki.contextgarden.net/Main_Page)). كما تضمنت تلك المقاطع أيضًا محاضرة بعنوان [مشروع LuaTeX: في منتصف الطريق إلى الإصدار 1](https://youtu.be/AKv4po9PGW0).

كان محرك TeX المستخدم لإنتاج ذلك التنضيد العربي البديع شيئًا يُسمى «LuaTeX». في ذلك الوقت كنت أعمل في النشر العلمي (الفيزياء)، ورغم معرفتي التامة بـTeX/LaTeX لم أكن قد سمعت بـLuaTeX: أثار فضولي وأردت معرفة المزيد عن هذا المحرك الجديد لـTeX. ولأن LuaTeX كان لا يزال في مرحلة التطوير التجريبي، ويخضع لتطوير سريع، أردتُ أن أبقى على اطلاع بأحدث التحديثات، لذا كان الخيار الأفضل (بالنسبة إليّ) هو الطريق اليدوي المتمثل في بناء (ترجمة) الملف التنفيذي لـLuaTeX من شيفرة مصدره. وإلى جانب البرنامج التنفيذي LuaTeX، تحتاج أيضًا إلى «تثبيت TeX» لتوفير البيئة التي يُشغَّل فيها LuaTeX (مثل texmf.cnf، وحزم الماكرو، والخطوط، إلخ). بدلًا من تنزيل وتثبيت حزمة [TeX Live](https://www.tug.org/texlive/) التوزيع الضخمة، اخترتُ إنشاء تثبيت TeX مخصصًا بالغ البساطة لاستكشاف LuaTeX (وهو تمرين «مثير للاهتمام» [وثقتُه في مدونتي الشخصية](http://www.readytext.co.uk/?cat=30)). ويرافق كل إصدار جديد من LuaTeX دليلُه المرجعي (مثلًا، بالنسبة إلى[الإصدار 1.0.4](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co)) الذي يوثّق أحدث خصائص البرنامج ووظائفه. ومع ذلك فهو دليل *مرجعي* وهو، بالضرورة، خفيف إلى حد ما في الشروح المناسبة للمبتدئ الراغب في البدء باستخدام هذا المحرك المذهل لـTeX—إذ يُفترض قدر من الإلمام بمفاهيم TeX منخفضة المستوى. وبما أنني اكتشفت LuaTeX في مرحلة مبكرة نسبيًا من تطوره، فقد كان العثور على مادة تمهيدية جيدة في ذلك الوقت صعبًا نسبيًا، لذلك استغرق الأمر بعض الاستكشاف والتجريب (وبعض الإحباط...) قبل أن تبدأ القطع في الالتحام. وغني عن القول إن دراستي للعربية توقفت فجأةً مع انبهاري بهذا البرنامج المدهش، ثم انتهى بي المطاف إلى كتابة  [ملحقات LuaTeX لتنضيد العربية](http://www.readytext.co.uk/?p=3143) بدلًا من ذلك!

كانت «رحلتي مع LuaTeX» غير خطية بالتأكيد، لكنها أتاحت لي، أثناءها، فرصة تعلم (Lua)TeX (وتثبيتات TeX) «من الألف إلى الياء»: يستضيف مدونتي مجموعة انتقائية من [المقالات](http://www.readytext.co.uk/?cat=3) المبنية على موضوعات مختلفة استكشفتها وعملت عليها خلال تلك الفترة. وآمل أن تكون هذه المقالة قد استثمرت ذلك الوقت والخبرة على نحو مناسب، بما يساعد الآخرين على الاهتمام ببدء استكشاف قدرات LuaTeX. ولا يزال LuaTeX قيد التطوير، وفي وقت كتابة هذه السطور، وصل إلى الإصدار 1.0.4 الذي صدر مع TeX Live 2017. المطورون نشيطون جدًا، وعادةً ما تُصلح أي أخطاء يُكتشف وجودها قريبًا بعد الإبلاغ عنها—مثلًا، عبر [القائمة البريدية dev-luatex](https://mailman.ntg.nl/mailman/listinfo/dev-luatex) أو عبر [متعقّب الأخطاء عبر الإنترنت الخاص بـLuaTeX](http://tracker.luatex.org/my_view_page.php). وقبل وقت طويل من وصوله إلى الإصدار 1.0 كان LuaTeX قادرًا على الإنتاج—مع أنه، بالطبع، كان يتعيّن عليك قبول أن الخصائص كانت تتطور باستمرار، وأن التغييرات قد تكسر أحيانًا شيفرة TeX الحالية لديك. واليوم، يُدعَم LuaTeX، بالطبع، من قِبل منصتي Overleaf وShareLaTeX (بوصفه LuaLaTeX).

## TeX في عالم متغير: تقنيات وسير عمل جديدة

من الواضح أن محركات TeX لا تعمل داخل عالم ثابت تكنولوجيًا، وأحيانًا تظهر ابتكارات تكون مرشحة فورية وواضحة للإدراج في محركات TeX—ومن هذه الابتكارات خطوط OpenType المتغيرة، التي نناقشها بإيجاز أدناه. ورغم أنه لا شك في أن برمجيات التنضيد القائمة على TeX بالغة التنوع، فإن محركات TeX تعمل الآن ضمن منظومة برمجية شديدة التنوع وسريعة التغير—ما يجعل سير العمل الجديد يبرز الحاجة إلى التكامل وإلى المرونة لتنفيذ طيف واسع من حلول المستندات/التنضيد، والتي قد يكون TeX فيها مجرد مكوّن واحد.

لا يجب على TeX ألا يظل ذا صلة بمستخدميه الحاليين فحسب، بل يجب أيضًا أن يجذب مستخدمين جدداً عبر تمكين حلول إنشاء المحتوى التي تظل مفيدة للأجيال القادمة—أشخاص قد لا يرغبون بالضرورة في استخدام TeX كأداة مستقلة، بل ربما كجزء من سير عمل شامل عبر منصات تعاونية عبر الإنترنت مثل Overleaf.

حتى إلقاء نظرة سريعة على [tex.stackexchange](https://tex.stackexchange.com/) يُظهر التنوع الهائل في المستندات والحلول التي يُنتجها ويُنفذها باستخدام برمجيات قائمة على TeX—وغالبًا ما تُظهر قدرًا مذهلًا من الإبداع مع إيجاد الناس المزيد والمزيد من حالات الاستخدام وأنواع المحتوى التي يرغبون في توليدها. بالإضافة إلى ذلك، لم تكن الحاجة إلى سير عمل يمكنه معالجة ترميز/محتوى قائم على TeX لإنتاج مخرجات غير PDF (وغير DVI) أكبر من الآن—مثل MathML/XML وHTML. فعلى سبيل المثال، «تحويل» TeX إلى تنسيق [JATS XML](https://jats.nlm.nih.gov/)  (المستخدم منذ زمن طويل في نشر المجلات الأكاديمية)، وكذلك في الآونة الأخيرة، ظهور epub المستخدم في نشر الكتب الإلكترونية.

### تقنية الخطوط المتغيرة—الأزمنة تتغير

في 14 سبتمبر 2016، أعلنت Microsoft و [Google](https://opensource.googleblog.com/2016/09/introducing-opentype-font-variations.html), [وAdobe](https://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/) وApple عن تقنية خطوط جديدة: [خطوط OpenType المتغيرة](https://medium.com/@tiro/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369). لن نستعرض هذه التقنية بأي تفصيل، لكن يكفي أن نقول إن خبراء الخطوط المحترمين مثل [Thomas Phinney](https://twitter.com/ThomasPhinney) و [John Hudson](https://twitter.com/TiroTypeworks) لاحظوا ([على تويتر](https://twitter.com/ThomasPhinney/status/917087509342851072)) أن تقنية الخطوط المتغيرة يجري تبنيها أسرع بكثير من كثير من الابتكارات الخطية السابقة—ويرجح أن ذلك مدفوع باحتياجات مصممي الويب الذين يتطلبون تصاميم متجاوبة تتكيف مع عدد هائل من أحجام/دقات الشاشات المختلفة الموجودة في الأجهزة المحمولة.

من الواضح أن خطوط OpenType المتغيرة تطور مثير ومهم في تقنيات الخطوط، وهو تطور يمكن لمستخدمي TeX أن يستفيدوا منه بلا شك—وفي الواقع، لقد أُثير هذا السؤال حتمًا [على tex.stackexchange](https://tex.stackexchange.com/questions/355104/tex-luatex-xetex-fontspec-support-for-opentype-variable-fonts) مع مناقشة دعم LuaTeX له في قائمة البريدية الخاصة بـLuaTeX [القائمة البريدية](https://www.tug.org/pipermail/luatex/2016-September/006204.html).

وبالمناسبة، يجدر التنويه إلى أن تقنية الخطوط القائمة على إنشاء الخطوط «المعلماتية» ليست فكرة جديدة تمامًا: فـMETAFONT الخاصة بـKnuth وتقنيات Multiple Master الخاصة بـAdobe هما، من بعض النواحي، سلفان مبكران، حتى لو كانت تفاصيل التنفيذ مختلفة تمامًا.

### الخطوط المتغيرة: متى نريدها—الآن؟

إن أي معيار/مواصفة تقنية جديدة ومفيدة تحتاج إلى وقت «لتستقر» داخل منظومة المطورين والمنفذين المستهدفة—بما في ذلك وقت لإزالة أي غموض أو تفسيرات لعباراتها داخل المواصفة نفسها. وعلى المطورين أن يقرؤوا الوثائق ويفهموها ثم يحولوها إلى برمجيات عاملة حقيقية—وهذا هنا يشمل إنشاء الخطوط والتقنيات لاستخدامها: متصفحات ومحركات تنضيد متوافقة. وسيحتاج مطورو TeX بوضوح إلى الوصول إلى خطوط متغيرة عالية الجودة يمكن استخدامها بوصفها «معايير» موثوقة لتنفيذ (برمجة) دعم تقنيات الخطوط المتغيرة.

إن تنفيذ أي تقنية جديدة داخل TeX، مثل الخطوط المتغيرة، يثير *الاحتمال* لحاجة إلى تعديل البنية الداخلية لمحركات TeX—وبالطبع، تعتمد الحاجة إلى ذلك على طبيعة تلك التقنية، والأهم من ذلك، على أي جانب من سلوك TeX يخضع للتغيير. وليس من الضروري دائمًا تعديل محركات TeX نفسها، فقد يتطلب الأمر فقط تغييرات في البرمجيات الداعمة/الملحقة، بما في ذلك أي «مكوّنات» (مكتبات شيفرة تابعة لجهات خارجية) مستخدمة ضمن تلك البرامج. داخليًا، محركات TeX *معقدة إلى حدٍّ شيطاني* —فإن تطوير فهم كافٍ لشيفرة مصدر TeX يسمح بإجراء تعديلات موثوقة يتطلب خبرة كبيرة ومتخصصة للغاية (وهي خبرة متوفرة بكميات محدودة جدًا). ومن الضروري أيضًا ألا تؤثر أي تعديلات سلبًا في الاستقرار/التوافق طويل الأمد لمحركات TeX—وهو أمر حيوي لمجتمع TeX ولمن يعالج لاحقًا ملف/ملفات (La)TeX الخاصة بالمؤلف: ولا سيما الناشرون الأكاديميون والخدمات المعتمدة على السحابة مثل Overleaf وShareLaTeX.

من المرجح أن كثيرًا من مستخدمي TeX يرغبون في الاستفادة من الخطوط المتغيرة؛ على سبيل المثال، لتطبيق إمكانات تصميم جديدة أو لإيجاد حلول لمشكلات تنضيد معقدة. لذا، يوجد من بعض الزوايا مأزق: مستخدمو TeX يريدون الوصول إلى تقنية جديدة، لكن تنفيذها يعتمد على مورد محدود جدًا: عدد المطورين المؤهلين والقادرين على إنجاز ذلك. إن تعديل البنية الداخلية لـTeX أمر صعب، وبوجه عام يُفضّل تجنبه كلما أمكن، فهل توجد طريقة أخرى للتعامل مع إضافة (بعض الفئات من) الميزات/القدرات الجديدة إلى TeX؟ نعم! وقد سلك LuaTeX هذا الطريق.

#### تجارب مبكرة: خطوط OpenType المتغيرة وLuaTeX

لقد أتاح تصميم LuaTeX إجراء تجارب سريعة مع تقنية الخطوط المتغيرة. بالفعل، وبحلول أبريل 2017، كان تنسيق TeX ConTeXt، الذي يستخدم LuaTeX، يملك [نسخة تجريبية](https://mailman.ntg.nl/pipermail/ntg-context/2017/088343.html) تطبّق خطوط OpenType المتغيرة. وكان هذا ممكنًا لأن دعم الخطوط في ConTeXt مبني في شيفرة Lua (ولدى ConTeXt أيضًا محمل خطوط خاص به مكتوب بلغة Lua).

## LuaTeX: خلفية وتاريخ

LuaTeX، بمقاييس TeX، هو «الوافد الجديد» رغم أنه كان قيد التطوير النشط لأكثر من 10 سنوات. يوضح موقع LuaTeX [أن](http://www.luatex.org/roadmap.html) LuaTeX بدأ حياته في عام 2005 مع (وأعتقد) بداية التطوير النشط والمستمر في 2006. وبسبب تعقيده الذاتي، وحرص من بنوه، استغرق LuaTeX فعلًا 10 سنوات من التطوير حتى يصل إلى الإصدار 1.0، الذي [أعلنه مطوروه](https://mailman.ntg.nl/pipermail/dev-luatex/2016-September/005882.html) (Hans Hagen، Hartmut Henkel، Taco Hoekwater، Luigi Scarso) في 27 سبتمبر 2016.

وفي ذلك الإعلان عن الإصدار، ترد عبارة مبدئية مهمة:

> «هدفنا الرئيسي هو توفير نسخة من TeX تتيح امتدادات المستخدم من دون الحاجة إلى تعديل الآليات الداخلية.»

هذه الصياغة تجسد تمامًا الفلسفة الكامنة وراء تطوير LuaTeX وتشير إلى طريق يمكن لبرمجيات TeX عبره أن تواجه التحديات التي ذكرناها بالفعل: اعتماد التقنيات الجديدة والبقاء على صلة بالأجيال الجديدة من المستخدمين.

حان الآن الوقت للتطرق إلى السؤال الثاني الوارد في العنوان الفرعي لهذه المقالة: «ما الذي يجعله مختلفًا إلى هذا الحد». ومن خلال استكشاف معنى «...تتيح امتدادات المستخدم من دون الحاجة إلى تعديل الآليات الداخلية» يمكننا أن نفهم بصورة أفضل جوهر ما «يقدمه» LuaTeX.

## LuaTeX: فتح «الصندوق الأسود» الخاص بـTeX

برنامج TeX الأصلي الذي كتبه Knuth هو السلف المشترك لجميع محركات TeX الحديثة المستخدمة اليوم، وLuaTeX هو، في الواقع، الخطوة التطورية الأحدث: فهو مشتق من برنامج pdfTeX لكن مع إضافة بعض المكوّنات البرمجية القوية التي تجلب قدرًا كبيرًا من الوظائف الإضافية. عندما كتب Knuth النسخة الأصلية من برمجية TeX فقد زوّد أيضًا لغة TeX بوصفها وسيلة للتحكم في سلوك التنضيد وبرمجته: إذ أُتيح للمستخدمين ومطوري حزم ماكرو TeX نحو 320 أمرًا منخفض المستوى (بدائيات). وقد وفرت تلك الأوامر درجات متفاوتة من التحكم أو التأثير في بعض جوانب سلوك تنضيد TeX، لكن معظم الوظائف الداخلية لـTeX، وخوارزمياته، وعمليات اتخاذ القرار، والبيانات وهياكل البيانات، كانت مخفية عن المستخدم. ويمكن القول إن برنامج TeX الخاص بـKnuth لم يكن «صندوقًا أسود» بالكامل، لكنه كان بالتأكيد بدرجة رمادية داكنة جدًا—وبالطبع أُتيح الشيفرة المصدرية، لكنها أيضًا بالنسبة إلى الغالبية العظمى من الناس صندوق أسود لا يُفهم.

نشير إلى العمليات الداخلية في TeX على أنها إلى حد ما «صندوق أسود»؛ لكن LuaTeX يفتح داخلياته القائمة على TeX ليمنح المستخدمين/المطورين وصولًا أكبر بكثير إلى كثير من العمليات التي كانت مخفية سابقًا وتدور في أعماق محرك TeX وتحكمًا أكبر فيها. كما يضيف LuaTeX العديد من الأوامر البدائية الجديدة التي توفر التحكم في الخصائص الجديدة.

### LuaTeX: مشتق من pdfTeX لكنه لا يستخدم شيفرة pdfTeX

من أجل الدقة، من المهم ملاحظة أنه على الرغم من وصفنا LuaTeX بأنه مشتق من pdfTeX، فإن LuaTeX لا يستخدم مباشرة الشيفرة الأصلية لبرنامج pdfTeX. وقد اضطلع أحد مطوري LuaTeX (Taco Hoekwater) بالمهمة *الهِرقلية* حقًا لإعادة كتابة محرك TeX الأساسي الخاص بـLuaTeX بلغة C نظيفة وحديثة (CWEB).

#### ملاحظة تاريخية

جزئيًا بسبب قِدم الشيفرة المصدرية الأصلية لـTeX التي اشتُقت منها خلفاؤه الحديثون—فإن تعديلها لتكييف أو إنشاء محركات تنضيد جديدة قائمة على TeX عملية معقدة ومتشعبة. ويستلزم جزء من تلك العملية تحويل شيفرة Pascal إلى شيفرة C—وهو أمر لا يخلو من [درجة معينة من التعقيد](http://www.readytext.co.uk/?p=2529). أما شيفرة C الناتجة والمولدة آليًا فهي مطوّلة للغاية ويصعب جدًا قراءتها أو فهمها. ومن الواضح أن إعادة كتابة شيفرة LuaTeX بالكامل تتجاوز عملية التحويل من Pascal إلى C برمتها.

## لبنات بناء LuaTeX

في المقدمة أشرنا إلى LuaTeX بوصفه «مجموعة أدوات» ووصفناه بأنه «نظام بناء وهندسة المستندات». وقد رأينا أنه ضمن إعلان LuaTeX 1.0 صرّح مطوروه بما يلي:

> «هدفنا الرئيسي هو توفير نسخة من TeX تتيح امتدادات المستخدم من دون الحاجة إلى تعديل الآليات الداخلية.»

حان الوقت الآن لجمع هذه الخيوط والأفكار والتركيز على تفاصيل ما يعنيه كل هذا *فعليًا* في الممارسة.

### لغز LuaTeX

إذا أمعنت النظر «تحت الغطاء» فسترى أن برمجية LuaTeX، أي البرنامج التنفيذي الفعلي، مبنية من مجموعة من المكوّنات البرمجية التي تُجمَع معًا لتوفير الوظائف العامة لـLuaTeX. وبالطبع، لا جديد في ذلك، فمعظم البرمجيات تُبنى بهذه الطريقة. لكن ما يجعل LuaTeX مختلفًا عن محركات TeX الأخرى هو أن هذه المكوّنات تُجمع بطريقة تتيح للمستخدمين وصولًا أكبر بكثير إلى كثير من جوانب الوظائف الداخلية لـTeX: خوارزميات التنضيد، وعمليات اتخاذ القرار، والبيانات وهياكل البيانات الخاصة به. إن هذا الانفتاح على داخليات TeX يمكّن المستخدمين من إنشاء حلول تنضيد جديدة من دون الحاجة إلى تعديل محرك TeX الفعلي نفسه.

### الـLua في LuaTeX: مفتاح «الصندوق الأسود»

Lua لغة برمجة نصية قوية جدًا، لكنها سهلة التعلم، و [تأتي من البرازيل](https://www.lua.org/about.html)—أُنشئت في عام 1993 وما تزال قيد التطوير النشط. ومن نقاط قوة Lua استخدامها كلغة برمجة يمكن بها «لصق» مكونات برمجية متباينة معًا، ما يتيح لك استخدامها عبر لغة برمجة نصية بسيطة لكنها متعددة الاستخدامات. وتؤدي Lua دورًا محوريًا في فتح الآليات الداخلية لمحرك TeX في LuaTeX، لكن لفهم كيفية تحقيق ذلك بشكل أفضل، يجدر القيام بانحراف بسيط لمناقشة مفهومي برمجيين بإيجاز شديد:

* واجهة برمجة التطبيقات (API);
* ربط لغة البرمجة.

لا تتردد في تخطي هذا القسم إذا كنت مرتاحًا مع هذين المفهومين. لن يُتناول أي من الموضوعين بتفصيل—فلسنا نهدف إلى الدقة التقنية الصارمة، بل إلى تقديم خلفية كافية فقط للتنبه إلى هذين المفهومين: معناهما وصلتهما بـLuaTeX.

### واجهة برمجة التطبيقات (API)

تخيل أنك مبرمج كتبت بعض الشيفرة التي قد يجدها مستخدمون آخرون (مبرمجون آخرون) مفيدة، لكن شيفرتك معقدة ولا تريد من مستخدمي شيفرتك أن يقلقوا بشأن تلك التفاصيل منخفضة المستوى. لاحظ أن هؤلاء المبرمجين/المطورين يعملون بلغة البرمجة نفسها التي استخدمتها لكتابة شيفرتك. علاوة على ذلك، افترض أن لديك خططًا لإعادة كتابة بعض أجزاء شيفرتك—مثلًا لجعلها أسرع، أو تحتاج إلى ذاكرة أقل، وما إلى ذلك. لا ينبغي أن يقلق المستخدمون الحاليون لشيفرتك من ذلك: أي تغييرات تنوي إجراؤها يجب ألا تكسر برامجهم. إذن، ما الحل؟

الجواب يكمن في شيء يُسمى API: وهي *واجهة برمجة التطبيقات*. وبدلًا من مطالبة المستخدمين (المبرمجين الآخرين) بالوصول إلى التفاصيل منخفضة المستوى في شيفرتك—التي قد تتغير—فإنك توفر مجموعة محددة من *الوظائف* التي يمكن للمبرمجين الآخرين استخدامها. تلك الوظائف هي *واجهة* لشيفرتك، ومن خلالها يمكن لمطورين آخرين بناء *تطبيقات* من دون الحاجة إلى معرفة دقيقة بآليات برنامجك الداخلية. ويمكنك من بعض النواحي أن تنظر إليها بوصفها طبقة إضافية تحيط بشيفرتك و«تعزل» المستخدمين عن التفاصيل الفوضوية منخفضة المستوى.

ما دمت لا تغيّر تلك الوظائف (الواجهة) فأنت حر في تعديل وتحديث التفاصيل الأدنى مستوى في برمجيتك من دون التأثير في عمل من يعتمدون على شيفرتك لبناء تطبيقاتهم (أو إفساده): ومن هنا جاء مصطلح واجهة برمجة التطبيقات.

#### واجهات برمجة التطبيقات: تشبيه بحزمة LaTeX

عندما تستخدم الأوامر التي توفرها حزمة LaTeX يمكنك أن تنظر إلى أوامر الحزمة بوصفها شكلاً من أشكال API. فبصفتك مستخدمًا، لست بالضرورة معنيًا بسحر TeX وLaTeX الكامن وراء تلك الأوامر (أي في شيفرة الحزمة): كل ما تريده هو الاستفادة من الوظائف التي توفرها.

### ربط لغة البرمجة

لقد رأينا أن المبرمجين الذين يكتبون/ينشرون مجموعة من الشيفرة المفيدة (تسمى *مكتبة*) يمكنهم توفير ما يُعرف بواجهة برمجة التطبيقات (مجموعة من الوظائف) التي يستطيع عبرها مبرمجون آخرون، باستخدام *نفس* لغة البرمجة، الاستفادة من تلك المكتبة (مجموعة الشيفرة). وهذا أمر جيد عندما يستخدم الطرفان (مطور المكتبة ومستخدموها) *نفس* لغة البرمجة نفسها، لكن ماذا يحدث إذا أراد مبرمجون يستخدمون لغة برمجة *مختلفة* أيضًا الاستفادة من تلك المكتبة؟ على سبيل المثال، قد تكتب نصوصًا باستخدام لغة Lua ولكنك تريد الاستفادة من مكتبة مكتوبة بلغات برمجة مثل C/C++. بطريقة ما، تحتاج اللغتان المختلفتان (Lua وC/C++) إلى القدرة على «التواصل» مع بعضهما. أحد الحلول لهذه المشكلة هو ما يُسمى [ربط اللغة](https://en.wikipedia.org/wiki/Language_binding).

إن فحص التفاصيل التقنية لربط اللغات خارج نطاق هذه المقالة، لذا سنقدم ملخصًا موجزًا للمبادئ العامة. في جوهر الأمر، عبر إضافة «طبقة» مناسبة إضافية من الشيفرة إلى المكتبة الأصلية يمكنها «التواصل» مع لغة برمجة أخرى (مثل Lua): وتسمى تلك الطبقة من الشيفرة *رابطًا*. وهي تُمكّن اللغتين من التفاعل عبر API يمكن لمبرمجي اللغة الثانية (مثل Lua) استخدامها للوصول إلى الخصائص/الخدمات التي توفرها المكتبة.

![مخطط تخطيطي يوضح مفهوم ربط اللغة.](/files/639e73b9eb4d9a2c15744902660517fa2de7a34a)

**الشكل 1**: مخطط تخطيطي يوضح مفهوم ربط اللغة: تمكين برنامج مكتوب بلغة Lua من استخدام مكتبة خارجية مكتوبة بلغة برمجة أخرى. ومن خلال استخدام روابط Lua تُتاح المكوّنات الداخلية لـLuaTeX، وبالتالي كثير من وظائف التنضيد الداخلية في LuaTeX، للمستخدمين لتطوير حلول لمشكلات تنضيد معقدة.

## LuaTeX: خياران للبرمجة—TeX وLua

بوجه عام، LuaTeX هو محرك TeX يدعم لغتي برمجة: اللغة التقليدية القائمة على TeX ولغة Lua النصية. وبالطبع، يمكنك استخدام اللغتين في الوثيقة نفسها، أو إن شئت، مواصلة التنضيد عبر مسار TeX فقط: مثلًا عبر حزمة الماكرو LaTeX (LuaLaTeX). إن TeX (أو LaTeX) ليست لغة برمجة سهلة الاستخدام أو التعلم، وقلة نسبيًا هم الذين أتقنوا حقًا شتى غرائب TeX—فمفاهيم TeX الخاصة بـ [رموز](https://www.overleaf.com/blog/522-what-is-a-tex-token) والتوسيع غريبة جدًا عن توقعات وتجارب معظم الناس مع لغة برمجة.

إن إضافة Lua تفتح القدرة على استخدام التنضيد القائم على TeX عبر لغة برمجة أكثر سهولة وأعرافية بكثير—وكما أشرنا قرب بداية هذه المقالة، يمكنك باستخدام Lua API إجراء [تنضيد متطور من دون أي شيفرة TeX تقريبًا](http://wiki.luatex.org/index.php/TeX_without_TeX).

### يضيف LuaTeX العديد من البدائيات الجديدة

توفّر كل محرك TeX مئات الأوامر البدائية المزعومة: اللبنات الأساسية للغة القائمة على TeX التي يدعمها كل محرك تنضيد على حدة. وقد قدّمت النسخة الأصلية من TeX التي أصدرها دونالد Knuth نحو 320 أمرًا، لكن محركات TeX الأحدث (pdfTeX وXeTeX وLuaTeX) أضاف كل منها العديد من البدائيات الجديدة لتزويد المستخدمين بالوصول إلى الخصائص والوظائف الإضافية لكل محرك. وتوثَّق الأعداد الكبيرة من البدائيات الجديدة في LuaTeX ضمن [دليله المرجعي](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co).

ومن بين العديد من البدائيات الجديدة التي أدخلها LuaTeX يوجد ما كان يُسمى مرةً `\directlua{...}` وهو البوابة إلى استخدام شيفرة Lua: للوصول إلى داخليات محرك LuaTeX لبناء أدوات وحلول تنضيد متقدمة.

### \u005cdirectlua{...}: البوابة إلى برمجة Lua

وكما نوقش، يمكن النظر إلى لغة Lua النصية على أنها توفر «طبقة» يمكن عبرها الوصول إلى محرك تنضيد LuaTeX القائم على TeX وإلى الوظائف التي توفرها العديد من المكوّنات التي بُني منها LuaTeX. كما أن لغة Lua هي الآلية التي تُمكّن قابلية التوسعة في LuaTeX—وذلك عبر قدرة Lua على تحميل مكتبات برمجية/شيفرات خارجية متخصصة.

يُشار إلى واجهة Lua (مجموعة الدوال القائمة على Lua) التي يوفرها LuaTeX مجتمعةً باسم *واجهة برمجة تطبيقات Lua*: وهي «رابط الاتصال» بين المحرك/المكوّنات الداخلية في LuaTeX ومستند المستخدم.

### مثال بسيط على \u005cdirectlua{...}

المخططات *بسيط للغاية* لا يبدأ هذا المثال حتى في خدش سطح قمة جبل الجليد من الإمكانات. ومع ذلك فهو يوضح الفكرة الأساسية للتفاعل بين «طريقة TeX» و«طريقة Lua» للوصول إلى معاملات TeX.

لاحظ أن:

* `\hsize` هو أمر بدائي في TeX يضبط قيمة معامل داخلي يحدد عرض الأسطر المنضدة—فعلى سبيل المثال، تضبطه عادةً على قيمة مناسبة داخل `\vbox{...}`. `\hsize` هو مجرد واحد من *الكثير من* معاملات TeX التي يمكنك الوصول إليها و/أو تعديلها بواسطة شيفرة Lua.
* إن الوصول إلى معاملات TeX ليس سوى *جانب* ضئيل جدًا من واجهة برمجة تطبيقات Lua الخاصة بـLuaTeX: فهناك الكثير غير ذلك!

```latex

\documentclass{article}
\begin{document}
\u005clet\u005c\u005c\u005crelax %إعادة تعريف معنى \u005c\u005c لتجنّب مشكلات التوسيع
فيما يلي القيمة الحالية لـ{\ttfamily\u005cstring\u005chsize} (عبر \u005cLaTeX):
\u005cthe\u005chsize\u005cpar
\directlua{
%الحصول على القيمة الحالية لـ\u005chsize باستخدام واجهة Lua API
local hs=tex.hsize
% استخدام دالة من Lua API لطباعة بعض
% شيفرة LaTeX وقيمة \u005chsize
tex.print("هذه هي قيمة {\\ttfamily\\string\\hsize}
المبلغ عنها من شيفرة Lua (بوحدات النقاط المُقيّسة): ")
tex.print(hs.."\\par")
% تعيين قيمة جديدة لـ\u005chsize باستخدام Lua API
tex.hsize="400pt" % أو استخدم tex.hsize=400*65536 (بوحدات النقاط المُقيّسة)
}%
% بعد انتهاء \u005cdirectlua، اطلب من LaTeX
% أن يخبرنا بالقيمة الجديدة لـ\u005chsize
هذه هي قيمة {\ttfamily\u005cstring\u005chsize} المُبلَّغ عنها
بواسطة \u005cLaTeX{} بعد انتهاء {\tt\u005cdirectlua}:
\u005cthe\u005chsize\u005cpar
\end{document}
```

إليك صورة تُظهر نتيجة تنضيد LuaTeX لشيفرة LaTeX (أعلاه):

![نتائج تشغيل LuaTeX](/files/0bfc84f0d71f4d0ab28d98acf261e63a8b6566cb)

لاحظ أن الحيلة التقنية في `\let\\\relax` هي تجنّب المشكلات الناجمة عن «توسيع» LuaTeX لشيفرة Lua: وهو موضوع نشير إليه بإيجاز أدناه.

### استخدام شيفرة Lua

هناك خياران رئيسيان لاستخدام شيفرة Lua في مستندات TeX/LaTeX الخاصة بك:

1. **مضمنة**: كتابة شيفرة Lua مباشرة داخل `.tex` مستندك (كما في المثال أعلاه);
2. **خارجية**: تخزين شيفرة Lua في ملفات `.lua` شيفرة خارجية واستخدام إمكانات Lua لتحميلها وتشغيلها.

الخيار (1) هو الأنسب لمقاطع Lua الأقصر. أما الخيار (2) فيُستخدم للبرامج الأكبر أو لمكتبات شيفرة Lua. وله ميزة واضحة تتمثل في أنه يمكنك تجنب المشكلات المربكة المتعلقة بما يُسمى في TeX `\catcode` قيمًا `\catcode`  (التي قد تكون «محبطة جدًا»). وسبب هذه

بالطبع توجد حزم LaTeX للمساعدة على استخدام شيفرة Lua في ملفات .tex الخاصة بك—فعلى سبيل المثال يمكنك استخدام [حزمة luacode](https://ctan.org/pkg/luacode?lang=en).

## الملخص وإدخال الجزء 2 من هذه المقالة

توفر مكوّنات البرمجيات التي يُبنى منها LuaTeX، إلى جانب لغة البرمجة Lua المضمّنة، مزيجًا قويًا لبناء حلول قادرة على حل طيف واسع من مشكلات التنضيد المعقدة—وهندسة سير عمل لإنتاج المستندات يمكن أن تستفيد من التكامل الوثيق مع محرك تنضيد قائم على TeX. في [الجزء 2 من هذه المقالة](/latex/ar/mqalat-mtamqh/09-an-introduction-to-luatex-part-2-understanding-directlua.md) نلقي نظرة متعمقة على أقوى أمر يوفّره LuaTeX: `\directlua`.

وإلى ذلك الحين، أتمنى لكم متعة استخدام LuaTeX!

## الشكر والتقدير

المؤلف ممتن للغاية لـ [لويجي سكارسو](https://twitter.com/luigi_scarso)، أحد مطوّري LuaTeX، على تخصيصه الوقت لقراءة مسودة هذه المقالة وتقديمه عددًا من التعليقات والاقتراحات المفيدة جدًا. وأي أخطاء متبقية في الوقائع، أو أي سهو، فهي بالطبع مسؤولية المؤلف. بالإضافة إلى ذلك، أود أن أشكر [Patrick Gundlach](https://twitter.com/patrickgundlach)، مطوّر [speedata publisher](https://speedata.github.io/publisher/)، على تخصيصه الوقت للإجابة عن أسئلتي.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/ar/mqalat-mtamqh/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
