> 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/22-how-does-expandafter-work-the-meaning-of-expansion.md).

# Πώς λειτουργεί το \expandafter: Η σημασία της επέκτασης

[Μέρος 1](/latex/el/se-vathos-arthra/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Μέρος 2](/latex/el/se-vathos-arthra/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Μέρος 3](/latex/el/se-vathos-arthra/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Μέρος 4](/latex/el/se-vathos-arthra/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Μέρος 5](/latex/el/se-vathos-arthra/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Μέρος 6](/latex/el/se-vathos-arthra/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)

## Εισαγωγή στην έννοια της «επέκτασης» στο TeX

Αφού εξετάσαμε [τα tokens του TeX και τις λίστες tokens](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true), το επόμενο στη λίστα μας με τα εισαγωγικά θέματα για `\expandafter` είναι η έννοια του TeX για *επέκταση*: η βασική διεργασία του TeX `\expandafter` είναι σχεδιασμένο να λειτουργεί με.

### Σχετικά με την πρόκληση της εξήγησης της επέκτασης...

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

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

### Βασικά σημεία για τα tokens του TeX

Σε όλη την ακόλουθη συζήτηση είναι σημαντικό να θυμόμαστε ότι το TeX μπορεί να αντλήσει το επόμενο στοιχείο εισόδου του από δύο πηγές:

1. **φυσικά αρχεία κειμένου**: δημιουργώντας *νέα διακριτικά* διαβάζοντας/σαρώνοντας χαρακτήρες και εντολές μέσα σε αυτά τα αρχεία, ή
2. **λιστών tokens**: λαμβάνοντας είσοδο διαβάζοντας από μια λίστα υπαρχόντων, *προετοιμασμένων εκ των προτέρων*, tokens αποθηκευμένων στη μνήμη του TeX.

Να θυμάστε επίσης ότι το TeX χρησιμοποιεί τα tokens ως έναν βολικό τρόπο για να «συσκευάζει» τακτοποιημένα πληροφορίες για οποιοδήποτε στοιχείο (χαρακτήρα ή εντολή) έχει διαβάσει.

Όταν το TeX δημιουργεί *νέα διακριτικά* θα έχει, *τη στιγμή της παραγωγής του token*, άμεση πρόσβαση σε πληροφορίες για το στοιχείο του οποίου την τιμή token υπολογίζει. Για παράδειγμα, όταν δημιουργεί νέα command tokens, το TeX πρώτα υπολογίζει μια τιμή που ονομάζεται `curcs` που επιτρέπει στο TeX να αναζητήσει πληροφορίες για την εντολή της οποίας το token πρόκειται να παραγάγει.

Ωστόσο, αν το TeX διαβάζει από λίστες tokens (ακολουθίες από *αποθηκευμένα tokens*) θα έπρεπε πρώτα να «αποσυσκευάσει» οποιοδήποτε token σε εκείνη τη λίστα πριν μπορέσει να καθορίσει τι αντιπροσωπεύει κάθε token. Για παράδειγμα, το TeX μπορεί να διαβάζει tokens αποθηκευμένα ως μέρος ενός ορισμού macro: αυτά τα tokens θα είχαν δημιουργηθεί από κείμενο που εδώ και καιρό έχει διαβαστεί, μετατραπεί σε tokens και αποθηκευτεί. Ο τύπος του token (χαρακτήρας ή εντολή) καθορίζει τι σημαίνει πραγματικά η «αποσυσκευασία» του TeX:

* για *tokens εντολών* (η τιμή του token είναι > 4095): υπολόγισε `curcs` μέσω $$\text{curcs}=\text{token value}-4095$$ και χρησιμοποίησε `curcs` για να αναζητήσεις πληροφορίες για την εντολή;
* για *tokens χαρακτήρων* (η τιμή του token είναι < 4095): διαχώρισε το token χαρακτήρα στο συστατικό ζεύγος του (κωδικός χαρακτήρα, κωδικός κατηγορίας).

### Στην αρχή...

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

### Η έννοια των «επεκτάσιμων» εντολών

Όλα τα προγράμματα στοιχειοθεσίας βασισμένα στο TeX (οι «μηχανές» TeX) αναγνωρίζουν δύο κύριες «κλάσεις» εντολών:

