> 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/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md).

# Πώς λειτουργεί το \expandafter: Από τις βασικές αρχές έως την εξερεύνηση του πηγαίου κώδικα του 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)

## Εισαγωγή

Έχουμε πλέον καλύψει τα βασικά θέματα που είναι απαραίτητα για μια πλήρη εξέταση του `\expandafter`:

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

Σε αυτό το άρθρο θα συνδυάσουμε αυτά τα θέματα/έννοιες για να εξηγήσουμε τους μηχανισμούς που διέπουν την `\expandafter` εντολή: με λίγα λόγια, πώς λειτουργεί.

## Και έτσι, στο \expandafter

Η ιδέα πίσω από το `\expandafter` είναι να επιβληθεί η επέκταση μιας εντολής (token) πριν το έκανε κανονικά το TeX. Δεδομένων δύο tokens, $$\mathrm{T\_1}$$ και $$\mathrm{T\_2}$$ η ενέργεια του `\expandafter` $$\mathrm{T\_1T\_2}$$ έχει ως αποτέλεσμα το TeX να επεξεργάζεται $$\mathrm{T\_1}\text{<}$$την επέκταση του $$\mathrm{T\_2}\text{>}$$, όπου $$\text{<}\dots\text{>}$$ δηλώνει μια λίστα token. Το TeX επεκτείνει $$\mathrm{T\_2}$$ εκ των προτέρων, έτσι ώστε το token $$\mathrm{T\_1}$$ (π.χ. μια πρωταρχική εντολή ή μια macro) να βλέπει, ή να μπορεί να ενεργήσει πάνω στα tokens που προκύπτουν από την επέκταση του $$\mathrm{T\_2}$$. Αν το token $$\mathrm{T\_2}$$ αντιπροσωπεύει ένα μη επεκτάσιμο στοιχείο, όπως έναν μη ενεργό χαρακτήρα ή (τις περισσότερες) πρωταρχικές εντολές, η ενέργεια του `\expandafter` δεν αλλάζει τίποτα: το TeX θα συνέχιζε να επεξεργάζεται tokens $$\mathrm{T\_1T\_2}$$ με τον κανονικό τρόπο.

### Εισαγωγή στη χρήση του \expandafter

Αν δεν έχετε χρησιμοποιήσει `\expandafter`, εδώ είναι ένα παράδειγμα χρήσης του με την πρωταρχική εντολή `\uppercase{...}`. Ας υποθέσουμε ότι θέλαμε να στοιχειοθετήσουμε το όνομα του κύριου `.tex` αρχείου εισόδου μας αλλά με κεφαλαία γράμματα. Ίσως να γνωρίζουμε τις ακόλουθες πρωταρχικές εντολές του TeX:

* `\uppercase`: κάνει αυτό που υποδηλώνει το όνομά της, μετατρέπει character tokens στο αντίστοιχο σε κεφαλαία (όπου υπάρχει αυτό);
* `\jobname`: όπως έχουμε δει, επεκτείνεται για να δώσει το όνομα του κύριου `.tex` αρχείο.

Αν το αρχείο TeX μας ονομάζεται `mycode.tex` θα περιμέναμε εύλογα `\uppercase{\jobname}` να στοιχειοθετήσει `MYCODE`. Αλλά όχι, στοιχειοθετεί `mycode` ως πεζά. Τι πήγε «λάθος»;

Αν γράψουμε τη γενική χρήση του `\uppercase` ως

```
\uppercase{<token list>}
```

μπορούμε να πούμε ότι το `\uppercase` κοιτάζει μέσα από `<token list>` και θα ενεργήσει μόνο (θα αλλάξει πεζά/κεφαλαία) πάνω σε *tokens χαρακτήρων* που εντοπίζει μέσα στη `<token list>`: όλα τα μη-χαρακτηρικά tokens είναι *αγνοούνται* επειδή `\uppercase` δεν θα «κοιτάξει μέσα» (δεν θα επεκτείνει) μη-χαρακτηρικά tokens για να δει τι περιέχουν ή τι αντιπροσωπεύουν. Επειδή ένα token είναι απλώς μια ακέραια τιμή, το μόνο που `\uppercase` πρέπει να κάνει είναι να κοιτάξει τη λίστα token για να ελέγξει αν η αριθμητική τιμή κάθε token στη `<token list>` βρίσκεται μέσα στο εύρος τιμών που υποδηλώνουν ένα character token. Παρεμπιπτόντως, `\uppercase` θα επίσης *αλλάζει την πεζοκεφαλαιότητα των ενεργών χαρακτήρων* για να δημιουργήσει έναν ενεργό χαρακτήρα σε κεφαλαία, ο οποίος, επειδή παραμένει ενεργός, θα πρέπει επίσης να έχει οριστεί, αλλιώς το TeX θα παράγει σφάλμα: `Απροσδιόριστη ακολουθία ελέγχου`, αλλά παρεκκλίνουμε...

Για παράδειγμα, ακόμη κι αν ορίσουμε μια macro που είναι απλώς κείμενο

