> 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/perissotera-themata/18-how-overleaf-created-the-tex-primitive-reference-data.md).

# Πώς το Overleaf δημιούργησε τα δεδομένα αναφοράς των πρωτόγονων του TeX

Αυτό το άρθρο περιγράφει τις μεθόδους και τις τεχνικές που χρησιμοποιήθηκαν για την παραγωγή των δύο πινάκων διασταυρούμενων αναφορών των πρωτότυπων εντολών του TeX:

* [Οι πρωτότυπες εντολές του TeX καταγεγραμμένες ανά μηχανή TeX](/latex/el/perissotera-themata/46-tex-primitives-listed-by-tex-engine.md) και;
* [Οι πρωτότυπες εντολές του TeX καταγεγραμμένες ανά μηχανή CJK TeX](/latex/el/perissotera-themata/45-tex-primitives-listed-by-cjk-tex-engine.md).

Αυτές οι πληροφορίες παρέχονται για αναγνώστες που ενδιαφέρονται για τις λεπτομέρειες, αλλά δεν αποτελούν προϋπόθεση για τη χρήση του ίδιου του πίνακα διασταυρούμενων αναφορών. Για να καλύψουμε τις ανάγκες διαφορετικών αναγνωστών, παρέχουμε μια πολύ σύντομη συνοπτική εκδοχή μαζί με μια εκτενέστερη εξήγηση για όσους επιθυμούν να εξερευνήσουν τα ζητήματα σε μεγαλύτερο βάθος.

## Σύντομη συνοπτική/επισκόπηση εκδοχή

Για να δημιουργήσει τον πίνακα διασταυρούμενων αναφορών, το Overleaf επεξεργάστηκε τον πηγαίο κώδικα 9 μηχανών TeX ώστε να εξαγάγει τη λίστα των πρωτότυπων εντολών που υποστηρίζει καθεμία: η διαδικασία αυτή παρήγαγε 9 αρχεία κειμένου (1 αρχείο ανά μηχανή TeX). Αυτά τα 9 σύνολα πρωτότυπων εντολών συνδυάστηκαν για να δημιουργηθεί μια «κύρια λίστα», η οποία στην ουσία ήταν η ένωση των επιμέρους συνόλων πρωτότυπων εντολών: με αποτέλεσμα συνολικά περίπου 1000 μοναδικές πρωτότυπες εντολές κατανεμημένες στις διάφορες μηχανές. Για κάθε μηχανή, η δική της λίστα πρωτότυπων εντολών αντιπαραβλήθηκε με το κύριο αρχείο (το σύνολο όλων των εντολών) για να προσδιοριστεί ποιες από αυτές τις \~1000 εντολές υποστήριζε: οι συγκρίσεις αυτές παρουσιάζονται στους ακόλουθους δύο πίνακες:

* [Δεδομένα διασταυρούμενων αναφορών πρωτότυπων εντολών TeX](/latex/el/perissotera-themata/46-tex-primitives-listed-by-tex-engine.md)
* [Δεδομένα διασταυρούμενων αναφορών πρωτότυπων εντολών TeX (για μηχανές CJK)](/latex/el/perissotera-themata/45-tex-primitives-listed-by-cjk-tex-engine.md)

## «Κατασκευή λογισμικού» 101: Τι σημαίνει αυτό;

Σε όλο το υπόλοιπο αυτού του άρθρου αναφερόμαστε στην έννοια της «κατασκευής μηχανών TeX», η οποία μπορεί να είναι άγνωστη αν δεν είστε προγραμματιστής ή δεν προγραμματίζετε σε μεταγλωττιζόμενες γλώσσες όπως η C ή η C++. Για τους σκοπούς μας, η κατασκευή λογισμικού—δηλαδή, των μηχανών TeX—είναι η διαδικασία δημιουργίας ενός εκτελέσιμου προγράμματος TeX από τα συστατικά του μέρη—τα αρχεία πηγαίου κώδικα γραμμένα στη γλώσσα προγραμματισμού που χρησιμοποιείται για την ανάπτυξη του προγράμματος.

## Πλήρης εκδοχή: Θέλετε τις λεπτομέρειες; Συνεχίστε να διαβάζετε...

Κάθε μηχανή στοιχειοθεσίας βασισμένη στο TeX υποστηρίζει μια «διάλεκτο» της γλώσσας TeX: ένα συγκεκριμένο σύνολο πρωτότυπων εντολών που ελέγχουν τις δυνατότητες στοιχειοθεσίας κάθε μηχανής και παρέχουν τα δομικά στοιχεία για τη δημιουργία/ορισμό μακροεντολών: ακολουθιών εντολών καθορισμένων από τον χρήστη. Κάθε μακροεντολή, είτε είναι γραμμένη για LaTeX, plain TeX ή οποιοδήποτε άλλο πακέτο μακροεντολών, τελικά κατασκευάζεται από πρωτότυπες εντολές—αν και ίσως χρειαστεί να κατέβετε αρκετά βαθιά, μέσα από στρώματα πρόσθετων μακροεντολών, πριν φτάσετε στο «βραχώδες υπόστρωμα» των πρωτότυπων εντολών του TeX. Το σύνολο των 9 μηχανών TeX που αναλύθηκαν για την παραγωγή των δεδομένων αναφοράς των πρωτότυπων εντολών φυσικά έχει πολλές εντολές κοινές, αλλά κάθε μηχανή TeX έχει επίσης τις δικές της πρωτότυπες εντολές, που προστέθηκαν από τους δημιουργούς της, για να υποστηρίζουν τα χαρακτηριστικά ειδικά για εκείνη την «έκδοση» του TeX.