* εντολές ενσωματωμένες στην ίδια την εκτελέσιμη μηχανή: οι λεγόμενες *πρωταρχικές εντολές*;
* εντολές που ορίζονται από τον χρήστη: οι λεγόμενες *μακροεντολές*.

Οι μηχανές TeX χρησιμοποιούν επίσης το «να είναι επεκτάσιμη», έναν τύπο «συμπεριφοράς» εντολής, ως μηχανισμό για να ταξινομούν όλες τις εντολές σε δύο ομάδες:

* επεκτάσιμες εντολές;
* μη επεκτάσιμες εντολές.

Άρα μπορούμε να θεωρήσουμε ότι το σύνολο όλων των εντολών (primitives συν macros) μπορεί να ταξινομηθεί όπως φαίνεται στο ακόλουθο γράφημα:

![Διάγραμμα που δείχνει την ταξινόμηση όλων των εντολών του TeX](/files/79595014529e29656ee0cc0fff11b2d34ac554f2)

Παρότι ακόμη δεν ξέρουμε τι ακριβώς σημαίνει η επέκταση/το επεκτάσιμο, είναι δυνατό να δούμε ότι:

* όλα τα macros ταξινομούνται ως επεκτάσιμες εντολές;
* ορισμένες primitive (ενσωματωμένες) εντολές ταξινομούνται επίσης ως επεκτάσιμες (η συντριπτική πλειονότητα δεν είναι).

**Σημείωση για τους ενεργούς χαρακτήρες**: Εκτός από τις primitives και τα macros υπάρχει και μια τρίτη κλάση «επεκτάσιμου» στοιχείου: οι ενεργοί χαρακτήρες—οποιοιδήποτε χαρακτήρες στους οποίους έχει αποδοθεί ο κωδικός κατηγορίας 13 θεωρούνται επίσης «επεκτάσιμοι», επειδή επεξεργάζονται ως «μινιατούρες macros».

#### Πώς ξέρει το TeX αν μια εντολή είναι «επεκτάσιμη»;

Από τη [συζήτησή μας για τα tokens του TeX](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true) ξέρουμε ότι τα tokens δεν είναι τίποτα περισσότερο από ακέραιοι αριθμοί που το TeX υπολογίζει και χρησιμοποιεί για να «συσκευάζει» πληροφορίες για ένα στοιχείο εισόδου: έναν χαρακτήρα ή μια εντολή. Σημειώσαμε επίσης ότι, δεδομένης οποιασδήποτε τιμής token (ακέραιου), το TeX μπορεί, αν/όταν χρειαστεί, να αντιστρέψει τη διαδικασία tokenization ώστε να «αποσυσκευάσει» ένα token και να αποκαλύψει δεδομένα για την εντολή ή τον χαρακτήρα που αντιπροσωπεύει.

Χρησιμοποιώντας δεδομένα που παράγονται όταν το TeX δημιουργεί ένα νέο token, ή δεδομένα που εξάγονται από ένα υπάρχον token—π.χ. ένα αποθηκευμένο σε ένα macro ή σε άλλη λίστα tokens—το TeX μπορεί να ελέγξει τους εσωτερικούς πίνακες αποθήκευσης δεδομένων του ώστε να βρει λεπτομερείς πληροφορίες για την εντολή (ή τον χαρακτήρα) που αντιπροσωπεύει εκείνο το token. Το ακόλουθο γράφημα συνοψίζει τη διαδικασία δημιουργίας ενός command token («συσκευασία») και στη συνέχεια, όταν το TeX χρειάζεται ορισμένες πληροφορίες, την αντιστροφή της διαδικασίας («αποσυσκευασία» του token) για να αποκτήσει δεδομένα για την εντολή που αντιπροσωπεύεται από μια συγκεκριμένη τιμή token.

![Διάγραμμα που δείχνει πώς το TeX συσκευάζει/αποσυσκευάζει τα tokens](/files/9a70c635b8ff4cb86fdd6bc9cead9dc1c54938c3)

### Κωδικοί εντολών