```
\def\foo{some lower-case text}
```

τότε `\uppercase{\foo}` εξακολουθεί να στοιχειοθετεί `κάποιο κείμενο με πεζά γράμματα` και όχι `ΚΑΠΟΙΟ ΚΕΙΜΕΝΟ ΜΕ ΠΕΖΑ ΓΡΑΜΜΑΤΑ` όπως θα ελπίζαμε, απλώς επειδή η ενέργεια του `\uppercase` δεν προσπαθεί να προσδιορίσει τι `\foo` αντιπροσωπεύει: το βλέπει `\foo` ως token εντολής και το αγνοεί, όπως έκανε και με το `\jobname`.

### Πώς μπορούμε να το διορθώσουμε αυτό; Το \expandafter έρχεται να μας σώσει

Για να στοιχειοθετήσουμε μια εκδοχή του ονόματος του αρχείου σε κεφαλαία, πρέπει να τροποποιήσουμε `\uppercase{\jobname}` αναγκάζοντας το TeX να αντικαταστήσει `\jobname` με την επέκτασή του (μια ακολουθία character tokens) *πριν* `\uppercase` αρχίσει να λειτουργεί. Για άλλη μια φορά, η επέκταση χρησιμοποιείται για να αφαιρεθεί το `\jobname` token (εντολή) και να αντικατασταθεί με το αποτέλεσμα της επέκτασής του (μια λίστα token που περιέχει character tokens). Έτσι, αν γράψουμε

```
\uppercase\expandafter{\jobname}
```

