> 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/el/se-vathos-arthra/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/el/se-vathos-arthra/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 API του LuaTeX (ένα θέμα που συζητούμε αργότερα σε αυτό το άρθρο).

## Μια σύντομη προσωπική ιστορία: Πώς ανακάλυψα πρώτη φορά το LuaTeX

Πρώτη φορά έμαθα για το LuaTeX στα τέλη του 2009/αρχές 2010, όταν βρισκόταν ακόμη στο μέσο στάδιο της beta έκδοσης (έκδοση 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 βρισκόταν ακόμη στο στάδιο ανάπτυξης beta και εξελισσόταν ραγδαία, ήθελα να παραμένω ενημερωμένος με τις πιο πρόσφατες εξελίξεις, οπότε η καλύτερη επιλογή (για μένα) ήταν η λύση του να φτιάξω μόνος μου (να μεταγλωττίσω) το εκτελέσιμο 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) ή μέσω του [online καταγραφέα σφαλμάτων του 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) έχουν παρατηρήσει ([στο Twitter](https://twitter.com/ThomasPhinney/status/917087509342851072)) ότι η τεχνολογία των μεταβλητών γραμματοσειρών υιοθετείται πολύ ταχύτερα από πολλές παλαιότερες καινοτομίες στις γραμματοσειρές—πολύ πιθανόν λόγω των αναγκών των web designers που απαιτούν προσαρμοστικά σχέδια τα οποία προσαρμόζονται στα μυριάδες διαφορετικά μεγέθη/αναλύσεις οθόνης που υπάρχουν σε κινητές συσκευές.

Σαφώς, οι μεταβλητές γραμματοσειρές 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 θα χρειαστούν σαφώς πρόσβαση σε γραμματοσειρές μεταβλητών υψηλής ποιότητας που μπορούν να χρησιμοποιηθούν ως αξιόπιστα «benchmarks» για την υλοποίηση (προγραμματισμό) υποστήριξης για τεχνολογίες μεταβλητών γραμματοσειρών.

Η υλοποίηση οποιασδήποτε νέας τεχνολογίας μέσα στο TeX, όπως οι μεταβλητές γραμματοσειρές, εγείρει την *ενδεχόμενη* ανάγκη να τροποποιηθούν τα εσωτερικά των μηχανών TeX—φυσικά, η ανάγκη να γίνει αυτό εξαρτάται από τη φύση αυτής της τεχνολογίας και, κρίσιμα, από το ποια πτυχή της συμπεριφοράς του TeX υπόκειται σε αλλαγή. Δεν είναι πάντα απαραίτητο να τροποποιηθούν οι ίδιες οι μηχανές TeX, απαιτώντας ίσως μόνο αλλαγές στο υποστηρικτικό/βοηθητικό λογισμικό, συμπεριλαμβανομένων τυχόν «συστατικών» (βιβλιοθηκών κώδικα τρίτων) που χρησιμοποιούνται μέσα σε αυτά τα προγράμματα. Εσωτερικά, οι μηχανές TeX είναι *διαβολικά* πολύπλοκες—η ανάπτυξη κατανόησης του πηγαίου κώδικα του TeX αρκετής για να γίνουν αξιόπιστες τροποποιήσεις απαιτεί σημαντική και ιδιαίτερα εξειδικευμένη εμπειρογνωμοσύνη (της οποίας η προσφορά είναι πολύ περιορισμένη). Είναι επίσης ουσιώδες οι οποιεσδήποτε τροποποιήσεις να μην επηρεάσουν αρνητικά τη μακροπρόθεσμη σταθερότητα/συμβατότητα των μηχανών TeX—κάτι που είναι ζωτικής σημασίας για την κοινότητα του TeX και για όσους στη συνέχεια επεξεργάζονται τα αρχεία (La)TeX ενός συγγραφέα: κυρίως ακαδημαϊκούς εκδότες και διαδικτυακές υπηρεσίες όπως το Overleaf και το ShareLaTeX.

Πολλοί χρήστες του TeX πιθανότατα θα ενδιαφέρονται να αξιοποιήσουν τις μεταβλητές γραμματοσειρές· για παράδειγμα, εφαρμόζοντας νέες σχεδιαστικές δυνατότητες ή βρίσκοντας λύσεις σε δύσκολα προβλήματα τυποποίησης. Άρα, κατά κάποιον τρόπο, υπάρχει ένα δίλημμα: οι χρήστες του TeX θέλουν πρόσβαση σε μια νέα τεχνολογία, αλλά η υλοποίησή της εξαρτάται από έναν πολύ περιορισμένο πόρο: τον αριθμό των προγραμματιστών που είναι καταρτισμένοι και ικανοί να την κάνουν πραγματικότητα. Η τροποποίηση των εσωτερικών του TeX είναι δύσκολη και, γενικά, είναι καλύτερο να αποφεύγεται όπου είναι δυνατόν, οπότε υπάρχει άλλος τρόπος να προσεγγίσουμε την προσθήκη νέων χαρακτηριστικών/δυνατοτήτων στο TeX; Ναι! και το LuaTeX έχει ακολουθήσει αυτόν τον δρόμο.

#### Πρώιμα πειράματα: Μεταβλητές γραμματοσειρές OpenType και LuaTeX

Ο σχεδιασμός του LuaTeX επέτρεψε ταχεία πειραματική ενασχόληση με την τεχνολογία μεταβλητών γραμματοσειρών. Ήδη, από τον Απρίλιο του 2017, η μορφή TeX ConTeXt, η οποία χρησιμοποιεί το LuaTeX, είχε μια [beta έκδοση](https://mailman.ntg.nl/pipermail/ntg-context/2017/088343.html) η οποία υλοποιούσε μεταβλητές γραμματοσειρές OpenType. Αυτό ήταν δυνατό επειδή η υποστήριξη γραμματοσειρών του ConTeXt είναι υλοποιημένη σε κώδικα Lua (και το ConTeXt έχει δικό του fontloader γραμμένο σε 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 ως τρόπο ελέγχου και προγραμματισμού της συμπεριφοράς τυποποίησής του: περίπου 320 εντολές χαμηλού επιπέδου (primitive) διατέθηκαν στους χρήστες και στους προγραμματιστές πακέτων μακροεντολών TeX. Αυτές οι εντολές πρόσφεραν διάφορους βαθμούς ελέγχου ή επιρροής σε ορισμένες πτυχές της συμπεριφοράς τυποποίησης του TeX, αλλά μεγάλο μέρος της εσωτερικής λειτουργικότητας, των αλγορίθμων, των διαδικασιών λήψης αποφάσεων, των δεδομένων και των δομών δεδομένων του TeX ήταν κρυμμένο από τον χρήστη. Θα μπορούσε να υποστηριχθεί ότι το πρόγραμμα TeX του Knuth δεν ήταν ένα εντελώς «μαύρο κουτί» αλλά σίγουρα μια πολύ σκούρα απόχρωση του γκρι—αναγνωριστέο, ο πηγαίος κώδικας ήταν διαθέσιμος, αλλά για τη μεγάλη πλειονότητα των ανθρώπων, κι αυτός είναι ένα μαύρο κουτί ακατανόητο.

Αναφερόμαστε στις εσωτερικές διεργασίες μέσα στο TeX ως κάτι σαν «μαύρο κουτί»· όμως, το LuaTeX ανοίγει τα εσωτερικά του που βασίζονται στο TeX, παρέχοντας στους χρήστες/προγραμματιστές πολύ μεγαλύτερη πρόσβαση και έλεγχο σε πολλές από τις κάποτε κρυφές διεργασίες που λαμβάνουν χώρα βαθιά μέσα στη μηχανή TeX. Το LuaTeX προσθέτει επίσης πολλές νέες primitive εντολές που παρέχουν έλεγχο πάνω στα νέα χαρακτηριστικά.

### LuaTeX: Προέρχεται από το pdfTeX αλλά δεν χρησιμοποιεί τον κώδικα του pdfTeX

Για λόγους ακρίβειας, είναι σημαντικό να σημειωθεί ότι παρότι περιγράψαμε το LuaTeX ως προερχόμενο από το pdfTeX, το LuaTeX δεν χρησιμοποιεί άμεσα τον αρχικό κώδικα προγράμματος του pdfTeX. Ένας από τους προγραμματιστές του LuaTeX (ο Taco Hoekwater) ανέλαβε το πραγματικά *Ηράκλειο* έργο να ξαναγράψει τον βασικό TeX κινητήρα του LuaTeX σε καθαρό, σύγχρονο κώδικα C (CWEB).

#### Ιστορική σημείωση

Εν μέρει λόγω της ηλικίας του αρχικού πηγαίου κώδικα του TeX του Knuth—από τον οποίο προέρχονται οι σύγχρονοι απόγονοί του—η τροποποίησή του για προσαρμογή ή δημιουργία νέων μηχανών τυποποίησης βασισμένων στο TeX είναι μια σύνθετη και περίπλοκη διαδικασία. Μέρος αυτής της διαδικασίας απαιτεί τη μετατροπή κώδικα Pascal σε κώδικα C—κάτι που δεν είναι χωρίς ένα [ορισμένο βαθμό πολυπλοκότητας](http://www.readytext.co.uk/?p=2529). Το παραγόμενο C code που δημιουργείται από τη μηχανή είναι εξαιρετικά φλύαρο και πολύ δύσκολο να διαβαστεί ή να κατανοηθεί. Σαφώς, το ότι ο κώδικας του LuaTeX ξαναγράφτηκε πλήρως παρακάμπτει ολόκληρη τη διαδικασία μετατροπής από Pascal σε C.

## Τα δομικά στοιχεία του LuaTeX

Στην εισαγωγή αναφερθήκαμε στο LuaTeX ως «κιτ εργαλείων» και το περιγράψαμε ως «σύστημα κατασκευής και μηχανικής εγγράφων». Είδαμε ότι στην ανακοίνωση της έκδοσης 1.0 του LuaTeX οι δημιουργοί του δήλωσαν:

> «Ο κύριος στόχος μας είναι να παρέχουμε μια παραλλαγή του TeX που να επιτρέπει επεκτάσεις από τον χρήστη χωρίς να χρειάζεται να προσαρμοστεί ο εσωτερικός μηχανισμός.»

Είναι τώρα ώρα να ενώσουμε αυτά τα νήματα και τις ιδέες και να εστιάσουμε στις λεπτομέρειες του τι αυτό όλα *πράγματι σημαίνει* στην πράξη.

### Το παζλ του LuaTeX

Αν κοιτάζατε «κάτω από το καπό» θα βλέπατε ότι το λογισμικό LuaTeX, δηλαδή το πραγματικό εκτελέσιμο πρόγραμμα, κατασκευάζεται από μια συλλογή στοιχείων λογισμικού που συνδυάζονται για να παρέχουν τη συνολική λειτουργικότητα του LuaTeX. Φυσικά, αυτό δεν είναι κάτι νέο και το μεγαλύτερο μέρος του λογισμικού κατασκευάζεται έτσι. Ωστόσο, αυτό που κάνει το LuaTeX διαφορετικό από άλλες μηχανές TeX είναι ότι αυτά τα στοιχεία συνδυάζονται με τέτοιον τρόπο ώστε οι χρήστες να αποκτούν πολύ μεγαλύτερη πρόσβαση σε πολλές πτυχές της εσωτερικής λειτουργικότητας του TeX: τους αλγορίθμους τυποποίησης του TeX, τις διαδικασίες λήψης αποφάσεων, τα δεδομένα και τις δομές δεδομένων. Αυτό το άνοιγμα των εσωτερικών του TeX επιτρέπει στους χρήστες να κατασκευάζουν νέες λύσεις τυποποίησης χωρίς να χρειάζεται να τροποποιηθεί η ίδια η μηχανή TeX.

### Η Lua στο LuaTeX: Ένα κλειδί για το «μαύρο κουτί»

Η Lua είναι μια πολύ ισχυρή, αλλά και εύκολη στην εκμάθηση, γλώσσα δέσμης ενεργειών η οποία [προέρχεται από τη Βραζιλία](https://www.lua.org/about.html)—δημιουργήθηκε το 1993 και εξακολουθεί να αναπτύσσεται ενεργά. Ένα από τα δυνατά σημεία της Lua είναι η χρήση της ως γλώσσας προγραμματισμού με την οποία μπορείτε να «συγκολλάτε» ετερόκλητα στοιχεία λογισμικού, επιτρέποντάς σας να τα χρησιμοποιείτε μέσω μιας απλής αλλά ευέλικτης γλώσσας δέσμης ενεργειών. Η Lua παίζει κεντρικό ρόλο στο άνοιγμα του εσωτερικού μηχανισμού της μηχανής TeX του LuaTeX, αλλά για να κατανοήσουμε καλύτερα πώς επιτυγχάνεται αυτό, αξίζει να κάνουμε μια μικρή παράκαμψη για να συζητήσουμε πολύ σύντομα δύο προγραμματιστικές έννοιες:

* Διεπαφή Προγραμματισμού Εφαρμογών (API);
* δέσμευση γλώσσας προγραμματισμού.

Μη διστάσετε να παραλείψετε αυτή την ενότητα αν αισθάνεστε άνετα με αυτές τις έννοιες. Κανένα από τα δύο θέματα δεν θα καλυφθεί με λεπτομέρεια—δεν στοχεύουμε σε αυστηρή τεχνική ακρίβεια, αλλά μάλλον στο να προσφέρουμε απλώς επαρκές υπόβαθρο ώστε να γνωρίζετε αυτές τις έννοιες: το νόημά τους και τη συνάφειά τους με το LuaTeX.

### Διεπαφή Προγραμματισμού Εφαρμογών (API)

Φανταστείτε ότι είστε ένας προγραμματιστής που έχει γράψει κώδικα τον οποίο οι χρήστες (άλλοι προγραμματιστές) μπορεί να βρουν χρήσιμο, αλλά ο κώδικάς σας είναι πολύπλοκος και δεν θέλετε οι χρήστες του να χρειάζεται να ανησυχούν για αυτές τις λεπτομέρειες χαμηλού επιπέδου. Σημειώστε ότι εκείνοι οι προγραμματιστές/αναπτυγτές εργάζονται με την ίδια γλώσσα προγραμματισμού που χρησιμοποιήσατε για να γράψετε τον κώδικά σας. Επιπλέον, ας υποθέσουμε ότι έχετε σχέδια να ξαναγράψετε ορισμένα μέρη του κώδικά σας—π.χ. για να τον κάνετε ταχύτερο, να απαιτεί λιγότερη μνήμη κ.ο.κ. Οι υπάρχοντες χρήστες του κώδικά σας δεν θα πρέπει να ανησυχούν γι’ αυτό: οποιεσδήποτε αλλαγές σκοπεύετε να κάνετε δεν θα πρέπει να σπάνε τα προγράμματά τους. Λοιπόν, ποια είναι η λύση;

Η απάντηση βρίσκεται σε κάτι που ονομάζεται API: ένα *Application Programming Interface*. Αντί να απαιτείται από τους χρήστες (άλλους προγραμματιστές) να έχουν πρόσβαση στις λεπτομέρειες χαμηλού επιπέδου του κώδικά σας—οι οποίες μπορεί να αλλάξουν—παρέχετε ένα συγκεκριμένο σύνολο *συναρτήσεων* που άλλοι προγραμματιστές μπορούν να χρησιμοποιήσουν. Αυτές οι συναρτήσεις αποτελούν μια *διεπαφή* προς τον κώδικά σας, μέσω της οποίας άλλοι αναπτυγτές μπορούν να κατασκευάζουν *εφαρμογές* χωρίς να χρειάζεται να έχουν οικεία γνώση των εσωτερικών λειτουργιών του προγράμματός σας. Κατά κάποιον τρόπο μπορείτε να το θεωρήσετε ως ένα επιπλέον στρώμα που περιβάλλει τον κώδικά σας και «μονώνει» τους χρήστες από τις ακατάστατες λεπτομέρειες χαμηλού επιπέδου.

Εφόσον δεν αλλάξετε αυτές τις συναρτήσεις (τη διεπαφή), είστε ελεύθεροι να τροποποιείτε και να ενημερώνετε τις λεπτομέρειες χαμηλότερου επιπέδου του λογισμικού σας χωρίς να επηρεάζετε (να σπάτε) το έργο εκείνων που βασίζονται στον κώδικά σας για να κατασκευάζουν τις εφαρμογές τους: εξ ου και ο όρος Διεπαφή Προγραμματισμού Εφαρμογών.

#### APIs: Μια αναλογία με πακέτο LaTeX

Όταν χρησιμοποιείτε εντολές που παρέχονται από ένα πακέτο LaTeX μπορείτε να θεωρήσετε τις εντολές του πακέτου ως μια μορφή API. Ως χρήστης δεν σας απασχολεί απαραίτητα η μαγεία του TeX και της LaTeX πίσω από αυτές τις εντολές (δηλαδή, στον κώδικα του πακέτου): το μόνο που θέλετε είναι να αξιοποιήσετε τη λειτουργικότητα που παρέχουν.

### Δέσμευση γλώσσας προγραμματισμού

Είδαμε ότι οι προγραμματιστές που γράφουν/δημοσιεύουν ένα σύνολο χρήσιμου κώδικα (που ονομάζεται μια *βιβλιοθήκη*) μπορούν να παρέχουν μια λεγόμενη Διεπαφή Προγραμματισμού Εφαρμογών (ένα σύνολο συναρτήσεων) μέσω της οποίας άλλοι προγραμματιστές, χρησιμοποιώντας την *ίδια* γλώσσα προγραμματισμού, μπορούν να αξιοποιήσουν εκείνη τη βιβλιοθήκη (συλλογή κώδικα). Αυτό είναι εντάξει όταν και οι δύο πλευρές (ο δημιουργός της βιβλιοθήκης και οι χρήστες της) χρησιμοποιούν την *ίδια* γλώσσα προγραμματισμού, αλλά τι συμβαίνει αν προγραμματιστές που χρησιμοποιούν μια *διαφορετική* γλώσσα προγραμματισμού θέλουν επίσης να αξιοποιήσουν εκείνη τη βιβλιοθήκη; Για παράδειγμα, μπορεί να γράφετε σενάρια χρησιμοποιώντας τη γλώσσα Lua αλλά να θέλετε να χρησιμοποιήσετε μια βιβλιοθήκη γραμμένη, για παράδειγμα, σε γλώσσες προγραμματισμού όπως η C/C++. Κάπως, οι δύο διαφορετικές γλώσσες προγραμματισμού (Lua και C/C++) χρειάζονται τη δυνατότητα να «επικοινωνούν» μεταξύ τους. Μία λύση σε αυτό το πρόβλημα είναι η λεγόμενη [δέσμευση γλώσσας](https://en.wikipedia.org/wiki/Language_binding).

Η εξέταση των τεχνικών λεπτομερειών της δέσμευσης γλώσσας είναι έξω από το πεδίο αυτού του άρθρου, οπότε θα δώσουμε μια σύντομη περίληψη των γενικών αρχών. Ουσιαστικά, προσθέτοντας ένα κατάλληλο επιπλέον «στρώμα» κώδικα στην αρχική βιβλιοθήκη, αυτή μπορεί να «επικοινωνεί» με μια άλλη γλώσσα προγραμματισμού (όπως η Lua): αυτό το στρώμα κώδικα ονομάζεται *δέσμευση*. Επιτρέπει στις δύο γλώσσες να διαλειτουργούν μέσω ενός API το οποίο οι προγραμματιστές στη δεύτερη γλώσσα (όπως η Lua) μπορούν να χρησιμοποιούν για να έχουν πρόσβαση στις δυνατότητες/υπηρεσίες που παρέχει η βιβλιοθήκη.

![Σχηματικό διάγραμμα που δείχνει την έννοια της δέσμευσης γλώσσας.](/files/8ab16dc9e92001d8b055f4fe5a124b6f1f34878f)

**Σχήμα 1**Σχήμα 1: Σχηματικό διάγραμμα που δείχνει την έννοια της δέσμευσης γλώσσας: επιτρέποντας σε ένα πρόγραμμα γραμμένο σε Lua να χρησιμοποιεί μια εξωτερική βιβλιοθήκη γραμμένη σε άλλη γλώσσα προγραμματισμού. Μέσω της χρήσης δεσμεύσεων Lua είναι που τα εσωτερικά στοιχεία του LuaTeX, και έτσι μεγάλο μέρος της εσωτερικής λειτουργικότητας τυποποίησης του LuaTeX, γίνονται διαθέσιμα για να αναπτύσσουν οι χρήστες λύσεις σε σύνθετα προβλήματα τυποποίησης.

## LuaTeX: Δύο επιλογές προγραμματισμού—TeX και Lua

Ουσιαστικά, το LuaTeX είναι μια μηχανή TeX που υποστηρίζει δύο γλώσσες προγραμματισμού: την παραδοσιακή γλώσσα βασισμένη στο TeX και τη γλώσσα δέσμης ενεργειών Lua. Φυσικά, μπορείτε να χρησιμοποιήσετε και τις δύο γλώσσες μέσα στο ίδιο έγγραφο TeX ή, αν προτιμάτε, να συνεχίσετε να τυποποιείτε μέσω της διαδρομής μόνο με TeX: για παράδειγμα, μέσω του πακέτου μακροεντολών LaTeX (LuaLaTeX). Το TeX (ή LaTeX) δεν είναι εύκολη γλώσσα προγραμματισμού για χρήση ή εκμάθηση, και σχετικά λίγοι άνθρωποι έχουν πραγματικά κυριαρχήσει στις πολλές ιδιομορφίες του TeX—οι έννοιες του TeX σχετικά με [tokens](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 προσθέτει πολλές νέες primitives

Κάθε μηχανή TeX παρέχει εκατοντάδες λεγόμενες primitive εντολές: τα θεμελιώδη δομικά στοιχεία της γλώσσας βασισμένης στο TeX που υποστηρίζει κάθε μεμονωμένη μηχανή τυποποίησης. Η αρχική έκδοση του TeX που κυκλοφόρησε ο Donald Knuth παρείχε περίπου 320 εντολές, αλλά οι νεότερες μηχανές TeX (pdfTeX, XeTeX και LuaTeX) έχουν καθεμία προσθέσει πολλές νέες primitives ώστε να παρέχουν στους χρήστες πρόσβαση στις επιπλέον δυνατότητες και λειτουργικότητα κάθε μηχανής. Ο σημαντικός αριθμός νέων primitives του LuaTeX τεκμηριώνεται στο [Εγχειρίδιο Αναφοράς](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co).

Ανάμεσα στις πολλές νέες primitives που εισήγαγε το LuaTeX είναι μία που ονομάζεται `\directlua{...}` η οποία είναι η πύλη για τη χρήση κώδικα Lua: πρόσβαση στα εσωτερικά της μηχανής LuaTeX για την κατασκευή εξελιγμένων εργαλείων και λύσεων τυποποίησης.

### \directlua{...}: Η πύλη για τον προγραμματισμό Lua

Όπως συζητήθηκε, η γλώσσα δέσμης ενεργειών Lua μπορεί να θεωρηθεί ότι παρέχει ένα «στρώμα» μέσω του οποίου είναι δυνατό να αποκτήσει κανείς πρόσβαση στη μηχανή τυποποίησης του LuaTeX που βασίζεται στο TeX και στη λειτουργικότητα που παρέχεται από πολλά από τα στοιχεία από τα οποία έχει κατασκευαστεί το LuaTeX. Η γλώσσα Lua είναι επίσης ο μηχανισμός που επιτρέπει την επεκτασιμότητα του LuaTeX—μέσω της ικανότητας της Lua να φορτώνει εξειδικευμένες εξωτερικές βιβλιοθήκες λογισμικού/κώδικα.

Συλλογικά, η διεπαφή Lua (σύνολο συναρτήσεων βασισμένων στη Lua) που παρέχεται από το LuaTeX αναφέρεται ως το *Lua API*: είναι ο «σύνδεσμος επικοινωνίας» ανάμεσα στα εσωτερικά στοιχεία/την εσωτερική μηχανή του LuaTeX και το έγγραφο του χρήστη.

### Ένα απλό παράδειγμα του \directlua{...}

Τα ακόλουθα *εξαιρετικά απλό* παράδειγμα δεν αγγίζει καν την επιφάνεια της κορυφής του παγόβουνου των δυνατοτήτων. Ωστόσο, χρησιμεύει για να δείξει τη βασική ιδέα της αλληλεπίδρασης ανάμεσα στον «TeX τρόπο» και τον «Lua τρόπο» πρόσβασης στις παραμέτρους του TeX.

Σημειώστε ότι:

* `\hsize` είναι ένα TeX primitive (εντολή) που ορίζει την τιμή μιας εσωτερικής παραμέτρου η οποία καθορίζει το πλάτος των τυποποιημένων γραμμών—για παράδειγμα, συνήθως την ορίζετε σε μια κατάλληλη τιμή μέσα σε ένα `\vbox{...}`. `\hsize` είναι μόνο μία από τις *πολλές* παραμέτρους του TeX που μπορείτε να προσπελάσετε και/ή να τροποποιήσετε μέσω κώδικα Lua.
* Η πρόσβαση στις παραμέτρους του TeX είναι μόνο μία *μικροσκοπική* πτυχή του Lua API του LuaTeX: υπάρχουν τόσα πολλά περισσότερα!

```latex

\documentclass{article}
\begin{document}
\let\\\relax %επαναπροσδιορίστε τη σημασία του \\ για να αποφύγετε προβλήματα επέκτασης
Να η τρέχουσα τιμή του {\ttfamily\string\hsize} (μέσω \LaTeX):
\the\hsize\par
\directlua{
%Λάβετε την τρέχουσα τιμή του \hsize χρησιμοποιώντας το Lua API
local hs=tex.hsize
% Χρησιμοποιήστε μια συνάρτηση του Lua API για να εκτυπώσετε μερικά
% κώδικα LaTeX και την τιμή του \hsize
tex.print("Να η τιμή του {\\ttfamily\\string\\hsize}
που αναφέρθηκε από κώδικα Lua (σε scaled points): ")
tex.print(hs.."\\par")
% Ορίστε μια νέα τιμή για το \hsize χρησιμοποιώντας το Lua API
tex.hsize="400pt" % ή χρησιμοποιήστε tex.hsize=400*65536 (σε scaled points)
}%
% Αφού ολοκληρωθεί το \directlua, ζητήστε από το LaTeX
% να μας πει τη νέα τιμή του \hsize
Να η τιμή του {\ttfamily\string\hsize} που αναφέρθηκε
από το \LaTeX{} αφού ολοκληρωθεί το {\tt\string\directlua}:
\the\hsize\par
\end{document}
```

Να μια εικόνα που δείχνει το αποτέλεσμα της τυποποίησης του LaTeX κώδικα παραπάνω από το LuaTeX:

![Αποτελέσματα εκτέλεσης του LuaTeX](/files/d044c6d75f29ed0ef2afd1675c7d2a7e64e0997e)

Σημειώστε ότι το TeX «κόλπο» του `\let\\\relax` χρησιμοποιείται για να αποφευχθούν προβλήματα που προκαλεί η «επέκταση» του κώδικα Lua από το LuaTeX: ένα θέμα που σημειώνουμε σύντομα παρακάτω.

### Χρήση κώδικα Lua

Υπάρχουν δύο κύριες επιλογές για τη χρήση κώδικα Lua στα έγγραφα TeX/LaTeX σας:

1. **Ενσωματωμένα**: Γράφοντας κώδικα Lua απευθείας μέσα στο `.tex` έγγραφό σας (όπως στο παράδειγμα παραπάνω);
2. **Εξωτερικά**: Αποθηκεύοντας κώδικα Lua σε εξωτερικά `.lua` αρχεία κώδικα και χρησιμοποιώντας τις δυνατότητες της Lua για τη φόρτωσή τους και την εκτέλεσή τους.

Η επιλογή (1) ταιριάζει καλύτερα σε μικρότερα αποσπάσματα κώδικα Lua. Η επιλογή (2) χρησιμοποιείται για μεγαλύτερα προγράμματα ή βιβλιοθήκες κώδικα Lua. Έχει ένα σαφές πλεονέκτημα ότι μπορείτε να αποφύγετε δύσκολα ζητήματα που αφορούν τα λεγόμενα `\catcode` τιμές (κάτι που μπορεί να είναι «αρκετά απογοητευτικό»). Ο λόγος αυτών των `\catcode` ζητημάτων είναι η «επέκταση» του κώδικα Lua πριν τροφοδοτηθεί στον ενσωματωμένο διερμηνευτή Lua του LuaTeX. Αυτή η επέκταση μπορεί να είναι δύσκολη στην κατανόηση, οπότε θα την εξερευνήσουμε περαιτέρω σε επόμενο άρθρο.

Φυσικά υπάρχουν πακέτα LaTeX για να βοηθούν στη χρήση κώδικα Lua στα αρχεία .tex σας—για παράδειγμα, μπορείτε να χρησιμοποιήσετε το [πακέτο luacode](https://ctan.org/pkg/luacode?lang=en).

## Σύνοψη και εισαγωγή στο Μέρος 2 αυτού του άρθρου

Τα στοιχεία λογισμικού από τα οποία έχει κατασκευαστεί το LuaTeX, μαζί με την ενσωματωμένη γλώσσα σεναρίων Lua, προσφέρουν έναν ισχυρό συνδυασμό για τη δημιουργία λύσεων ικανών να επιλύουν ένα ευρύ φάσμα πολύπλοκων προβλημάτων στοιχειοθεσίας — και για τη μηχανική ροών εργασίας παραγωγής εγγράφων που μπορούν να επωφεληθούν από τη στενή ενσωμάτωση με μια μηχανή στοιχειοθεσίας βασισμένη στο TeX. Στο [Μέρος 2 αυτού του άρθρου](/latex/el/se-vathos-arthra/09-an-introduction-to-luatex-part-2-understanding-directlua.md) ρίχνουμε μια διεξοδική ματιά στην πιο ισχυρή εντολή που παρέχει το LuaTeX: `\directlua`.

Μέχρι τότε, καλή ενασχόληση με το LuaTeX!

## Ευχαριστίες

Ο συγγραφέας είναι εξαιρετικά ευγνώμων προς [Luigi Scarso](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/el/se-vathos-arthra/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.