Μέρος των πληροφοριών που αποθηκεύει το TeX για κάθε εντολή (primitive ή macro) είναι κάτι που ονομάζεται *κωδικός εντολής*: μια ακέραια τιμή που οι μηχανές TeX χρησιμοποιούν (εσωτερικά) για να ταξινομούν τις εντολές—εντολές με παρόμοια συμπεριφορά/λειτουργικότητα μοιράζονται τον ίδιο κωδικό εντολής.

**Σημείωση**: Για έναν μεμονωμένο *μη ενεργοί*, χαρακτήρα, ο κωδικός εντολής του είναι ο *κωδικός κατηγορίας* που του αποδόθηκε τη στιγμή που διαβάστηκε (σαρώθηκε) από το TeX. Σημειώστε επίσης ότι, εκτός από τους χαρακτήρες, οι κωδικοί εντολών είναι καθαρά εσωτερικοί στο TeX: δεν είναι προσβάσιμοι μέσω macros ή primitive εντολών—για να δείτε αυτές τις λεπτομέρειες θα χρειαστεί να διαβάσετε τον πηγαίο κώδικα του TeX!

Ορίστε μερικά παραδείγματα κωδικών εντολών:

* `\hbox`, `\vbox`, `\vtop`, `\vcenter`, `\box` (και άλλες) ταξινομούνται όλες ως εντολές «κατασκευής κουτιών» και μοιράζονται τον κωδικό εντολής 20;
* `\def`, `\edef`, `\gdef`, `\xdef` είναι όλες εντολές «ορισμού macro» και μοιράζονται τον κωδικό εντολής 97;
* όλα τα macros ταξινομούνται με έναν από τους κωδικούς εντολών 111, 112, 113 ή 114: οι διαφορετικοί κωδικοί εντολών καθορίζονται από τη χρήση του `\long` ή `\outer` κατά τον ορισμό του macro:
* 111: κωδικός εντολής για ένα non-long, non-outer macro (π.χ., `\def\foo{...}`)
* 112: κωδικός εντολής για ένα long, non-outer macro (π.χ., `\long\def\foo{...}`)
* 113: κωδικός εντολής για ένα non-long, outer macro (π.χ., `\outer\def\foo{...}`)
* 114: κωδικός εντολής για ένα long, outer macro (π.χ., `\long\outer\def\foo{...}`)

Το TeX χρησιμοποιεί επίσης κωδικούς εντολών για να αναγνωρίζει το υποσύνολο των εντολών που ταξινομούνται ως «επεκτάσιμες». Για να το κάνει αυτό, το TeX συσχετίζει τις επεκτάσιμες εντολές με τιμές κωδικού εντολής που υπερβαίνουν την οριακή τιμή 100 (την τιμή που χρησιμοποιείται από το αρχικό TeX του Knuth, το e-TeX και το pdfTeX). Κατά συνέπεια:

* *μη επεκτάσιμων* οι εντολές (η συντριπτική πλειονότητα) έχουν κωδικό εντολής <= 100
* *επεκτάσιμες* οι εντολές έχουν κωδικό εντολής > 100

Επομένως, αν το TeX αναζητήσει τα στοιχεία για μια συγκεκριμένη εντολή και εντοπίσει κωδικό εντολής > 100, αμέσως ξέρει ότι είναι επεκτάσιμη. Όλα τα macros και ένας μικρός αριθμός primitives (ενσωματωμένων εντολών) λαμβάνουν κωδικό εντολής που δείχνει ότι είναι επεκτάσιμες: αλλά γιατί το TeX ασχολείται με αυτή την ταξινόμηση «επεκτάσιμη»; Όπως ίσως υποψιάζεστε, απλώς σημαίνει ότι αυτές οι εντολές είναι κάπως «ειδικές»· δηλαδή, μπορούν να υποβληθούν στη διαδικασία του TeX για *επέκταση*.

**Σημείωση (χαρακτήρες)**: Εκτός αν ένας χαρακτήρας έχει οριστεί ως ενεργός (κωδικός κατηγορίας 13), όλοι οι χαρακτήρες είναι μη επεκτάσιμοι. Οι ενεργοί χαρακτήρες μπορούν να θεωρηθούν ως «μίνι macros» ενός γράμματος.

