> 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/17-how-does-expandafter-work-a-detailed-macro-case-study.md).

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

&#x20;[Μέρος 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)&#x20;

## Μελέτη περίπτωσης: \expandafter παράδειγμα από το $$\varepsilon\mathrm{\text{-}{\TeX}}$$ Εγχειρίδιο

Το $$\varepsilon\mathrm{\text{-}{\TeX}}$$ η μηχανή στοιχειοθεσίας προήλθε από το λογισμικό TeX του Knuth και αρχικά προοριζόταν ως ένα «ενδιάμεσο» βήμα προς την ανάπτυξη του [Νέου Συστήματος Στοιχειοθεσίας](https://en.wikipedia.org/wiki/New_Typesetting_System) (NTS), γραμμένου στη γλώσσα προγραμματισμού Java. $$\varepsilon\mathrm{\text{-}{\TeX}}$$ αναπτύχθηκε για πρώτη φορά στα τέλη της δεκαετίας του 1990 για να προσθέσει μια σειρά από νέες πρωτογενείς εντολές που παρέχουν πρόσθετη λειτουργικότητα μη διαθέσιμη στο αρχικό πρόγραμμα του Knuth. Αν και $$\varepsilon\mathrm{\text{-}{\TeX}}$$ έχει λάβει περιοδικές ενημερώσεις από την αρχική του κυκλοφορία, σήμερα δεν χρησιμοποιείται ευρέως ως αυτόνομη μηχανή στοιχειοθεσίας, αν και οι καινοτομίες του έχουν ενσωματωθεί σε μεταγενέστερες γενιές του TeX: pdfTeX, XeTeX και LuaTeX.

Το [$$\varepsilon\mathrm{\text{-}{\TeX}}$$ εγχειρίδιο](http://mirror.ox.ac.uk/sites/ctan.org/systems/doc/etex/etex_man.pdf) περιέχει ένα διαφωτιστικό παράδειγμα μιας μακροεντολής που κάνει έξυπνη χρήση του `\expandafter`:

```
    \def\foo#1#2{\number#1
    \ifnum#1<#2,
    \expandafter\foo
    \expandafter{\number\numexpr#1+1\expandafter}%
    \expandafter{\number#2\expandafter}%
    \fi}
```

`\foo` υλοποιεί έναν μηχανισμό βρόχου, έτσι ώστε `\foo{7}{13}` παράγει `7, 8, 9, 10, 11, 12, 13`; ωστόσο, `\foo` δεν χρησιμοποιεί καμία *εκχώρηση τιμών σε μεταβλητές* προκειμένου να ελέγχει τη διαδικασία του βρόχου—κάτι που την καθιστά μια ενδιαφέρουσα μακροεντολή για διερεύνηση με κάποια λεπτομέρεια.

### Κάποιο υπόβαθρο: εκφράσεις και εκχωρήσεις

Ένα σημαντικό στοιχείο του `\foo`του κώδικα του είναι η χρήση της εντολής `\numexpr`، μια εντολή από ένα σύνολο τεσσάρων σχετικών πρωτογενών εντολών που παρουσιάστηκαν για πρώτη φορά από $$\varepsilon\mathrm{\text{-}{\TeX}}$$: `\numexpr`, `\dimexpr`, `\glueexpr` και `\muexpr`. Σκοπός τους είναι να κατασκευάζουν τα λεγόμενα *εκφράσεις* οι οποίες επιτρέπουν τον υπολογισμό/τον χειρισμό τιμών TeX τύπου number, dimen, glue ή muglue (αντίστοιχα). Όπως συζητείται στις σελίδες 8–9 του $$\varepsilon\mathrm{\text{-}{\TeX}}$$ Εγχειριδίου, ένα σημαντικό χαρακτηριστικό των *εκφράσεις* είναι ότι η αξιολόγησή τους (ο υπολογισμός) δεν απαιτεί από το TeX να εκτελέσει καμία *εκχώρηση*.

Σε προγραμματιστικούς όρους, η εκχώρηση είναι η διαδικασία ορισμού (ανάθεσης) μιας μεταβλητής ώστε να έχει μια συγκεκριμένη τιμή· για παράδειγμα, η εκχώρηση `\count` καταχωρητή `99` να περιέχει την τιμή `12345` μέσω `\count99=12345`. Πολλοί άλλοι τύποι εκχώρησης λαμβάνουν χώρα κατά την επεξεργασία του TeX—όπως η ανάθεση σε καταχωρητές διακριτικών να περιέχουν μια σειρά από διακριτικά, η ανάθεση σε καταχωρητές πλαισίων να περιέχουν περιεχόμενο πλαισίου, και ούτω καθεξής.

Για να πραγματοποιηθεί μια εκχώρηση, όπως `\count99=12345`, το TeX πρέπει να ενεργοποιήσει (εκτελέσει) τον εσωτερικό κώδικα που υλοποιεί τη συμπεριφορά του `\count` ή οποιασδήποτε άλλης πρωτογενούς εντολής που εκτελεί κάποιο είδος εκχώρησης. Ωστόσο, υπάρχουν στιγμές κατά τις οποίες το TeX εκτελεί καθαρή *επέκταση* και, σε αυτές τις στιγμές, τέτοιες εκχωρήσεις δεν εκτελούνται—*σε εκείνο το σημείο της επεξεργασίας του TeX*. Παραδείγματα αυτής της κατάστασης περιλαμβάνουν τις ακόλουθες εντολές:

* `\edef\command {*λίστα διακριτικών*}` η εντολή ορισμού μακροεντολής «εκτεταμένου ορισμού» που επεκτείνει τα διακριτικά σε *λίστα διακριτικών* και αποθηκεύει τα αποτελέσματα ως τον ορισμό της `\command`.
* `\write *αριθμός* {*λίστα διακριτικών*}` επεκτείνει τα διακριτικά σε `*λίστα διακριτικών*` και τα γράφει σε ένα αρχείο που αναπαρίσταται από `*αριθμός*`.
* `\directlua {*λίστα διακριτικών*}` αυτή η πρωτογενής εντολή του LuaTeX χρησιμοποιείται για να μεταβιβάζει κώδικα Lua στον ενσωματωμένο διερμηνέα Lua. Όλα τα διακριτικά σε `*λίστα διακριτικών*` επεκτείνονται πλήρως πριν μεταβιβαστούν στον διερμηνέα Lua για εκτέλεση.

#### Γρήγορο παράδειγμα του \edef

Αν γράψουμε τις ακόλουθες βασικές μακροεντολές:

```
     \def\mycount{\count99=12345}
     \edef\mymacro{\mycount}
```

`\edef` θα επεκτείνει `\mycount` στα συνιστώσες διακριτικά του, αλλά δεν προχωρά παραπέρα: καμία από τις εντολές που περιέχονται στον ορισμό της `\mymacro` θα εκτελεστεί: δηλαδή, η εκχώρηση του `12345` στο `\count99` *δεν συμβαίνει σε αυτό το σημείο*; μόνο όταν καλέσουμε `\mymacro` θα πραγματοποιηθεί αυτή η εκχώρηση καθώς το TeX εκτελεί τον κώδικα για να επεξεργαστεί την `\count` πρωτογενή εντολή. Όταν το TeX εκτελεί *δραστηριότητες μόνο επέκτασης* οποιεσδήποτε εκχωρήσεις θα εκτελεστούν αργότερα στην επεξεργασία του TeX, όχι κατά την ίδια τη διαδικασία επέκτασης.

#### Γιατί μας ενδιαφέρουν οι εκχωρήσεις εδώ;

Όταν γράφουμε κώδικα για να εκτελέσουμε έναν βρόχο—σε οποιαδήποτε γλώσσα προγραμματισμού—είναι συνηθισμένη πρακτική να υπάρχει μια μεταβλητή που ορίζεται να λειτουργεί ως «μετρητής βρόχου»: χρησιμοποιείται για τον έλεγχο του πόσες φορές εκτελείται ένας βρόχος. Η επανάληψη συνήθως ελέγχεται δοκιμάζοντας αν η συγκεκριμένη μεταβλητή μετρητή βρόχου έχει φτάσει σε μια συγκεκριμένη τιμή—η μεταβλητή αυτή αυξάνεται (ή μειώνεται) σε κάθε επανάληψη του βρόχου. Ωστόσο, η τροποποίηση μιας μεταβλητής μετρητή βρόχου σημαίνει την εκχώρηση μιας νέας τιμής, κάτι που για το TeX συνήθως απαιτεί την πρωτογενή εντολή `\advance` για να αυξήσει (ή να μειώσει) μια τιμή αποθηκευμένη σε έναν `\count` καταχωρητή. Όπως είδαμε, κατά την καθαρή διαδικασία επέκτασης του TeX τέτοιες εκχωρήσεις (συμπεριλαμβανομένης της αύξησης μεταβλητών) δεν μπορούν να λάβουν χώρα: η μακροεντολή `\foo` παρακάμπτει έξυπνα αυτόν τον περιορισμό.

### Επιστροφή στην εξήγηση της \foo

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

**Θυμηθείτε**: Εξετάζουμε την εκτέλεση μιας μακροεντολής αφού το αρχικό κείμενο του ορισμού της—που περιέχεται σε ένα φυσικό `.tex` αρχείο—έχει σαρωθεί (διαβαστεί από το TeX) και μετατραπεί σε μια λίστα διακριτικών που αναπαριστά τον ορισμό της μακροεντολής. Ουσιαστικά, ακολουθούμε την επεξεργασία από το TeX εκείνων των αποθηκευμένων *διακριτικών* ενώ διαβάζει και επεξεργάζεται διακριτικά στον ορισμό της μακροεντολής που βρίσκεται κάπου στη μνήμη του TeX. Τυχόν χαρακτήρες κενού που υπήρχαν αρχικά στον κώδικα TeX του ορισμού της μακροεντολής (κείμενο μέσα στο `.tex` αρχείο) θα έχουν απορροφηθεί καθώς το TeX σάρωνε εκείνο το κείμενο για εντολές (τα κενά ως τερματιστές), ή θα έχουν μετατραπεί σε διακριτικά, όπως ο χαρακτήρας κενού μετά το κόμμα (`,`) στο `\ifnum#1<#2,` που προέκυψε από τη μετατροπή του χαρακτήρα τέλους γραμμής (`\r`) σε κενό.

Επειδή ο κώδικας TeX στο `\foo` χρησιμοποιεί πολλαπλές `\expandafter` εντολές, θα βοηθήσουμε την εξήγησή μας προσθέτοντας δείκτες σε κάθε `\expandafter`, υποδεικνύοντας σε ποια αναφερόμαστε. Επιπλέον, θα επεκτείνουμε τη σημειογραφία για τα διακριτικά που επεξεργάζεται το `\expandafter` στο $$\mathrm{T^i\_1}$$ και $$\mathrm{T^i\_2}$$, αναπαριστώντας διακριτικά $$\mathrm{T\_1}$$ και $$\mathrm{T\_2}$$ για `\expandafter<sub>i</sub>`: `\expandafter<sub>i</sub>` $$\mathrm{T^i\_1T^i\_2}$$

Ορίστε ο σχολιασμένος κώδικας της μακροεντολής:

```
    \def\foo#1#2{\number#1
    \ifnum#1<#2,
    \expandafter1\foo
    \expandafter2{\number\numexpr#1+1\expandafter3}%
    \expandafter4{\number#2\expandafter5}%
    \fi}
```

`\foo` ξεκινά με `\number#1` η οποία χρησιμοποιεί την επεκτάσιμη εντολή `\number` για να μετατρέψει την τιμή του πρώτου ορίσματος στη στοιχειοθετημένη της αναπαράσταση. Η `\number` εντολή λειτουργεί δημιουργώντας μια προσωρινή λίστα διακριτικών που περιέχει χαρακτηρικά διακριτικά τα οποία αναπαριστούν τα μεμονωμένα ψηφία που περιέχονται στη αριθμητική τιμή στην οποία `\number` λειτουργεί. Αυτή η λίστα διακριτικών γίνεται η επόμενη πηγή εισόδου του TeX. Εδώ, αυτή η λίστα διακριτικών διαβάζεται και τα διακριτικά εξάγονται για να στοιχειοθετήσουν την τιμή του `#1`.

Στη συνέχεια, η μακροεντολή εκτελεί τον έλεγχο `\ifnum#1<#2` για να ελέγξει αν το όρισμα για `#1` είναι μικρότερο από το όρισμα που δόθηκε για `#2`. Αν ναι, ένα κόμμα (`,`) εξάγεται (στοιχειοθετείται), ακολουθούμενο από κάποιο κενό που προκύπτει από το διακριτικό που δημιουργήθηκε από τον χαρακτήρα αλλαγής γραμμής μετά το κόμμα (`,`). Αυτός ο χαρακτήρας κενού δημιουργήθηκε αρχικά όταν το TeX διάβασε αυτή τη γραμμή από το `.tex` αρχείο.

Η μακροεντολή συνεχίζει επεξεργαζόμενη αυτή την επόμενη ενότητα κώδικα, που αποτελεί τον πυρήνα της λειτουργίας της:

```
    \expandafter1\foo
    \expandafter2{\number\numexpr#1+1\expandafter3}%
    \expandafter4{\number#2\expandafter5}%
    \fi}
```

Ουσιαστικά, αυτός ο κώδικας δημιουργεί μια σειρά από προσωρινές λίστες διακριτικών που οδηγούν σε πολλαπλές κλήσεις της `\foo` μακροεντολής, τερματίζοντας όταν το if-test `\ifnum#1<#2` δεν είναι πλέον αληθές. Αλλά *πώς* ελέγχεται ο βρόχος αφού δεν πραγματοποιούνται εκχωρήσεις: πού είναι ο «μετρητής βρόχου»;

Ας αρχίσουμε κοιτάζοντας τον κώδικα `\expandafter<sub>1</sub>\foo\expandafter<sub>2</sub>`. Σημειώστε ότι θα χρησιμοποιήσουμε τη σημειογραφία με δείκτες `<sub>διακριτικό</sub>` (ή `<sub>(διακριτικού)</sub>`) για να θυμόμαστε ότι, εδώ, το TeX διαβάζει/επεξεργάζεται αριθμητικές τιμές διακριτικών (ακέραιων).

Εδώ, έχουμε τα ακόλουθα διακριτικά ως είσοδο για `\expandafter<sub>1</sub>`:

* $$\mathrm{T^1\_1} =$$`\foo<sub>διακριτικό</sub>` το οποίο διαβάζεται και αποθηκεύεται για μελλοντική *επανεισαγωγή* πίσω στην είσοδο
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>2 (διακριτικό)</sub>` το οποίο επεκτείνεται

Για `\expandafter<sub>2</sub>` έχουμε:

* $$\mathrm{T^2\_1} =$$`{<sub>διακριτικό</sub>` το οποίο αποθηκεύεται για μελλοντική *επανεισαγωγή* πίσω στην είσοδο
* $$\mathrm{T^2\_2} =$$ `\number<sub>διακριτικό</sub>` το οποίο επεκτείνεται

**Σημείωση:**`\number` είναι μια επεκτάσιμη εντολή σκοπός της οποίας είναι να «μετατρέπει σε διακριτικά»: δηλαδή, να μετατρέπει μια αριθμητική ποσότητα σε μια σειρά από χαρακτηρικά διακριτικά που αναπαριστούν αυτή την ποσότητα. Όταν `\number` επεκτείνεται, το πρώτο πράγμα που κάνει το TeX είναι να σαρώνει την είσοδο αναζητώντας ακέραιους: μια διαδικασία που ενεργοποιεί περαιτέρω επέκταση.

**Το κλειδί της ιστορίας:** Εδώ, `\number` λειτουργεί πάνω στην *έκφραση* `\numexpr#1+1` η οποία υπολογίζει την τιμή του `#1+1`. Το αποτέλεσμα αυτού του υπολογισμού επεξεργάζεται από την `\number` για να το μετατρέψει σε μια προσωρινή λίστα διακριτικών που περιέχει χαρακτηρικά διακριτικά που αναπαριστούν την τιμή του `#1 + 1`. Αυτή η προσωρινή λίστα διακριτικών, που δημιουργείται από την `\number`, θα διαβαστεί τελικά ως το πρώτο όρισμα σε μια άλλη κλήση της `\foo`. Αντί να αυξάνει έναν μετρητή βρόχου (μέσω `\advance` και εκχώρηση), η χρήση της `\numexpr` δημιουργεί μια νέα τιμή, αλλά χωρίς να είναι απαραίτητη η εκχώρηση. Μέσω αυτού του μηχανισμού, η μεταβλητή που ελέγχει τον βρόχο (`\foo`παράμετρος της `#1`) αυξάνεται και η επανάληψη μέσω του βρόχου ελέγχεται και τερματίζεται: αρκετά ευφυές!

Στη συνέχεια, `\expandafter<sub>3</sub>` επεξεργάζεται, δίνοντας:

* $$\mathrm{T^3\_1} =$$`}<sub>διακριτικό</sub>` το οποίο αποθηκεύεται για μελλοντική *επανεισαγωγή* πίσω στην είσοδο
* $$\mathrm{T^3\_2} =$$`\expandafter<sub>4 (διακριτικό)</sub>`, το οποίο επεκτείνεται:

Για `\expandafter<sub>4</sub>` έχουμε:

* $$\mathrm{T^4\_1} =$$`{<sub>διακριτικό</sub>` το οποίο αποθηκεύεται για μελλοντική *επανεισαγωγή* πίσω στην είσοδο
* $$\mathrm{T^4\_2} =$$`\number<sub>διακριτικό</sub>` το οποίο επεκτείνεται και μετατρέπει `#2` σε άλλη προσωρινή λίστα διακριτικών.

Τέλος,`\expandafter<sub>5</sub>` επεκτείνεται:

* $$\mathrm{T^5\_1} =$$`}<sub>διακριτικό</sub>` το οποίο αποθηκεύεται για μελλοντική *επανεισαγωγή* πίσω στην είσοδο
* $$\mathrm{T^5\_2} =$$`\fi<sub>διακριτικό</sub>`, η οποία είναι μια επεκτάσιμη εντολή.

  Η επέκταση της `\fi` ουσιαστικά τερματίζει το `\ifnum` και, στην ουσία, κλείνει αυτή την επανάληψη της μακροεντολής. Το TeX τώρα ολοκληρώνει την επανεισαγωγή όλων των διακριτικών που είχαν προσωρινά αποθηκευτεί από τις πολλαπλές `\expandafter` εντολές: αυτό δημιουργεί μια σειρά από λίστες διακριτικών ενός διακριτικού που προκύπτουν από τα διακριτικά που αποθηκεύτηκαν από κάθε `\expandafter`. Επιπλέον, το TeX έχει επίσης δημιουργήσει λίστες διακριτικών μέσω της δράσης του `\number`.

### Συναρμολόγηση των λιστών διακριτικών

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

```
    \expandafter1\foo\expandafter2
```

μέσω της οποίας `\foo` φροντίζει να καλέσει ξανά τον εαυτό της αλλά με διαφορετικά ορίσματα που αποθηκεύονται σε λίστες διακριτικών κατασκευασμένες από `\number`. Για να κάνουν αυτές οι λίστες διακριτικών να συμπεριφέρονται συλλογικά ως κλήση μακροεντολής, οι αγκύλες `{` και `}` έχουν όλες αποθηκευτεί και επανεισαχθεί στην είσοδο (ως λίστες ενός διακριτικού) με τις ενέργειες των `\expandafter` εντολών.

![λίστες διακριτικών που δημιουργούνται από τη μακροεντολή \foo](/files/81aa1cb650531fe56fec653a8eb226bc9f6f52f1)

&#x20;[Μέρος 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/17-how-does-expandafter-work-a-detailed-macro-case-study.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.