Οι πρωτότυπες εντολές μιας μηχανής TeX είναι ενσωματωμένες στο εκτελέσιμο λογισμικό TeX: οι πρωτότυπες εντολές δεν είναι μακροεντολές που κατασκευάζονται από τους χρήστες, είναι θεμελιώδεις, αδιαίρετες/ατομικές εντολές που χρησιμοποιούνται για να ελέγχουν τη συμπεριφορά στοιχειοθεσίας κάθε μηχανής. Κατά συνέπεια, ο πιο αξιόπιστος τρόπος για να δημιουργηθεί ένας οριστικός κατάλογος των πρωτότυπων εντολών που υποστηρίζει οποιαδήποτε μηχανή TeX είναι να εξεταστεί ο πραγματικός πηγαίος κώδικας από τον οποίο κατασκευάζονται (μεταγλωττίζονται) τα εκτελέσιμα προγράμματα TeX και να εξαχθεί η λίστα των πρωτότυπων εντολών που ορίζονται στον πηγαίο κώδικα. Ακούγεται ότι θα έπρεπε να είναι εύκολο, σωστά; Ωστόσο, λόγω της 40ετούς ιστορίας ανάπτυξης του TeX, η εξερεύνηση/εξέταση των αρχείων πηγαίου κώδικα των μηχανών TeX (εκτός από το LuaTeX) δεν είναι ιδιαίτερα απλή. Ο λόγος για αυτές τις πολυπλοκότητες βρίσκεται στα εργαλεία, στη γλώσσα προγραμματισμού (Pascal) και στη μεθοδολογία (literate programming) που χρησιμοποίησε ο Knuth για να γράψει τον αρχικό πηγαίο κώδικα του TeX—από τον οποίο, τελικά, κατάγονται όλες οι άλλες μηχανές.

Σημειώνουμε μια εξαίρεση για το LuaTeX επειδή ο πυρήνας της μηχανής του ξαναγράφηκε σε C για να αφαιρεθεί η χρήση της Pascal και άλλων παλαιότερων πολυπλοκοτήτων που περιγράφονται παρακάτω (Web2C). κατά συνέπεια, παρόλο που ο πηγαίος κώδικας του LuaTeX είναι εκτενής, ο τρόπος με τον οποίο είναι «πακεταρισμένος» και διανέμεται είναι πολύ πιο κατανοητός σε σύγκριση με άλλες μηχανές TeX. Ως αποτέλεσμα, και με βάση τη ροή εργασίας/τις διαδικασίες που χρησιμοποιούνται για την κατασκευή τους από τον πηγαίο κώδικα, είναι βολικό να ομαδοποιούνται οι μηχανές TeX σε δύο κατηγορίες:

1. LuaTeX: προσαρμοσμένη (πιο σύγχρονη) διαδικασία κατασκευής
2. Όλες οι άλλες μηχανές: παλαιά (Web2C) διαδικασία κατασκευής

## Το πλαίσιο του παλαιού κώδικα: Γιατί η κατασκευή (των περισσότερων) μηχανών TeX είναι πολύπλοκη

Όπως θα εξερευνήσουμε παρακάτω, ο Knuth κυκλοφόρησε τον αρχικό πηγαίο κώδικα του TeX ως ένα ενιαίο, μονολιθικό αρχείο με όνομα `tex.web` το οποίο, κάθε 7 χρόνια, ο Knuth συνεχίζει να ενημερώνει για να διορθώνει τυχόν εναπομείναντα σφάλματα—δεν προστίθενται ποτέ νέα χαρακτηριστικά, πρόκειται αποκλειστικά για άσκηση διόρθωσης σφαλμάτων.