## Ναι, ναι, αλλά τι είναι η επέκταση;;;

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

### Επέκταση: Ένας γενικός όρος για ένα σύνολο λειτουργιών

Σε ορισμένα σημεία κατά την επεξεργασία του TeX χρειάζεται να γνωρίζει αν ένα token αντιπροσωπεύει μια επεκτάσιμη εντολή:

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

Ουσιαστικά, η επέκταση περιλαμβάνει το TeX να *την αφαίρεση* αυτό το token από την είσοδό του και να *την αντικατάστασή* το αντικαθιστά με tokens που προκύπτουν από την «διαδικασία επέκτασης» ειδική για εκείνη την εντολή ή για εκείνη την ομάδα εντολών που μοιράζονται τον ίδιο κωδικό εντολής.

Χρειάζονται εξάσκηση και εμπειρία για να ξέρει κανείς πότε το TeX πραγματοποιεί, και πότε δεν πραγματοποιεί, επέκταση token—η σελίδα 215 του The TeXbook απαριθμεί τις περιπτώσεις στις οποίες τα επεκτάσιμα tokens δεν επεκτείνονται. Η πραγματικότητα είναι ότι η διαδικασία εκτέλεσης επέκτασης από το TeX είναι σύνθετη και λεπτή.

#### Ποιες εντολές είναι επεκτάσιμες;

Αν κοιτάξει κανείς μια λίστα primitive (ενσωματωμένων) εντολών που οι μηχανές TeX ταξινομούν ως επεκτάσιμες (π.χ. σελίδες 212–215 του The TeX book) γίνεται φανερό ότι, στην πράξη, η επέκταση είναι ένας αρκετά γενικός όρος που το TeX χρησιμοποιεί για να περιγράψει τη συμπεριφορά μιας κάπως εκλεκτικής ομάδας εντολών. Τα αποτελέσματα από την επέκταση μιας συγκεκριμένης (επεκτάσιμης) εντολής διαφέρουν και αυτό το βλέπουμε απαριθμώντας ένα σύνολο επεκτάσιμων εντολών—ομαδοποιημένων ανάλογα με τη λειτουργικότητά τους. Η ακριβής σημασιολογία των μεμονωμένων εντολών δεν είναι σημαντική εδώ· το περισσότερο ενδιαφέρον παρουσιάζουν οι γενικές συνέπειες των ενεργειών τους—τι πραγματικά η επέκτασή τους *κάνει ή επιτυγχάνει*.