τότε λειτουργεί: `MYCODE` θα στοιχειοθετούνταν. Αυτό που συμβαίνει είναι ότι το TeX αρχίζει να επεξεργάζεται `\uppercase` και αμέσως ελέγχει για τον υποχρεωτικό χαρακτήρα της ανοιχτής αγκύλης ({`{`); ωστόσο, το TeX ανιχνεύει μια `\expandafter` εντολή η οποία το κάνει να «αποσπάσει προσωρινά την προσοχή του» στην επεξεργασία του `\expandafter{\jobname}`.

Αν συγκρίνουμε

`\expandafter` $$\mathrm{T\_1T\_2}$$

με το παράδειγμά μας

`\expandafter{\jobname}`

μπορούμε να δούμε

* $$\mathrm{T\_1} =\space$$`{`<sub>token</sub>
* $$\mathrm{T\_2} =\space$$`\jobname`<sub>token</sub>

Όπου `{`<sub>token</sub> και `\jobname`<sub>token</sub> αναφέρονται στις τιμές των token που υπολογίζονται από το TeX—η υπογεγραμμένη σημειογραφία <sub>token</sub> χρησιμοποιείται για να μας υπενθυμίζει ότι το TeX λειτουργεί στον κόσμο των ακέραιων token.

Η γραφή `\uppercase\expandafter{\jobname}` λειτουργεί επειδή, σε γενικές γραμμές (οι λεπτομέρειες ακολουθούν), `\expandafter` προκαλεί το TeX να εκτελέσει τα ακόλουθα βήματα:

1. να διαβάσει και να αποθηκεύσει το ανοιχτό `{`<sub>token</sub>;
2. να διαβάσει το επόμενο token: `\jobname`<sub>token</sub>. Το TeX αναγνωρίζει ότι `\jobname`<sub>token</sub> αντιπροσωπεύει μια επεκτάσιμη εντολή και την επεκτείνει. `\jobname`<sub>token</sub> αντικαθίσταται με την επέκτασή του—μια σειρά character tokens;
3. αφού επεκτείνει το `\jobname` εντολή, το TeX βάζει το `{`$$\_\mathrm{token}$$ «πίσω στην είσοδο» και χρησιμοποιεί τη λίστα token που προκύπτει από την επέκταση του `\jobname` ώστε το TeX να διαβάσει `\uppercase{`<sub>token</sub>`<expansion of \jobname>`<sub>λίστα token (χαρακτήρες)</sub>`}`, και αυτό παράγει το επιθυμητό αποτέλεσμα.

Το παρακάτω διάγραμμα δείχνει πώς το TeX επεξεργάζεται `\uppercase\expandafter{\jobname}`—διαβάστε το σχήμα από κάτω προς τα πάνω για να ακολουθήσετε τη ροή της διαδικασίας.

![Πώς λειτουργεί το \expandafter](/files/4fb5c94b87c44968489d9c5142c11d279220ecb7)

Οι ακόλουθες σημειώσεις εξηγούν τα διάφορα στάδια επεξεργασίας.

1. Το TeX αρχίζει να επεξεργάζεται `\uppercase` και ελέγχει για τον υποχρεωτικό χαρακτήρα της ανοιχτής αγκύλης ({`{`) αλλά ανιχνεύει μια `\expandafter` εντολή.
2. Αν συγκρίνουμε `\expandafter` $$\mathrm{T\_1T\_2}$$ στην είσοδό μας από `\expandafter{\jobname}` μπορούμε να δούμε $$\mathrm{T\_1} =$$`{`<sub>token</sub> και $$\mathrm{T\_2} =$$`\jobname`<sub>token</sub>. Σημειώστε ότι εδώ θα χρησιμοποιήσουμε το υπογεγραμμένο <sub>token</sub> για να δηλώσουμε ότι το TeX επεξεργάζεται ακέραιες τιμές token.
3. `\expandafter` διαβάζει και στη συνέχεια αποθηκεύει προσωρινά το `{`<sub>token</sub> αποθηκεύοντάς το ως ακέραια τιμή token σε μια εσωτερική μεταβλητή. Αργότερα, το TeX θα επανεισάγει εκείνο το token πίσω στην είσοδο, αφού επεξεργαστεί το `\jobname` εντολή.
4. `\expandafter` διαβάζει το επόμενο token, `\jobname`<sub>token</sub>, και επεκτείνει το `\jobname` εντολή.
5. Η επέκταση του `\jobname` δημιουργεί μια προσωρινή λίστα token που περιέχει μια ακολουθία character tokens που αντιπροσωπεύουν το `.tex` όνομα του αρχείου. Σημειώστε ότι όλα τα character tokens που παράγονται από το `\jobname` υπολογίζονται με χρήση κατηγορικού κώδικα 12.
6. Μόλις `\jobname` έχει επεκταθεί, το TeX επανεισάγει το token που αποθηκεύτηκε στο βήμα 3 (`{`<sub>token</sub>) και το βάζει ξανά στην είσοδο. Το TeX το κάνει δημιουργώντας μια άλλη λίστα token που περιέχει το *μοναδικό* `{`<sub>token</sub>
7. Το TeX έχει πλέον ολοκληρώσει την επεξεργασία του `\expandafter`, με αποτέλεσμα να υπάρχουν δύο λίστες token έτοιμες να χρησιμοποιηθούν ως πηγές εισόδου του TeX. Το TeX τώρα επιστρέφει στην επεξεργασία του `\uppercase` αλλά έχει ρυθμίσει την είσοδό του έτσι ώστε οι δύο λίστες token που δημιουργήθηκαν από το `\expandafter` να γίνουν η πηγή των token για το `\uppercase`—το οποίο τώρα βλέπει `\uppercase{`<sub>token</sub>`<expansion of \jobname>`<sub>λίστα token (χαρακτήρες)</sub>`}`. `\uppercase` βλέπει πλέον μια ακολουθία character tokens και μπορεί να παράγει το επιθυμητό αποτέλεσμα.
8. Αφού διαβάσει όλα τα character tokens που παράγονται από το `\jobname`, το TeX επιστρέφει στη λήψη token από την προηγούμενη πηγή εισόδου του (το `.tex` αρχείο μας) από όπου θα διαβάσει το επόμενο token: το κλείσιμο `}` που απαιτείται για να τερματιστεί η λίστα token που θα επεξεργαστεί από το `\uppercase`.

### \expandafter και εσωτερικές λίστες token

Οι προσωρινές λίστες token είναι ένα *ζωτικής σημασίας* στοιχείο της `\expandafter`συμπεριφοράς επεξεργασίας: η κατανόηση της χρήσης και της ύπαρξης αυτών των λιστών token μπορεί να βοηθήσει να αποσαφηνιστεί πώς `\expandafter` επιτυγχάνει τα αποτελέσματά του, ιδιαίτερα όταν προσπαθούμε να γράψουμε ή να κατανοήσουμε macros που χρησιμοποιούν πολλαπλές διαδοχικές `\expandafter` εντολές για να επιτύχουν πιο σύνθετες μορφές επεξεργασίας token: `\expandafter\expandafter\expandafter...`

Ένα άλλο βασικό στοιχείο της `\expandafter`συμπεριφοράς του, ιδιαίτερα με πολλαπλές διαδοχικές `\expandafter` εντολές, είναι η χρήση της *αναδρομής* (μέσα στο ίδιο το λογισμικό TeX)—ένα θέμα που θα εξετάσουμε αργότερα σε αυτό το άρθρο.

Για να ενισχύσουμε περαιτέρω την κατανόησή μας για τις προσωρινές λίστες token, θα δούμε ένα ακόμη παράδειγμα του `\expandafter`, αυτή τη φορά με το `\the` εντολή.

#### \expandafter και εσωτερικές λίστες token: παράδειγμα 2

Σε αυτό το παράδειγμα θα δούμε πώς `\expandafter` μπορεί να χρησιμοποιηθεί για να επηρεάσει tokens που αποθηκεύονται σε ένα register token μέσω της `\toks` εντολής. Ακολουθούν οι πρωταρχικές εντολές του TeX που θα χρησιμοποιήσουμε:

* `**\count** *register*=*number*`: μια πρωταρχική εντολή του TeX που χρησιμοποιείται για να αποθηκεύει την τιμή `*number*` στη θέση του TeX `*register*`;
* `**\toks** *register*={*token list*}`: μια πρωταρχική εντολή του TeX που χρησιμοποιείται για να αποθηκεύει `*token list*` στη θέση του token register `*register*`—αποθηκεύοντας μια ακολουθία tokens για μελλοντική χρήση;
* `**\the** *token*`: μια επεκτάσιμη πρωταρχική εντολή του TeX που επεξεργάζεται `*token*`, αν και τα ακριβή αποτελέσματα εξαρτώνται από τη φύση του `*token*` που επεξεργάζεται. `\the` έχει πολλές χρήσεις: ανάμεσά τους είναι η στοιχειοθέτηση της τιμής που είναι αποθηκευμένη σε μια παράμετρο ή μεταβλητή του TeX (π.χ. ένα register). Άλλες χρήσεις του `\the` περιλαμβάνουν την εισαγωγή ενός αντιγράφου των tokens που είναι αποθηκευμένα σε ένα token register. Εδώ, θα χρησιμοποιήσουμε `\the` για να στοιχειοθετήσουμε την τιμή που είναι αποθηκευμένη σε ένα `\count` register.

Θα ξεκινήσουμε με τον ακόλουθο κώδικα TeX για να αποθηκεύσουμε την τιμή `12345` στο `\count` register `99`:

```
\count99=12345
```

Αν θέλουμε να στοιχειοθετήσουμε την τιμή που είναι αποθηκευμένη στο `\count99` μπορούμε να χρησιμοποιήσουμε `\the\count99` (ή `\number\count99`).

Στη συνέχεια θα χρησιμοποιήσουμε την `\toks` εντολή για να αποθηκεύσουμε κάποια tokens στο token register `99`:

```
\toks99={\the\count99 }
```

Η λίστα των tokens που είναι αποθηκευμένα στο token register `99` θα περιείχε τα ακόλουθα:

|                        |                                                                                                                             |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **Τιμή token του TeX** | **Αντιπροσωπευόμενο στοιχείο**                                                                                              |
| 5382                   | `\the`                                                                                                                      |
| 7885                   | `\count`                                                                                                                    |
| 3129                   | `9` (κωδικός χαρακτήρα 57 με κατηγορικό κώδικα 12), με αποτέλεσμα μια τιμή token ίση με $$256 \times 12 + 57 = 3129$$       |
| 3129                   | `9` (κωδικός χαρακτήρα 57 με κατηγορικό κώδικα 12), με αποτέλεσμα μια τιμή token ίση με $$256 \times 12 + 57 = 3129$$       |
| 2592                   | `<space>` (κωδικός χαρακτήρα 32 με κατηγορικό κώδικα 10), με αποτέλεσμα μια τιμή token ίση με $$256 \times 10 + 32 = 2592$$ |

Σημειώστε ότι η λίστα token που δημιουργείται από το `\toks99` δεν *όχι* περιέχει την πραγματική τιμή δεδομένων που είναι αποθηκευμένη στο `\count99` επειδή η `\toks` εντολή δεν εκτελεί επέκταση: απλώς δημιουργεί tokens και τα αποθηκεύει. Στο παράδειγμά μας, `\the` δεν επεκτείνεται, οπότε δεν επεξεργάζεται το `\count99`; εδώ `\the` απλώς μετατρέπεται σε token (τιμή 5382) και αποθηκεύεται στη λίστα token.

Αν θέλουμε η `\toks99` λίστα token να περιέχει tokens που αντιπροσωπεύουν δεδομένα αποθηκευμένα στο `\count99` θα χρειαστούμε κάποιον τρόπο να δημιουργήσουμε αυτά τα tokens (να τα καταστήσουμε διαθέσιμα) ώστε η `\toks` εντολή να μπορεί να έχει πρόσβαση σε αυτά. Και φυσικά το `\expandafter` μπορεί να το κάνει αυτό για εμάς. Αν γράψουμε:

```
        \toks99=\expandafter{\the\count99 }
```

η ενέργεια/επεξεργασία της `\toks` εντολής θα «τεθεί σε αναμονή» ενώ το `\expandafter` προκαλεί (επιβάλλει) την επέκταση του `\the` το οποίο, με τη σειρά του, ενεργεί πάνω στο `\count` για να δημιουργήσει μια προσωρινή λίστα token που περιέχει character tokens που αντιπροσωπεύουν τα δεδομένα που είναι αποθηκευμένα στο `\count99`. Μια μικρή αλλά σημαντική λεπτομέρεια είναι ο `<space>` χαρακτήρας μετά τα ψηφία `99`: αυτός ο `<space>` χαρακτήρας χρησιμεύει για να τερματίζει τη διαδικασία σάρωσης του TeX όταν αναζητά μια αριθμητική ποσότητα.

Εδώ, η ενέργεια του `\expandafter` είναι πολύ παρόμοια με το `\jobname` παράδειγμα.

1. Διαβάστε και αποθηκεύστε το ανοιχτό `{`<sub>token</sub>.
2. Διαβάστε το επόμενο token, `\the`<sub>token</sub>, το οποίο αντιπροσωπεύει μια επεκτάσιμη εντολή, οπότε το TeX το επεκτείνει. `\expandafter` επιβάλλει την επέκταση του `\the` το οποίο στη συνέχεια ενεργεί πάνω στο `\count99` για να μετατρέψει τα δεδομένα που είναι αποθηκευμένα στο `\count` register `99` (ο αριθμός 12345) σε μια προσωρινή λίστα token. Αυτή η λίστα θα περιέχει character tokens που αντιπροσωπεύουν τα ψηφία `1`, `2`, `3`, `4` και `5`—character tokens με κατηγορικό κώδικα 12.
3. Αφού επεκτείνει και επεξεργαστεί το `\the`, το TeX βάζει το `{`<sub>token</sub> «πίσω στην είσοδο» και χρησιμοποιεί τη λίστα token που προκύπτει από το `\the\count99` ώστε το TeX να διαβάσει `\toks99={`<sub>token</sub>`<expansion of \the\count99>`<sub>λίστα token (χαρακτήρες)</sub>`}` και αυτό παράγει το επιθυμητό αποτέλεσμα.

Η ακολουθία αυτών των γεγονότων συνοψίζεται στο ακόλουθο διάγραμμα—διαβάστε το σχήμα από κάτω προς τα πάνω για να ακολουθήσετε τη ροή της διαδικασίας.

![Πώς λειτουργεί το \expandafter](/files/95611defbeb99a44f739206a20f66090f8787742)

1. Το TeX αρχίζει να επεξεργάζεται `\toks`; βλέπει το προαιρετικό `=` σύμβολο, έπειτα ελέγχει για τον υποχρεωτικό χαρακτήρα της ανοιχτής αγκύλης ({`{`, ή οποιονδήποτε χαρακτήρα με κατηγορικό κώδικα 1) που χρησιμοποιείται για να δηλώσει την αρχή μιας λίστας token. Ωστόσο, το TeX ανιχνεύει μια `\expandafter` εντολή και προχωρά να εκτελέσει αυτήν αντί γι’ αυτό.
2. Αν συγκρίνουμε `\expandafter` $$\mathrm{T\_1T\_2}$$ στην είσοδό μας από `\expandafter{\the\count99 }` μπορούμε να δούμε $$\mathrm{T\_1} =$$ `{`<sub>token</sub> και $$\mathrm{T\_2} =$$ `\the<sub>token</sub>`.
3. `\expandafter` διαβάζει και στη συνέχεια αποθηκεύει προσωρινά το `{`<sub>token</sub> (Το TeX αποθηκεύει προσωρινά εκείνη την ακέραια τιμή token σε μια εσωτερική μεταβλητή). Αργότερα, το TeX θα επανεισάγει εκείνο το token πίσω στην είσοδο, αφού επεξεργαστεί το `\the`
4. `\expandafter` διαβάζει το επόμενο token, `\the`<sub>token</sub> και το επεκτείνει.
5. Η επέκταση του `\the` δημιουργεί μια προσωρινή λίστα token από την επεξεργασία του `\count99`—αυτή η λίστα token περιέχει μια ακολουθία character tokens που αντιπροσωπεύουν την τιμή δεδομένων που είναι αποθηκευμένη στο `\count` register `99`.
6. Μόλις `\the` έχει επεκταθεί, το TeX επανεισάγει το token που αποθηκεύτηκε στο βήμα 3 (`{`<sub>token</sub>) και βάζει ξανά εκείνο το token στην είσοδο. Το TeX το κάνει αυτό δημιουργώντας μια άλλη λίστα token που περιέχει το *μοναδικό* token `{`<sub>token</sub>.
7. Το TeX έχει πλέον ολοκληρώσει την επεξεργασία του `\expandafter` και παρήγαγε δύο λίστες token έτοιμες να χρησιμοποιηθούν ως οι επόμενες πηγές εισόδου. Το TeX επιστρέφει στην επεξεργασία του `\toks99=` αλλά τώρα το TeX έχει ρυθμίσει την είσοδό του έτσι ώστε οι δύο λίστες token που δημιουργήθηκαν από το `\expandafter` να γίνουν η πηγή των token για το `\toks`—το οποίο τώρα βλέπει `{`<sub>token</sub>`<expansion of \the\count99>`<sub>λίστα token (χαρακτήρες)</sub>`}`. `\toks` μπορούν τώρα να προσπελάσουν και να αποθηκεύσουν την ακολουθία των 5 character tokens που αντιπροσωπεύουν την τιμή δεδομένων (`12345`) που είναι αποθηκευμένη στο `\count99`: το επιθυμητό αποτέλεσμά μας.
8. Αφού διαβάσει όλα τα character tokens που παράγονται από το `\the\count99`, το TeX επιστρέφει στη λήψη token από την προηγούμενη πηγή εισόδου του (το `.tex` αρχείο μας) από όπου θα διαβάσει το επόμενο token: το κλείσιμο `}` που απαιτείται για να τερματιστεί η λίστα token που θα αποθηκευτεί από το `\toks99={...}`.

## Πώς λειτουργεί πραγματικά το \expandafter

Σε αυτή την ενότητα θα ρίξουμε μια «χαμηλού επιπέδου» ματιά μέσα στο ίδιο το TeX: εξερευνώντας τον πηγαίο κώδικα/τις συναρτήσεις μέσα στο TeX που υλοποιούν τη συμπεριφορά του `\expandafter`. Οι λεπτομέρειες εκφράζονται σε ψευδο-C κώδικα αλλά θα πρέπει να είναι κατανοητές σε όποιον είναι εξοικειωμένος με άλλες γλώσσες προγραμματισμού.

Το ακόλουθο σχολιασμένο διάγραμμα εξηγεί πώς το TeX υλοποιεί `\expandafter` ως μέρος μιας μεγαλύτερης συνάρτησης που ονομάζεται `expand()`—τη βασική συνάρτηση που καθοδηγεί την επεξεργασία επέκτασης του TeX. Στην ενότητα που είναι υπεύθυνη για την υλοποίηση του `\expandafter` μπορούμε να δούμε [*αναδρομικής* συμπεριφοράς](https://en.wikipedia.org/wiki/Recursion) όπου μια άλλη κλήση στη `expand()` συνάρτηση χρησιμοποιείται για την επεξεργασία του δεύτερου token που διαβάστηκε, $$\mathrm{T\_2}$$, για εκείνες τις περιπτώσεις όπου $$\mathrm{T\_2}$$ είναι επεκτάσιμο.

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

![Πώς λειτουργεί το \expandafter μέσα στο TeX](/files/cd5c661d751ce0b512931c7ee5dbb55160f6ff08)

Το πρώτο καθήκον του `expand()` είναι να προσδιορίσει αν η εντολή που θα επεκταθεί είναι μια macro ή μια πρωταρχική εντολή, επειδή οι macro έχουν μια εξειδικευμένη διαδικασία επέκτασης που χειρίζεται από μια συνάρτηση που ονομάζεται `macrocall()`.

Αν η εντολή που θα επεκταθεί είναι πρωταρχική εντολή, η `expand()` συνάρτηση χρησιμοποιεί την τρέχουσα τιμή κώδικα εντολής (αποθηκευμένη στη καθολική μεταβλητή `curcmd`) για να προσδιορίσει ποια συγκεκριμένη πρωταρχική εντολή χρειάζεται να επεξεργαστεί. Μπορούμε να δούμε αυτές τις λεπτομέρειες σε μια πιο πλήρη καταγραφή της `expand()`:

```
    void expand(void)
    {
    //curcmd είναι μια global μεταβλητή
    if(curcmd != macro) // curcmd < 111
    {
      switch(curcmd)
      {
        περίπτωση \expandafter: // Επεξεργασία της \expandafter T1T2 εντολής
        {
            gettoken(); // Ανάγνωση του διακριτικού T1
            t = curtok; // Αποθήκευση του διακριτικού T1 στην τοπική μεταβλητή t
            gettoken(); // Ανάγνωση του διακριτικού T2
            if(curcmd > 100) // Είναι το διακριτικό T2 επεκτάσιμο;
                expand();    // Ναι! Το T2 είναι επεκτάσιμο:
                             // εκτέλεση της επέκτασης του T2 με
                             // την πραγματοποίηση μιας αναδρομικής κλήσης συνάρτησης προς το expand()
            else
                backinput(); // Το T2 δεν είναι επεκτάσιμο: βάλτε αυτό το διακριτικό
                             // πίσω στην είσοδο ώστε να διαβαστεί ξανά (αργότερα)

            curtok = t ;  // Επαναφορά της καθολικής μεταβλητής curtok στην αποθηκευμένη τιμή του T1
            backinput() ; // Βάλτε το διακριτικό T1 πίσω στην είσοδο
                          // πριν από τα διακριτικά που προκύπτουν από την επέκταση του T2
        }
        break;

        // Κώδικας για την επεξεργασία άλλων επεκτάσιμων εντολών
        περίπτωση εντολής “μετατροπή σε κείμενο”: // Οποιαδήποτε από τις \number, \string, \romannumeral,
                                        // \meaning, \fontname, \jobname
                                        // Μοιράζονται την ίδια τιμή του curcmd
        break;

        περίπτωση \noexpand: // Καταστολή της επέκτασης του επόμενου διακριτικού
        ...
        break;

        περίπτωση \csname:  // Δημιουργία ονόματος ακολουθίας ελέγχου.
        ...
        break;

        περίπτωση \the: // Εισαγωγή ορισμένων διακριτικών
        ....
        break;

        περίπτωση εντολής “\if... test command”: // Επεξεργασία μίας από τις συνθήκες του TeX:
                                      // \if, \ifcat, \ifnum, \ifdim,\ifodd, \ifvmode,
                                      // \ifhmode, \ifmmode, \ifinner, \ifvoid,
                                      // \ifhbox, \ifvbox, \ifx, \ifeof, \iftrue, \iffalse,
                                      // \ifcase, \ifdefined, \ifcsname, \iffontchar
        ...
        break;

        περίπτωση “\fi or \else”: // Τερματισμός της τρέχουσας συνθήκης
        ...
        break;

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

        }

    }else // Δεν είναι επεκτάσιμη πρωτογενής εντολή: είναι μακροεντολή
        {
             macrocall()
        }
        //... περισσότερος κώδικας αφαιρέθηκε
    }
```

### Η αγάπη του TeX για τις καθολικές μεταβλητές

Ίσως αντανακλώντας την ηλικία του και την εποχή κατά την οποία σχεδιάστηκε, ο πηγαίος κώδικας του TeX κάνει εκτεταμένη χρήση των λεγόμενων [καθολικών μεταβλητών](https://en.wikipedia.org/wiki/Global_variable)—στην πραγματικότητα υπάρχουν εκατοντάδες από αυτές. Από τη φύση τους, οι καθολικές μεταβλητές μπορούν να αλλάξουν/τροποποιηθούν από οπουδήποτε μέσα στον πηγαίο κώδικα του TeX—ο οποίος, για το TeX του Knuth, είναι ένα ενιαίο μονολιθικό αρχείο που περιέχει πάνω από 25.000 γραμμές κώδικα και εκατοντάδες συναρτήσεις. Η κατανόηση του πώς λειτουργεί το TeX δεν είναι πάντα εύκολη υπόθεση...

Για την επεξεργασία `\expandafter`, το TeX διαβάζει διακριτικά από την τρέχουσα είσοδό του χρησιμοποιώντας μια συνάρτηση που ονομάζεται `gettoken()` η δράση της οποίας είναι να δημιουργεί ένα διακριτικό και να ορίζει την τιμή αρκετών βασικών καθολικών μεταβλητών που χρησιμοποιούνται σε ολόκληρο τον πηγαίο κώδικα του TeX. Δύο τέτοιες μεταβλητές, οι οποίες ενημερώνονται από τη δράση της `gettoken()`, χρησιμοποιούνται στην υλοποίηση του `\expandafter`:

* `curtok`: (τρέχον διακριτικό) η ακέραια τιμή του διακριτικού που μόλις διαβάστηκε·
* `curcmd`: (τρέχων κωδικός εντολής) ο κωδικός εντολής της εντολής (ή χαρακτήρα) που αντιπροσωπεύεται από το διακριτικό `curtok`.

Κατά την επεξεργασία `\expandafter`$$\mathrm{T\_1T\_2}$$ Το TeX διαβάζει το διακριτικό $$\mathrm{T\_1}$$ και αποθηκεύει προσωρινά την τιμή του (έναν ακέραιο) σε μια τοπική μεταβλητή που ονομάζεται `t`. Το TeX στη συνέχεια διαβάζει $$\mathrm{T\_2}$$ και ελέγχει αν αυτό το διακριτικό αντιπροσωπεύει μια επεκτάσιμη εντολή—ελέγχοντας αν ο κωδικός εντολής του (`curcmd`) είναι > 100. Αν ναι, το TeX χρειάζεται να επεκτείνει την εντολή που αντιπροσωπεύεται από $$\mathrm{T\_2}$$ και κάνει άλλη μία κλήση στη συνάρτηση `expand()`: αυτό είναι ένα παράδειγμα του *αναδρομής* επειδή η `expand()` η συνάρτηση καλεί τον εαυτό της. Η επίγνωση της αναδρομικής φύσης της επέκτασης, ειδικά όταν χρησιμοποιείται το `\expandafter`, μπορεί να βοηθήσει στην κατανόηση του πώς πολλαπλές διαδοχικές `\expandafter` εντολές—δηλ., `\expandafter\expandafter\expandafter...` επιτυγχάνουν τα αποτελέσματά τους.

Αν το διακριτικό $$\mathrm{T\_2}$$ είναι επεκτάσιμο, η επέκταση λαμβάνει χώρα και όταν η αναδρομική κλήση προς το `expand()` επιστρέψει, κώδικας μέσα στην υλοποίηση του `\expandafter` εισάγει ξανά το διακριτικό $$\mathrm{T\_1}$$ πίσω στην είσοδο. Η καθολική μεταβλητή `curtok` ανατίθεται ξανά στην τιμή του αποθηκευμένου διακριτικού—που είναι αποθηκευμένη στην τοπική μεταβλητή `t`, η οποία είναι η τιμή του διακριτικού $$\mathrm{T\_1}$$—και γίνεται κλήση στη συνάρτηση `backinput().`

#### Η συνάρτηση backinput()

Όπως υποδηλώνει το όνομά της, αυτή η συνάρτηση βάζει ένα διακριτικό «πίσω στην είσοδο». Για να το κάνει αυτό, το TeX χρησιμοποιεί την τρέχουσα τιμή της καθολικής μεταβλητής `curtok` για να δημιουργήσει μια λίστα διακριτικών που περιέχει ένα μόνο διακριτικό (του οποίου η ακέραια τιμή παρέχεται από το `curtok`). Το TeX επίσης ρυθμίζει τον χειρισμό της εισόδου του ώστε να διασφαλίσει ότι αυτή η λίστα ενός διακριτικού θα διαβαστεί εκ νέου, στην κατάλληλη στιγμή, από το TeX ως μέρος της επακόλουθης επεξεργασίας εισόδου του. Σημειώστε προσεκτικά ότι το διακριτικό $$\mathrm{T\_1}$$ εισάγεται ξανά *αφού ολοκληρωθεί η επέκταση*, κάτι που διασφαλίζει ότι το TeX θα διαβάσει εκείνο το επανεισαχθέν διακριτικό *πριν* καθώς διαβάζει τα διακριτικά που προκύπτουν από την επέκταση του $$\mathrm{T\_2}$$.

### Επεξεργασία μακροεντολών: η συνάρτηση macrocall()

Όπως συζητήθηκε προηγουμένως, όλες οι μακροεντολές, μαζί με ορισμένες πρωτογενείς εντολές, είναι επεκτάσιμες και όλη η επεξεργασία επέκτασης περνά από τη `expand()` συνάρτηση. Ωστόσο, `expand()` φροντίζει να χρησιμοποιεί την τιμή `curcmd` (τρέχουσα εντολή) για να διακρίνει μεταξύ επεκτάσιμων πρωτογενών εντολών και μακροεντολών επειδή η διαδικασία επέκτασης μακροεντολών χειρίζεται από μια ειδική συνάρτηση που ονομάζεται `macrocall()`. Οι μακροεντολές χρειάζονται μια εξειδικευμένη διαδικασία επέκτασης επειδή τα ορίσματα μακροεντολών και τα διακριτικά οριοθέτη πρέπει να σαρώνται με πολύ συγκεκριμένο και αυστηρό τρόπο· κατά συνέπεια, αυτή η διαδικασία ανατίθεται σε μια συνάρτηση σχεδιασμένη να το κάνει αυτό: `macrocall()`.

#### Επέκταση μακροεντολής vs. εκτέλεση μακροεντολής

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

#### Επέκταση μακροεντολής

Για να επεκτείνει μια μακροεντολή το TeX πρώτα ελέγχει αν η μακροεντολή δέχεται ορίσματα· αν ναι, `macrocall()` σαρώνει πολύ προσεκτικά την είσοδο αναζητώντας τα διακριτικά που προορίζονται να γίνουν τα ορίσματα της μακροεντολής. Αυτή η διαδικασία περιλαμβάνει τον έλεγχο της εισόδου του χρήστη για τυχόν διακριτικά οριοθέτη που χρησιμοποιούνται στον αρχικό ορισμό της μακροεντολής—το μοτίβο των διακριτικών σε μια κλήση μακροεντολής πρέπει να ταιριάζει ακριβώς με το μοτίβο των διακριτικών που περιέχονται στον αποθηκευμένο ορισμό. Ωστόσο, τα διακριτικά που χρησιμοποιούνται ως οριοθέτες απλώς απορρίπτονται από το TeX: στην ουσία, είναι απλώς μια μορφή «στίξης» που χρησιμοποιεί το TeX για να προσδιορίσει τα πραγματικά διακριτικά που προορίζονται να γίνουν τα ορίσματα της μακροεντολής—δηλ. τα διακριτικά που ο χρήστης προορίζει για επεξεργασία από τη μακροεντολή. Για περισσότερες πληροφορίες σχετικά με τα διακριτικά οριοθέτη, βλέπε [Πώς λειτουργούν πραγματικά οι μακροεντολές TeX](/latex/el/perissotera-themata/22-how-tex-macros-actually-work-part-4.md).

Για κάθε παράμετρο (`#1, #2...#9`) που υπάρχει στον αρχικό ορισμό της μακροεντολής, το TeX σαρώνει την πραγματική κλήση της μακροεντολής για να αναγνωρίσει ποια διακριτικά που παρείχε ο χρήστης προορίζονται για κάθε παράμετρο (δηλ. αποτελούν τα ορίσματα της μακροεντολής). Αυτή η διαδικασία παράγει μία ή περισσότερες μικρές λίστες διακριτικών: μία για κάθε όρισμα μακροεντολής.

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

Για άλλη μια φορά, η επέκταση μιας εντολής μακροεντολής σημαίνει *την αφαίρεση* αυτής της εντολής μακροεντολής (διακριτικού) από την είσοδο και *την αντικατάστασή* της με τη λίστα διακριτικών που είναι αποθηκευμένη ως το κείμενο αντικατάστασης της μακροεντολής.

Για μια εις βάθος ματιά στην επεξεργασία μακροεντολών του TeX, δείτε τη σειρά άρθρων έξι μερών [Πώς λειτουργούν πραγματικά οι μακροεντολές TeX;](/latex/el/perissotera-themata/01-a-six-part-series-how-do-tex-macros-actually-work.md)

[Μέρος 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/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.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.