Η επέκταση αρχείου του πηγαίου κώδικα του TeX (`.web`) είναι απίθανο να σας είναι οικεία και ίσως αναρωτιέστε ποια γλώσσα χρησιμοποίησε ο Knuth για να γράψει το TeX; Η απάντηση είναι Pascal, αλλά η `.web` επέκταση χρειάζεται λίγη περισσότερη εξήγηση. Ο Knuth ανέπτυξε μια μεθοδολογία προγραμματισμού την οποία ονόμασε [literate programming](https://en.wikipedia.org/wiki/Literate_programming) στην οποία ο πηγαίος κώδικας και η τεκμηρίωση ενός προγράμματος συνδυάζονται και κυκλοφορούν ως ένα ενιαίο σύνθετο αρχείο (κώδικας plus τεκμηρίωση) με επέκταση `.web`: αυτός ο τύπος αρχείου αναφέρεται ως αρχείο WEB. Εξηγούμε τα αρχεία WEB λίγο πιο αναλυτικά παρακάτω.

### Δημιουργία νέων μηχανών TeX: οι όροι του Knuth

Παρόλο που ο Knuth έχει από καιρό διαθέσει ελεύθερα σε όλους τον πηγαίο κώδικα του TeX (`tex.web`) , θέσπισε, όπως είναι απόλυτο δικαίωμά του, έναν βασικό όρο: ο (`tex.web`) πηγαίος κώδικας δεν πρέπει να υποστεί άμεση επεξεργασία/τροποποίηση και να αναδιανεμηθεί με το όνομα προγράμματος «TeX». Στον πηγαίο κώδικα γράφει:

```
% Αυτό το πρόγραμμα προστατεύεται από πνευματικά δικαιώματα (C) 1982 από τον D. E. Knuth· όλα τα δικαιώματα διατηρούνται.
% Η αντιγραφή αυτού του αρχείου επιτρέπεται μόνο αν (1) είστε ο D. E. Knuth ή αν
% (2) δεν κάνετε απολύτως καμία αλλαγή στο αντίγραφό σας. (Το σύστημα WEB παρέχει
% για τροποποιήσεις μέσω βοηθητικού αρχείου· το κύριο αρχείο πρέπει να παραμένει άθικτο.)
```

και επίσης:

```
Αν αυτό το πρόγραμμα αλλάξει, το προκύπτον σύστημα δεν πρέπει να ονομάζεται
`\TeX'; το επίσημο όνομα `\TeX' από μόνο του είναι δεσμευμένο
για συστήματα λογισμικού που είναι πλήρως συμβατά μεταξύ τους.
Μια ειδική σουίτα δοκιμών που ονομάζεται ``\.{TRIP} test'' είναι διαθέσιμη για
να βοηθήσει στον προσδιορισμό του αν μια συγκεκριμένη υλοποίηση αξίζει να ονομάζεται
γνωστή ως `\TeX' [βλ.~Stanford Computer Science report CS1027,
Νοέμβριος 1984].
```

Ουσιαστικά: μην κάνετε αλλαγές επεξεργάζοντας και διανέμοντας τροποποιημένες εκδόσεις του κύριου πηγαίου κώδικα TeX και συνεχίσετε να το αποκαλείτε `tex.web`. Αν θέλετε να κάνετε αλλαγές, π.χ. να προσθέσετε νέες πρωτότυπες εντολές κ.λπ., τότε πρέπει να εφαρμόσετε αυτές τις αλλαγές κάνοντας «τροποποιήσεις μέσω βοηθητικού αρχείου» και να δώσετε στο πρόγραμμά σας, το «παράγωγο του TeX», ένα όνομα που να το διακρίνει από το «TeX», το οποίο, σε στοιχειοθετημένη μορφή ($$\mathrm\TeX$$), είναι εμπορικό σήμα της American Mathematical Society.

### Η κληρονομιά του παλαιού

Παρόλο που έχουν υπάρξει προσπάθειες να ξαναγραφτεί πλήρως το TeX με σύγχρονες γλώσσες προγραμματισμού και μεθοδολογίες—όπως οι δύο πρωτοβουλίες βασισμένες σε Java [New Typesetting System](https://en.wikipedia.org/wiki/New_Typesetting_System) και [εχTEX](http://www.extex.org/) και άλλες όπως [μία σε Clojure](https://www.infoq.com/news/2015/01/implementing-tex-in-clojure), καμία δεν έχει στεφθεί πλήρως με επιτυχία. Η ιστορία των έργων και των πρωτοβουλιών που σχεδιάστηκαν για την περαιτέρω ανάπτυξη του TeX είναι ένα ενδιαφέρον θέμα και οι αναγνώστες ίσως θελήσουν να [επισκεφθούν το UK TeX FAQ](https://texfaq.org/FAQ-enginedev) για περισσότερες πληροφορίες.

Αυτές οι μη-LuaTeX πρωτοβουλίες που επίσης ήταν επιτυχείς, όπως τα e-TeX, pdfTeX, XeTeX και άλλες μηχανές, έχουν βασιστεί *απευθείας πάνω* στον αρχικό κώδικα του Knuth: παίρνοντας τον πηγαίο κώδικά του και «εφαρμόζοντας αλλαγές» για να παραγάγουν μια νέα μηχανή με πρόσθετες δυνατότητες—όπως η προσθήκη νέων πρωτότυπων εντολών, η παραγωγή εξόδου PDF, η υποστήριξη εισόδου κειμένου UTF-8 και ούτω καθεξής. Παρόλο που αυτή η διαδρομή οδήγησε σε αξιοσημείωτες επιτυχίες, σημαίνει επίσης ότι αυτές οι παράγωγες μηχανές κληρονομούν τον παλαιό κώδικα και τις τεχνικές ανάπτυξης που δημιούργησε ο Knuth πριν από 40 χρόνια.

Το βασικό συμπέρασμα εδώ είναι ότι, εκτός από το LuaTeX, οι περισσότερες μηχανές TeX που προέρχονται από τον αρχικό πηγαίο κώδικα του Knuth δημιουργούνται παίρνοντας ένα ενιαίο μονολιθικό αρχείο (συνήθως `tex.web`) και εφαρμόζοντας αλλαγές που παράγουν ένα ακόμη ενιαίο μονολιθικό αρχείο το οποίο περιέχει τον πηγαίο κώδικα πυρήνα της νέας μηχανής. Οι προχωρημένοι αναγνώστες ίσως θελήσουν να προχωρήσουν στα διευκρινιστικά [σημειώματα για τα pdfTeX και XeTeX](#aside-xetex-and-pdftex).

### Μερικό πρόσθετο ιστορικό/υπόβαθρο του TeX

Η στιγμή γένεσης του TeX ήταν [καταγεγραμμένη στο ημερολόγιο του Knuth ως 30 Μαρτίου 1977](/latex/el/se-vathos-arthra/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md#the-genesis-of-tex-a-brief-history), πριν από περισσότερα από 40 χρόνια πλέον. Εσωτερικά, το TeX είναι ένα εξαιρετικά πολύπλοκο πρόγραμμα του οποίου ο πηγαίος κώδικας ο Knuth κατέβαλε μεγάλη προσπάθεια να [τον τεκμηριώσει με εξαιρετική λεπτομέρεια](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373). Για να το κάνει αυτό ο Knuth ανέπτυξε ένα στυλ προγραμματισμού που ονόμασε [literate programming](https://en.wikipedia.org/wiki/Literate_programming) στο οποίο ο πηγαίος κώδικας και η τεκμηρίωση ενός προγράμματος συνδυάζονται και κυκλοφορούν ως σύνθετο αρχείο με επέκταση `.web` (αναφερόμενο ως αρχείο WEB). Ο Knuth επέλεξε την Pascal ως γλώσσα προγραμματισμού για τη συγγραφή του λογισμικού TeX του και, όχι απροσδόκητα, χρησιμοποίησε τη γλώσσα στοιχειοθεσίας TeX για να γράψει την τελική τεκμηρίωση. Κατά συνέπεια, ο κύριος πηγαίος κώδικας του TeX του Knuth δημοσιεύεται ως ένα ενιαίο, μονολιθικό αρχείο με όνομα `tex.web`: ένα μείγμα πηγαίου κώδικα Pascal και κώδικα στοιχειοθεσίας TeX για την τεκμηρίωση.

Αν ένα πρόγραμμα έχει γραφτεί χρησιμοποιώντας το στυλ/τη μεθοδολογία literate programming του Knuth (όπως τα TeX, MetaFont, BibTeX και άλλα), πρέπει να προεπεξεργαστείτε το αρχείο WEB για να εξαγάγετε την τεκμηρίωση ή τον πηγαίο κώδικα. Για να αποκτήσετε πρόσβαση στην τεκμηρίωση του προγράμματος επεξεργάζεστε το αρχείο WEB (π.χ., `tex.web`) με ένα βοηθητικό πρόγραμμα που ονομάζεται [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) το οποίο παράγει την τεκμηρίωση ως `.tex` αρχείο που μπορείτε να στοιχειοθετήσετε. Για να εξαγάγετε τον πηγαίο κώδικα σε Pascal χρησιμοποιείτε ένα άλλο βοηθητικό πρόγραμμα που ονομάζεται [TANGLE](http://tug.org/texinfohtml/web2c.html#tangle-invocation) το οποίο εξάγει ένα αρχείο με επέκταση `.p` που περιέχει πηγαίο κώδικα Pascal.

Τη στιγμή της συγγραφής (αρχές 2019) η τελευταία έκδοση του TeX του Knuth είναι η 3.14159265, με ημερομηνία Ιανουάριος 2014. Και πάλι, σημειώστε ότι ο πηγαίος κώδικας του TeX του Knuth περιέχεται σε ένα μόνο αρχείο που έχει περίπου 25.000 γραμμές κώδικα TeX/Pascal!

### Από την Pascal στην C

Στα 40+ χρόνια που έχουν περάσει από τη γένεση του TeX, η Pascal έπαψε να είναι της μόδας και σήμερα λίγοι, αν υπάρχουν;, σκέφτονται πλέον να κατασκευάσουν το TeX από τον αρχικό πηγαίο κώδικα Pascal. Για να παρακαμφθεί η χρήση της Pascal από τον Knuth, σχεδιάστηκε μια ροή εργασίας που ονομάζεται [Web2C](http://tug.org/texinfohtml/web2c.html) (περίπου το 1987), στην οποία ο πηγαίος κώδικας Pascal του TeX μετατρέπεται μηχανικά (δηλαδή, μέσω λογισμικού) στο ισοδύναμό του σε κώδικα C, ο οποίος στη συνέχεια χρησιμοποιείται για να μεταγλωττίσει το TeX και να κατασκευάσει το εκτελέσιμο πρόγραμμα. Λειτουργεί καλά, αλλά το μόνο μειονέκτημα είναι ότι ο μηχανικά παραγόμενος πηγαίος κώδικας C δεν προορίζεται για πρόχειρη ανθρώπινη εξέταση: είναι *εξαιρετικά* φλύαρος και σχεδόν αδιαπέραστος, καθώς προορίζεται για μεταγλωττιστές και όχι για ανθρώπους—ιδού ένα στιγμιότυπο οθόνης που δείχνει ένα μικρό απόσπασμα του κώδικα C που παράγεται από τον πηγαίο κώδικα Pascal του TeX:

![](/files/2e809e67334138c153dbb305eeb994babf38bead)

### Ένα ακόμη Knuth-ισμός: αρχεία αλλαγών WEB

Όπως σημειώθηκε παραπάνω, για να βασιστείτε στον αρχικό πηγαίο κώδικα του Knuth πρέπει να «εφαρμόσετε αλλαγές» ή, με τα λόγια του Knuth, να κάνετε «τροποποιήσεις μέσω βοηθητικού αρχείου»: αλλά τι σημαίνει αυτό στην πράξη; Εδώ μπαίνει ο *μηχανισμός αρχείου αλλαγών*.

### Αρχεία αλλαγών: ο μηχανισμός για τη δημιουργία νέων μηχανών TeX

Οι προγραμματιστές που θέλουν να επεκτείνουν το TeX του Knuth κατά κάποιον τρόπο, δηλαδή να βασιστούν στο αρχικό έργο του Knuth, συνήθως επιθυμούν να δημιουργήσουν μια εντελώς νέα «έκδοση» του TeX ή να παρέχουν μια *επέκταση* που μπορεί να προστεθεί σε οποιαδήποτε μηχανή TeX. Παραδείγματα επεκτάσεων περιλαμβάνουν [SyncTeX](https://github.com/jlaurens/synctex) και [EncTeX](https://ctan.org/pkg/enctex?lang=en)—το SyncTeX, για παράδειγμα, είναι μια πολύ χρήσιμη επέκταση που πλέον περιλαμβάνεται σε όλες τις μηχανές TeX. Η ανάγκη για το EncTeX έχει σε μεγάλο βαθμό αντικατασταθεί από την εξέλιξη των μηχανών TeX που είναι ενήμερες για Unicode—αλλά σημειώστε ότι το EncTeX είναι ενσωματωμένο στο pdfTeX.

Είτε η επιθυμία είναι να παραχθεί μια νέα «έκδοση» του TeX (δηλαδή, ένα παράγωγο του αρχικού TeX του Knuth), είτε να δημιουργηθεί μια επέκταση, οι δημιουργοί του ξεκινούν από τον αρχικό πηγαίο κώδικα του Knuth και εφαρμόζουν τις τροποποιήσεις που απαιτούνται για να δημιουργήσουν μια νέα μηχανή TeX (ή μια πρόσθετη επέκταση). Ωστόσο, όπως σημειώθηκε παραπάνω, όποιος θέλει να τροποποιήσει τη συμπεριφορά του TeX πρέπει να το κάνει χρησιμοποιώντας «τροποποιήσεις μέσω βοηθητικού αρχείου» επειδή αυτές οι αλλαγές/τροποποιήσεις δεν πρέπει να εφαρμόζονται με *άμεσα* επεξεργασία του αρχικού πηγαίου κώδικα του Knuth: οι προγραμματιστές υποχρεούνται να χρησιμοποιούν το λεγόμενο WEB *μηχανισμός αρχείου αλλαγών*. Ο κώδικας για την τροποποίηση του TeX του Knuth γράφεται στη «γλώσσα» WEB και αποθηκεύεται σε ένα ή περισσότερα αρχεία κώδικα (που ονομάζονται *αρχεία αλλαγών*) τα οποία στη συνέχεια *συγχωνεύονται* με τον αρχικό, αμετάβλητο, κύριο πηγαίο κώδικα του Knuth. Αυτή η διαδικασία συγχώνευσης δημιουργεί ένα νέο σύνθετο αρχείο WEB που τώρα περιέχει τον *πυρήνα* πηγαίο κώδικα του νέου/τροποποιημένου λογισμικού βασισμένου στο TeX. *Τα αρχεία αλλαγών* συχνά έχουν επέκταση `.ch` αλλά στην πράξη, μπορούν να έχουν οποιαδήποτε επέκταση επιθυμούν οι προγραμματιστές.

#### Πώς χρησιμοποιείτε/εφαρμόζετε τα αρχεία αλλαγών;

Σήμερα, ο ευκολότερος τρόπος για να εφαρμόσετε αρχεία αλλαγών και να τροποποιήσετε ένα «κύριο» αρχείο WEB είναι με ένα βοηθητικό πρόγραμμα που ονομάζεται [TIE](https://ctan.org/pkg/tie). Για παράδειγμα, ας υποθέσουμε ότι θέλατε να τροποποιήσετε το TeX του Knuth προσθέτοντας, ας πούμε, μερικές νέες πρωτότυπες εντολές ή θέλατε να αλλάξετε τη συμπεριφορά μιας υπάρχουσας (τυπικής) πρωτότυπης εντολής του TeX. Θα γράφατε τον κώδικά σας (σε Pascal!) χρησιμοποιώντας το σύστημα literate programming του WEB και θα τον αποθηκεύατε σε ένα αρχείο με όνομα, ας πούμε, `myprim.ch`. Το επόμενο βήμα είναι να συγχωνεύσετε τον κώδικά σας (σε `myprim.ch`) με το κύριο αρχείο πηγαίου κώδικα του Knuth `tex.web` και να παράγετε ένα νέο, σύνθετο, αρχείο WEB που να αντιπροσωπεύει αυτό που θα ονομάσουμε `mytex.web`. Για να το κάνετε αυτό απλώς εκτελείτε το πρόγραμμα TIE ως εξής:

```
tie -m mytex.web tex.web myprim.ch
```

Υποθέτοντας ότι η συγχώνευση είναι επιτυχής, αυτό θα οδηγήσει σε ένα νέο αρχείο WEB, `mytex.web`mytex.web `tex.web` , αφήνοντας το κύριο αρχείο πηγαίου κώδικα του Knuth

εντελώς αμετάβλητο, όπως απαιτείται. Ας υποθέσουμε τώρα ότι κάποιος άλλος αρέσκεται στις αλλαγές που κάνατε και θέλει να τροποποιήσει το έργο σας για να προσθέσει τις δικές του αλλαγές πάνω σε, ή επιπλέον, από όσα κάνατε εσείς. Αντί να διανέμετε την τροποποιημένη έκδοσή σας του TeX (`mytex.web`) αποφασίζετε να δημοσιεύσετε/μοιραστείτε μόνο το αρχείο αλλαγών, `myprim.ch`. Όποιος θέλει να βασιστεί στο έργο σας μπορεί τώρα να δημιουργήσει και να μοιραστεί το δικό του αρχείο αλλαγών με όνομα, ας πούμε, `moreprim.ch` το οποίο επεκτείνει τον κώδικά σας κατά κάποιον τρόπο. Οποιοσδήποτε άλλος θέλει να αξιοποιήσει και τα δύο αρχεία αλλαγών μπορεί τώρα να δημιουργήσει ένα νέο σύνθετο αρχείο WEB συγχωνεύοντας *και τα δύο* αρχεία αλλαγών στο αρχικό του Knuth για να παραγάγει ένα ακόμη πρόγραμμα TeX με όνομα, ας πούμε, `newmytex.web`:

```
tie -m newmytex.web tex.web myprim.ch moreprim.ch
```

### Πραγματικά συστήματα TeX: πολλαπλά αρχεία αλλαγών

Η παραπάνω περιγραφή του TIE είναι στην πραγματικότητα πολύ κοντά στον τρόπο με τον οποίο κατασκευάζονται στην πράξη πολλές μηχανές TeX: ξεκινούν με το `tex.web` του Knuth και προσθέτουν μια διαδοχή αρχείων αλλαγών για να παραγάγουν το αρχείο πηγής WEB για εκείνη τη μηχανή. Κάθε μηχανή TeX απαιτεί το δικό της συγκεκριμένο σύνολο αρχείων αλλαγών, τα οποία πρέπει να εφαρμοστούν/επεξεργαστούν (συγχωνευθούν) με αυστηρή σειρά: αν μπερδέψετε τη σειρά, η διαδικασία συγχώνευσης θα αποτύχει επειδή κάθε αρχείο αλλαγών σε μια ακολουθία βασίζεται στις αλλαγές που εισήγαγαν τα αρχεία αλλαγών που εμφανίζονται νωρίτερα στην αλυσίδα.

Ακολουθεί μια ενδεικτική εκτέλεση του TIE που εφαρμόζει πολλαπλά αρχεία αλλαγών στο `tex.web` του Knuth προκειμένου να παραχθεί το `ktex.web`—το σύνθετο αρχείο WEB με τροποποιήσεις στο TeX του Knuth που το καθιστούν έτοιμο (κατάλληλο) για μετατροπή σε C μέσω της διαδικασίας Web2C. Σημειώστε επίσης τα εξής:

* `tex.ch` είναι ένα πολύ μεγάλο αρχείο αλλαγών το οποίο, μεταξύ πολλών άλλων, τροποποιεί το TeX ώστε να χρησιμοποιεί το Kpathsea·
* η επέκταση SyncTeX προστίθεται μέσω πολλαπλών αρχείων αλλαγών.

```
tie -m ktex.web tex.web tex.ch enctex.ch synctex-def.ch0 synctex-mem.ch0 synctex-mem.ch2 synctex-rec.ch0 synctex-rec.ch1 synctex-rec.ch2 tex-binpool.ch
Αυτό είναι το TIE, CWEB Έκδοση 2.4.
Πνευματικά δικαιώματα (c) 1989,1992 από THD/ITI. Με την επιφύλαξη παντός δικαιώματος.
(tex.web)
(tex.ch)
(enctex.ch)
(synctex-def.ch0)
(synctex-mem.ch0)
(synctex-mem.ch2)
(synctex-rec.ch0)
(synctex-rec.ch1)
(synctex-rec.ch2)
(tex-binpool.ch)
....500....1000....1500....2000....2500....3000....3500....4000....4500
....5000....5500....6000....6500....7000....7500....8000....8500....9000
....9500....10000....10500....11000....11500....12000....12500....13000
....13500....14000....14500....15000....15500....16000....16500....17000
....17500....18000....18500....19000....19500....20000....20500....21000
....21500....22000....22500....23000....23500....24000....24500....
(Δεν βρέθηκαν σφάλματα.)
```

#### Παρένθεση: XeTeX και pdfTeX

Για λόγους πληρότητας, πρέπει να σημειώσουμε ότι η διαδικασία κατασκευής για τα pdfTeX και XeTeX στην πραγματικότητα δεν ξεκινά με το `tex.web`του Knuth· αντίθετα ξεκινούν με αρχεία που ονομάζονται `pdftex.web` και `xetex.web` αντίστοιχα: πιθανότατα επειδή οι αλλαγές είναι τόσο εκτεταμένες που έχει περισσότερο νόημα να μοιράζονται/δημοσιεύονται αρχεία WEB που ήδη περιέχουν τις πολύ σημαντικές τροποποιήσεις που έγιναν στον αρχικό κώδικα του Knuth.

### Ένα παράδειγμα: e-upTeX

Η ιαπωνική κοινότητα TeX έχει αναπτύξει έναν αριθμό μηχανών TeX σχεδιασμένων να καλύπτουν τις πολυπλοκότητες της στοιχειοθεσίας ιαπωνικού κειμένου:

* **pTeX**: Η μηχανή TeX του Knuth επεκταμένη για να υποστηρίζει ιαπωνική στοιχειοθεσία·
* **e-pTeX**: Ένας συνδυασμός του e-TeX και του pTeX (συν μερικές πρωτότυπες εντολές που εισήγαγε το pdfTeX)·
* **upTeX**: Μια έκδοση του pTeX με επίγνωση Unicode, συν επεκτάσεις για καλύτερο χειρισμό των CJK (Κινεζικών, Ιαπωνικών και Κορεατικών)·
* **e-upTeX**: Ένας συνδυασμός (συγχώνευση) του e-TeX και του upTeX.

#### Δημιουργία του σύνθετου αρχείου πηγής για e-upTeX

Για να δημιουργήσετε το σύνθετο αρχείο πηγής WEB για e-upTeX (με SyncTeX) ξεκινάτε με το `tex.web` του Knuth αλλά χρειάζεται να εφαρμόσετε **26** επιμέρους αρχεία αλλαγών, με την ακόλουθη σειρά, ώστε να παραχθεί ένα ενιαίο σύνθετο αρχείο από το οποίο μπορεί να εξαχθεί η λίστα των πρωτότυπων εντολών:

```
etex.ch, tex.ch0, tex.ch, tex.ech, etex.ch0,
ptex-base.ch, uptex-m.ch, euptex.ch0, eptex.ech,
etex.ch1, euptex.ch1, synctex-def.ch0, synctex-ep-mem.ch0,
synctex-mem.ch0, synctex-e-mem.ch0, synctex-ep-mem.ch1,
synctex-p-rec.ch0, synctex-rec.ch0, synctex-rec.ch1,
synctex-e-rec.ch0, synctex-p-rec.ch1, fam256.ch,
pdfstrcmp-eup-pre.ch, pdfutils.ch, pdfstrcmp-eup-post.ch,
tex-binpool.ch
```

#### Εφαρμογή αρχείων αλλαγών: ποια αρχεία και με ποια σειρά;

Όπως σημειώθηκε, είναι κρίσιμα σημαντικό να εφαρμόζονται/επεξεργάζονται τα αρχεία αλλαγών με αυστηρή σειρά—αλλά πώς μαθαίνετε ποια αρχεία απαιτούνται και με ποια σειρά πρέπει να επεξεργαστούν; Ευτυχώς, αυτές οι κρίσιμες πληροφορίες καταγράφονται μέσα σε αρχεία που περιέχονται στη διανομή TeX Live και μια εξερεύνηση του πηγαίου κώδικα του TeX Live αποκάλυψε τους κανόνες που διέπουν τις απαιτήσεις κατασκευής για κάθε μηχανή TeX. Ακολουθώντας αυτούς τους κανόνες, το Overleaf μπόρεσε να ανακατασκευάσει το σύνθετο αρχείο πηγαίου κώδικα WEB για κάθε μηχανή TeX και να εξαγάγει μια λίστα πρωτότυπων εντολών για περαιτέρω επεξεργασία δεδομένων.

## Και τέλος: Πώς εξάγεται η λίστα των πρωτότυπων εντολών;

Μόλις κατασκευαστεί το σύνθετο αρχείο WEB, το έργο της εξαγωγής της λίστας των πρωτότυπων εντολών, χρησιμοποιώντας κανονικές εκφράσεις, είναι απλό επειδή όλες οι πρωτότυπες εντολές ορίζονται («καταχωρίζονται») χρησιμοποιώντας μια ενιαία συνάρτηση Pascal με όνομα `primitive(...)`. Ακολουθούν μερικά πραγματικά παραδείγματα από τον πηγαίο κώδικα του Knuth: `tex.web` πηγαίο κώδικα:

```
primitive("lineskip",assign_glue,glue_base+line_skip_code)
primitive("baselineskip",assign_glue,glue_base+baseline_skip_code)
primitive("parskip",assign_glue,glue_base+par_skip_code)
primitive("abovedisplayskip",assign_glue,glue_base+above_display_skip_code)
primitive("belowdisplayskip",assign_glue,glue_base+below_display_skip_code)
primitive("abovedisplayshortskip",assign_glue,glue_base+above_display_short_skip_code)
...
...
```

Όπως βλέπετε, η `primitive(...)` συνάρτηση είναι ιδιαίτερα κατάλληλη για επεξεργασία κειμένου με κανονικές εκφράσεις: το όνομα της πρωτότυπης εντολής που καταχωρίζεται βρίσκεται μέσα σε εισαγωγικά (`"..."`) μαζί με πρόσθετα δεδομένα που ταξινομούν τη συμπεριφορά κάθε πρωτότυπης εντολής (δεν θα το εξετάσουμε αυτό σε καμία λεπτομέρεια). Αφού εξήχθη η λίστα των πρωτότυπων εντολών για κάθε μηχανή, τα δεδομένα αυτά επεξεργάστηκαν από ορισμένα Lua scripts για να δημιουργηθεί HTML που περιέχει τα αποτελέσματα σε πίνακες.

### Επιστρέφοντας στο LuaTeX

Έχουμε σημειώσει ότι το LuaTeX δεν χρησιμοποιεί ακριβώς τις ίδιες διαδικασίες κατασκευής με τις άλλες 8 μηχανές TeX. Έχοντας εξετάσει σύντομα τη διαδικασία Web2C, τη μετατροπή από Pascal σε C και τον μηχανισμό αρχείων αλλαγών, μπορούμε τώρα να εξηγήσουμε σε τι διαφέρει το LuaTeX: οι δημιουργοί του LuaTeX αποφάσισαν να απαλλαγούν από την περίπλοκη διαδικασία μετατροπής της Pascal σε C—όπως σημειώνεται στο [Εγχειρίδιο Αναφοράς του LuaTeX](http://www.pragma-ade.com/general/manuals/luatex):

> ...το πλαίσιο μεταγλώττισης είναι web2c και συνεχίζουμε να το χρησιμοποιούμε, αλλά χωρίς το βήμα από Pascal σε C.

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

Αυστηρά μιλώντας, πρέπει επίσης να σημειώσουμε ότι ορισμένα από τα αρχεία πηγαίου κώδικα του LuaTeX χρησιμοποιούν μια παραλλαγή της μεθοδολογίας literate programming του Knuth, που ονομάζεται [CWEB](https://en.wikipedia.org/wiki/CWEB), η οποία βασίζεται στη C και όχι στην Pascal.

### Όχι μόνο αρχεία WEB: απαιτείται και άλλος πηγαίος κώδικας

Αφού δημιουργηθεί το σύνθετο αρχείο πηγαίου κώδικα WEB για οποιαδήποτε μηχανή TeX (εκτός από το LuaTeX), ο πηγαίος κώδικας Pascal πρέπει να εξαχθεί και να μετατραπεί σε κώδικα C, αλλά αυτό δεν αποτελεί την πλήρη λύση. Εκτός από τον κώδικα C που παράγεται από τον πηγαίο κώδικα WEB (Pascal⮕C), οι περισσότερες μηχανές TeX βασίζονται επίσης (απαιτούν) σε έναν αριθμό πρόσθετων βοηθητικών αρχείων πηγαίου κώδικα (βιβλιοθηκών) που συνήθως είναι γραμμένα σε C—όπως [Kpathsea](https://www.tug.org/kpathsea/). Τα βοηθητικά αρχεία πηγαίου κώδικα (βιβλιοθήκες) υλοποιούν λειτουργικότητα που δεν χρειάζεται, ή δεν μπορεί, να γραφτεί σε WEB (Pascal). Οτιδήποτε γράφεται στη «γλώσσα» WEB για το TeX πρέπει να χρησιμοποιεί τη γλώσσα Pascal, η οποία στη συνέχεια εξάγεται και μετατρέπεται σε παραγόμενο από μηχανή κώδικα C: αν δεν χρειάζεται να το κάνετε αυτό, γιατί να μην το γράψετε απλώς εξαρχής σε C ή C++;


---

# 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/perissotera-themata/18-how-overleaf-created-the-tex-primitive-reference-data.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.