| **Εντολή**                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | **Περιγραφή**                                                                                                                                                                                     | **Συμπεριφορά επέκτασης**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <ul><li>όλα τα macros</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                            | Μια αποθηκευμένη ακολουθία tokens εντολών/χαρακτήρων                                                                                                                                              | <p>Στην πράξη, η επέκταση macro σημαίνει την εισαγωγή μιας λίστας tokens για να τη διαβάσει το TeX. Αυτό περιλαμβάνει:</p><ul><li>τη δημιουργία λιστών tokens για τυχόν ορίσματα macro—εκείνη η διαδικασία περιλαμβάνει την αναγνώριση/απορρόφηση των tokens διαχωριστών;</li><li>την ανάκτηση μιας λίστας αποθηκευμένων tokens (του ορισμού του macro) και την προετοιμασία για εισαγωγή (μέσα στον ορισμό του macro) των tokens παραμέτρων που δημιουργήθηκαν στο πρώτο βήμα.</li></ul><p>Ουσιαστικά, η επέκταση macro <em>αφαιρεί το token του macro</em> αφαιρείται από την είσοδο και <em>το αντικαθιστά</em> με τα tokens που περιέχονται στον ορισμό.</p> |
| <ul><li><code>\expandafter</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                | Αλλαγή της σειράς της επέκτασης                                                                                                                                                                   | Φιλτράρισμα/αναδιάταξη tokens                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| <ul><li><code>\noexpand</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                   | Αποτροπή επέκτασης (ναι, παραδόξως ταξινομείται ως επεκτάσιμη εντολή)                                                                                                                             | Καθυστέρηση της επέκτασης (κάτι σαν φιλτράρισμα tokens)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| <ul><li><code>\input</code>, <code>\endinput</code>, <code>\scantokens</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | Σχετίζεται με την εισαγωγή μιας νέας πηγής tokens μέσω αρχείων πηγής—ναι, `\scantokens` σε αυτή την κατηγορία λόγω της χρήσης των λεγόμενων «ψευδο-αρχείων»                                       | Λειτουργεί ως πηγή νέων tokens                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| <ul><li><code>\if</code>, <code>\ifcat</code>, <code>\ifnum</code>, <code>\ifdim</code>, <code>\ifodd</code>, <code>\ifvmode</code>, <code>\ifhmode</code>, <code>\ifmmode</code>, <code>\ifinner</code>, <code>\ifvoid</code>, <code>\ifhbox</code>, <code>\ifvbox</code>, <code>\ifx</code>, <code>\ifeof</code>, <code>\iftrue</code>, <code>\iffalse</code>, <code>\ifcase</code>, <code>\ifdefined</code>, <code>\ifcsname</code>, <code>\iffontchar</code></li></ul> | Έναρξη μιας υπό όρους έκφρασης                                                                                                                                                                    | Έναρξη «φιλτραρίσματος» tokens: αποφασίζει ποια από τα ακόλουθα tokens θα επεξεργαστούν.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| <ul><li><code>\fi</code>, <code>\or</code>, <code>\else</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                   | Τερματισμός μιας υπό όρους έκφρασης                                                                                                                                                               | Σταμάτημα του «φιλτραρίσματος» tokens: αποφασίζει ποια tokens θα επεξεργαστούν                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| <ul><li><code>\csname</code>… <code>\endcsname</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                            | Κατασκευή/δημιουργία ενός token εντολής                                                                                                                                                           | Μετατροπή μιας σειράς tokens σε ένα ενιαίο token εντολής                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| <ul><li><code>\number</code>, <code>\romannumeral</code>, <code>\string</code>, <code>\meaning</code>, <code>\fontname</code>, <code>\jobname</code>, <code>\eTeXrevision</code></li></ul>                                                                                                                                                                                                                                                                                 | Μετατροπή κάποιου πράγματος σε ακολουθία tokens                                                                                                                                                   | Δημιουργία ορισμένων tokens (που αντιπροσωπεύουν μια εσωτερική ποσότητα ή τιμή)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| <ul><li><code>\the</code>, <code>\unexpanded</code>, <code>\detokenize</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | `\the` έχει διάφορες χρήσεις, συμπεριλαμβανομένης της εισαγωγής tokens; `\detokenize` μετατρέπει μια λίστα tokens σε μια λίστα tokens χαρακτήρων; `\unexpanded` αποτρέπει την επέκταση των tokens | Εισαγωγή/δημιουργία ορισμένων tokens ή έλεγχος της επέκτασης                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| <ul><li><code>\topmark</code>, <code>\firstmark</code>, <code>\botmark</code>, <code>\splitfirstmark</code>, <code>\splitbotmark</code>, <code>\topmarks</code>, <code>\firstmarks</code>, <code>\botmarks</code>, <code>\splitfirstmarks</code>, <code>\splitbotmarks</code></li></ul>                                                                                                                                                                                    | Εντολές για πρόσβαση σε λίστες tokens που έχουν εξειδικευμένες χρήσεις                                                                                                                            | Πρόσβαση σε μια πηγή αποθηκευμένων tokens (λίστες tokens)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |

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

* δημιουργία tokens
* εισαγωγή tokens
* φιλτράρισμα tokens
* αλλαγή/έλεγχος της επέκτασης του επόμενου token

### Και τέλος: ποια είναι η σημασία της επέκτασης;

Μπορούμε να θεωρήσουμε ότι η επέκταση ενός token εντολής (συμπεριλαμβανομένων των ενεργών χαρακτήρων) περιλαμβάνει το TeX να **την αφαίρεση** αυτό το token εντολής από την είσοδο και να **την αντικατάστασή** αυτό το token με άλλα tokens που προκύπτουν από τη συμπεριφορά επέκτασής του: δημιουργώντας/εισάγοντας tokens, φιλτράροντας tokens ή αλλάζοντας/ελέγχοντας την επέκταση του επόμενου token. Μόλις ένα token επεκταθεί, το TeX θα συνέχιζε να διαβάζει/επεξεργάζεται τυχόν tokens που μπορεί να προκύψουν από τη διαδικασία επέκτασης. Το πότε ή πού ακριβώς το TeX θα εκτελεί επέκταση είναι μια πολύ διαφορετική ερώτηση: λόγω των αποχρώσεων και των πολυπλοκοτήτων της επεξεργασίας του TeX είναι κάτι που δεν μπορούμε να το καλύψουμε πλήρως σε αυτό το άρθρο, αλλά μπορούμε να δώσουμε μια επισκόπηση της κύριας συμπεριφοράς επεξεργασίας εισόδου του TeX.

## Η επέκταση και η δομή του TeX

Αναμφίβολα, ο καλύτερος τρόπος να δει κανείς πώς/πού το TeX διακρίνει ανάμεσα σε επεκτάσιμες και μη επεκτάσιμες εντολές είναι να εξετάσει τον πηγαίο κώδικά του.

Εσωτερικά, το TeX είναι ένα εξαιρετικά σύνθετο λογισμικό· κατά συνέπεια, είναι ανεφάρμοστο να επιχειρήσει κανείς μια πλήρη περιγραφή των πολλών λεπτών συμπεριφορών που είναι εγγενείς στη λειτουργία του TeX. Όπως σημειώθηκε, το πότε ή πού ακριβώς το TeX θα εκτελέσει πραγματικά επέκταση καθώς διαβάζει tokens είναι «κάπως σύνθετο»· κατά συνέπεια, η ακόλουθη συζήτηση υποθέτει ότι το TeX βρίσκεται σε κατάσταση που απαιτεί να λάβει χώρα επέκταση. Καταστάσεις όπου το TeX θα διάβαζε/δημιουργούσε tokens, αλλά δεν θα εκτελούσε επέκταση, περιλαμβάνουν τη δημιουργία/αποθήκευση tokens για το `\def` command ορισμού macro ή την αποθήκευση tokens σε ένα `\toks` καταχωρητή.

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

![](/files/de316cded4ee5579a33ae2df9eda8026f5c001f2)

### Επεξήγηση του διαγράμματος της δομής του TeX

Σε γενικές γραμμές, η επεξεργασία του TeX καθοδηγείται από μια συνάρτηση που ονομάζεται `maincontrol()` την οποία, στον πηγαίο κώδικα του TeX, ο Knuth αποκαλεί “chief executive” και την περιγράφει ως εξής:

> «Φτάνουμε τώρα στη `maincontrol` ρουτίνα, η οποία περιέχει τον κεντρικό διακόπτη που κάνει όλα τα διάφορα κομμάτια του TeX να κάνουν τη δουλειά τους, με τη σωστή σειρά… αυτή είναι η μεγάλη κορύφωση του προγράμματος… Βρισκόμαστε τώρα στο κέντρο του ιστού, το κεντρικό νευρικό σύστημα που αγγίζει τα περισσότερα άλλα μέρη και τα δένει μεταξύ τους.»

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

Ουσιαστικά, στο πρώιμο στάδιο επεξεργασίας εισόδου του TeX χρησιμοποιεί την τιμή του κωδικού εντολής της τρέχουσας εντολής (token) για να εντοπίσει τις επεκτάσιμες εντολές (macros, επεκτάσιμες primitives και ενεργούς χαρακτήρες)· αν αναγνωριστεί μία, τέτοιες εντολές «αναχαιτίζονται» και «προεπεξεργάζονται»—μέσω επέκτασης. Μέσα από αυτή τη διαδικασία φιλτραρίσματος (επέκτασης) το TeX αφαιρεί τις επεκτάσιμες εντολές από την είσοδο και τις αντικαθιστά με tokens που προκύπτουν από την αντίστοιχη συμπεριφορά επέκτασής τους. Μόλις ολοκληρωθεί η διαδικασία επέκτασης, το TeX θα διαβάσει τυχόν tokens που παρήχθησαν από εκείνη την επέκταση. Μόνο τα μη επεκτάσιμα στοιχεία περνούν στο επόμενο στάδιο επεξεργασίας του TeX: το «μεγάλο switch», όπου το TeX θα εκτελέσει όλες τις μη επεκτάσιμες primitive εντολές και θα στοιχειοθετήσει χαρακτήρες.

### Κατανόηση του maincontrol()

Η `maincontrol()` Η συνάρτηση περιέχει ένα μεγάλο λεγόμενο [switch statement](https://en.wikipedia.org/wiki/Switch_statement)—ο Knuth το αποκαλεί το «big switch»—το οποίο το TeX χρησιμοποιεί για να εκτελεί όλες τις *μη επεκτάσιμων* primitive εντολές: εκείνες με κωδικό εντολής <=100.

Για να εκτελέσει μια συγκεκριμένη εντολή (ή χαρακτήρα) αυτή η εντολή «big switch» χρησιμοποιεί έναν συνδυασμό της τρέχουσας λειτουργίας του TeX:

* εσωτερική/εξωτερική κατακόρυφη λειτουργία, ή
* περιορισμένη/παραγραφοποιημένη οριζόντια λειτουργία, ή
* ενσωματωμένη/προβαλλόμενη μαθηματική λειτουργία

*συν* την τιμή του κωδικού εντολής για κάθε primitive ή χαρακτήρα—ο κωδικός εντολής ενός *μη ενεργοί* χαρακτήρα είναι η *κωδικός κατηγορίας* τιμή του. Για την ιστορία, και οι 6 λειτουργίες του TeX έχουν λάβει μια ακέραιη τιμή που μπορεί να χρησιμοποιήσει το TeX για να αποθηκεύει και να επαναφέρει την τρέχουσα λειτουργία του ενώ εναλλάσσεται μεταξύ διάφορων στοιχείων στοιχειοθεσίας—μαθηματικών, παραγράφων, κουτιών κ.ο.κ. Ορίστε οι ακέραιοι που έχουν αποδοθεί στις διάφορες λειτουργίες του TeX:

|                                   |                                              |                      |
| --------------------------------- | -------------------------------------------- | -------------------- |
| **Λειτουργία**                    | **Σημασία**                                  | **Τιμή λειτουργίας** |
| Εξωτερική κατακόρυφη              | Μεταξύ παραγράφων (κατασκευή σελίδων)        | 1                    |
| Εσωτερική κατακόρυφη              | Αμέσως μέσα σε ένα `\vbox{...}`              | -1                   |
| Οριζόντια                         | Κατά τη στοιχειοθεσία/κατασκευή παραγράφων   | 102                  |
| Περιορισμένη οριζόντια            | Αμέσως μέσα σε ένα `\hbox{...}`              | -102                 |
| Προβαλλόμενα μαθηματικά           | Στοιχειοθεσία *εμφανιζόμενη* εξισώσεων/τύπων | 203                  |
| Ενσωματωμένα (formula) μαθηματικά | Στοιχειοθεσία *ενσωματωμένη* εξισώσεων/τύπων | -203                 |

Σημειώστε τη χρήση αρνητικών τιμών για το συμπλήρωμα των διαφόρων λειτουργιών, όπως εσωτερική έναντι εξωτερικής κατακόρυφης λειτουργίας. Όταν επεξεργάζεται εντολές σε `maincontrol()`, το TeX χρησιμοποιεί την απόλυτη τιμή της τρέχουσας λειτουργίας—δηλαδή αγνοεί το αρνητικό πρόσημο. Έτσι, για παράδειγμα, αν το TeX βρίσκεται σε οποιαδήποτε από τις οριζόντιες λειτουργίες του και χρειάζεται να επεξεργαστεί έναν χαρακτήρα με κωδικό κατηγορίας 11, θα χρησιμοποιούσε το άθροισμα $$102 + 11 = 113$$ μέσα στο «big switch» του για να διακλαδωθεί προς τον κώδικα που επεξεργάζεται αυτούς τους χαρακτήρες σε οποιαδήποτε οριζόντια λειτουργία (κατασκευή παραγράφων ή μέσα σε ένα `\hbox`).

#### Λήψη του επόμενου token

Η `maincontrol()` Η συνάρτηση καλεί τη συνάρτηση `getxtoken()` για να πάρει το επόμενο token εισόδου· με τη σειρά της, `getxtoken()` καλεί τη συνάρτηση εισόδου χαμηλότερου επιπέδου `getnext()`. Αφού `getnext()` έχει ολοκληρώσει το έργο της και έχει ορίσει την τιμή των βασικών *παγκόσμιων μεταβλητών*, `getxtoken()` ελέγχει αν το στοιχείο που μόλις διαβάστηκε αντιπροσωπεύει ένα macro ή μια επεκτάσιμη primitive.

Μερικές σημειώσεις για το `getnext()` και `getxtoken()`:

* **`getnext()`**: αυτή είναι η βασική συνάρτηση εισόδου του TeX. Διαβάζει και επεξεργάζεται χαρακτήρες που εισάγονται από ένα φυσικό αρχείο ή διαβάζει tokens από μια λίστα tokens. Σημειώστε ότι `getnext()` δεν υπολογίζει στην πραγματικότητα τιμές token, αλλά ρυθμίζει έναν αριθμό βασικών *παγκόσμιων* μεταβλητών (π.χ., τον κωδικό εντολής και `curcs`) που χρησιμοποιούνται αργότερα στην επεξεργασία.
* **`getxtoken()`**: το “get expanded token” χρησιμοποιεί `getnext()` για να διαβάσει το επόμενο στοιχείο εισόδου. Στη συνέχεια ελέγχει τον κωδικό εντολής του στοιχείου που μόλις διαβάστηκε για να δει αν εκείνο το στοιχείο αντιπροσωπεύει μια επεκτάσιμη εντολή: αν ναι, επεκτείνεται ή καλείται το macro. Για τα μη επεκτάσιμα στοιχεία, `getxtoken()` υπολογίζει μια τιμή token και αυτές οι λεπτομέρειες προωθούνται στο επόμενο στάδιο επεξεργασίας: το «big switch», όπου εκτελούνται οι μη επεκτάσιμες primitives και οι χαρακτήρες στοιχειοθετούνται.

Ουσιαστικά, είναι μέσω του `getxtoken()` που όλα τα επεκτάσιμα στοιχεία «φιλτράρονται» πριν επεξεργαστούν στο `maincontrol()`: αυτό έχει ως αποτέλεσμα το «big switch» του TeX να επεξεργάζεται μόνο μη επεκτάσιμες primitive εντολές.

Για άλλη μια φορά τονίζουμε ότι το παραπάνω διάγραμμα είναι μια απλοποίηση, επειδή και άλλοι τομείς της επεξεργασίας του TeX θα προκαλέσουν επίσης την επέκταση tokens· για παράδειγμα:

* όταν το TeX αναζητά (σαρώνει) αριθμητικές τιμές, θα ενεργοποιεί επέκταση στην αναζήτησή του για ακέραιους (καλώντας το `getxtoken()`) ;
* την primitive εντολή `\romannumeral` προκαλεί επέκταση—βλ. το άρθρο [Επέκταση χρησιμοποιώντας `\romannumeral`](https://www.texdev.net/2011/07/05/expansion-using-romannumeral/) για μια λεπτομερή χρήση αυτού του γεγονότος;
* Η `\edef` («expanded definition») η εντολή ορισμού macro επιβάλλει πλήρη επέκταση;
* Το TeX θα επεκτείνει tokens σε ορισμένα σημεία κατά την επεξεργασία του προοιμίου ενός `\halign` ή `\valign` (και οι δύο εντολές σχετίζονται με τους αλγορίθμους στοιχειοθεσίας πινάκων του TeX).

[Μέρος 1](/latex/el/se-vathos-arthra/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Μέρος 2](/latex/el/se-vathos-arthra/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Μέρος 3](/latex/el/se-vathos-arthra/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Μέρος 4](/latex/el/se-vathos-arthra/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Μέρος 5](/latex/el/se-vathos-arthra/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Μέρος 6](/latex/el/se-vathos-arthra/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)


---

# 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/22-how-does-expandafter-work-the-meaning-of-expansion.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.
