> 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/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md).

# Πώς λειτουργεί το \expandafter: Μια λεπτομερής μελέτη διαδοχικών εντολών \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\expandafter\expandafter...

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

```
\expandafter\expandafter\expandafter...
```

Για να βοηθήσουμε την εξήγησή μας, θα προσθέσουμε δείκτες σε κάθε `\expandafter`—για να υποδείξουμε σε ποιο αναφερόμαστε:

```
        \expandafter1\expandafter2\expandafter3...
```

Επιπλέον, θα επεκτείνουμε τη σημειογραφία για τα tokens που επεξεργάζεται κάθε `\expandafter` ώστε να χρησιμοποιούμε $$\mathrm{T^i\_1}$$ και $$\mathrm{T^i\_2}$$ που αναπαριστά τα tokens $$\mathrm{T\_1}$$ και $$\mathrm{T\_2}$$ που διαβάζονται από `\expandafter` με δείκτη `i`: `\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. Θα υποθέσουμε επίσης ότι δύο tokens $$\mathrm{T\_X}$$ και $$\mathrm{T\_Y}$$ ακολουθούν μετά το `\expandafter<sub>3</sub>` ώστε η είσοδός μας να μοιάζει ως εξής: `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

Όταν το TeX αρχίζει να επεξεργάζεται αυτή την είσοδο, για το `\expandafter<sub>1</sub>` θα δει

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

Αν ανατρέξουμε στην προηγούμενη συζήτησή μας για τον [κώδικα μέσα στο TeX](/latex/el/se-vathos-arthra/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) ο οποίος υλοποιεί `\expandafter`, είναι με την επέκταση του `\expandafter<sub>3</sub>` που βλέπουμε να λαμβάνει χώρα η αναδρομή. Για να επεξεργαστεί `\expandafter<sub>1</sub>` το TeX έχει ήδη καλέσει την εσωτερική του συνάρτηση `expand()`, οπότε για να επεξεργαστεί (να επεκτείνει) `\expandafter<sub>3</sub>` το TeX κάνει μια *δεύτερη* κλήση στη `expand()`—από μέσα από τη `expand()` ίδια τη συνάρτηση.

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

* $$\mathrm{T^3\_1 = T\_X}$$, το οποίο αποθηκεύεται για μεταγενέστερη *επανεισαγωγή* πίσω στην είσοδο
* $$\mathrm{T^3\_2 = T\_Y}$$, το οποίο θα υποθέσουμε ότι είναι επεκτάσιμο

Ας υποθέσουμε περαιτέρω ότι η επέκταση του $$\mathrm{T\_Y}$$ δίνει την ακόλουθη ακολουθία tokens: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Έχουμε πλέον φτάσει στο τέλος της διαδικασίας επέκτασης που ξεκίνησε από την ακολουθία εντολών `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ και το TeX προχωρά στο να «ξετυλίξει» τη διαδικασία της αναδρομής που ξεκίνησε με το `\expandafter<sub>1</sub>`.

Μετά την επεξεργασία του `\expandafter<sub>3</sub>` το TeX έχει, στη μνήμη του, μια λίστα tokens που περιέχει tokens από την επέκταση του $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Το TeX τώρα αρχίζει να επανεισάγει τα tokens που αποθήκευσε κατά την επεξεργασία του `\expandafter` εντολών:

1. Το TeX αρχίζει επανεισάγοντας το token $$\mathrm{T\_X}$$ που αποθηκεύτηκε από το `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ επανεισάγεται *μπροστά από* την επέκταση του $$\mathrm{T\_Y}$$, κάτι που καταλήγει σε μια ακολουθία token: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. Ωστόσο, χρειάζεται ακόμη να ολοκληρώσουμε τη διαδικασία που ξεκίνησε από το `\expandafter<sub>1</sub>` το οποίο αποθήκευσε το token που αναπαριστά `\expandafter<sub>2</sub>`
3. Η τελική ακολουθία tokens που συνέθεσε το TeX, έτοιμη για ανάγνωση στο επόμενο στάδιο της επεξεργασίας του TeX είναι `\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. Το TeX έχει πλέον ολοκληρώσει τον «πρώτο γύρο» επεξεργασίας και περνά στην ανάγνωση της ακολουθίας από λίστες tokens που έχει δημιουργήσει—αυτή η ακολουθία αρχίζει με το `\expandafter<sub>2 (token)</sub>` το οποίο το TeX προχωρά να επεξεργαστεί. Για το `\expandafter<sub>2</sub>` έχουμε
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ το οποίο αποθηκεύεται για μεταγενέστερη *επανεισαγωγή* πίσω στην είσοδο
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ το οποίο είναι το πρώτο token που προκύπτει από την επέκταση του $$\mathrm{T\_Y}$$; αν είναι επεκτάσιμο, επεκτείνεται
5. Αν υποθέσουμε ότι το token $$\mathrm{T^1\_Y}$$το πρώτο token από την επέκταση του $$\mathrm{T\_Y}$$, επεκτείνεται σε $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ τότε, αφού το TeX έχει επανεισάγει $$\mathrm{T\_X}$$, η προκύπτουσα ακολουθία token που θα επανεπεξεργαζόταν το TeX θα ήταν: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   που μπορούμε να διατυπώσουμε ξανά ως

   $$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

Το ακόλουθο διάγραμμα απεικονίζει τις λίστες token που δημιουργούνται από τον κώδικα TeX

```
    \expandafter1\expandafter2\expandafter3TXTY
```

![Εικόνα που δείχνει το TeX να επεξεργάζεται πολλαπλές εντολές \expandafter](/files/ec75e79f2377aa9cdef20be3dae01baa7ae5f6b9)

### Θεωρία στην πράξη

Ως παράδειγμα, θα ορίσουμε τις ακόλουθες μακροεντολές ώστε να χρησιμεύσουν ως $$\mathrm{T\_X}$$ και $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` όπου ορίζουμε `\foo` ως `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` όπου πρώτα ορίζουμε `\def\abc{Γεια}`, `\def\xyz{, Κόσμε!}` και στη συνέχεια `\def\bar{\abc\xyz}`

Θα χρησιμοποιήσουμε το ακόλουθο τμήμα κώδικα για να δείξουμε την προηγούμενη ανάλυσή μας:

\expandafter\expandafter\expandafter\foo\bar

Από τη συζήτησή μας, το αποτέλεσμα του `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ παράγει μια ακολουθία tokens της μορφής:

$$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

όπου η ακριβής ακολουθία εξαρτάται από τη φύση του token $$\mathrm{T\_Y}$$. Αν εισαγάγουμε τις εντολές του παραδείγματός μας χρησιμοποιώντας $$\mathrm{T\_X}=$$`\foo` και $$\mathrm{T\_Y}=$$`\bar`, το οποίο ορίζεται ως `\def\bar{\abc\xyz}`, βλέπουμε:

* το πρώτο token στο $$\mathrm{T\_Y}$$ είναι `\abc` και η επέκτασή του είναι μια ακολουθία από χαρακτήρες tokens: `Γεια`
* τα υπόλοιπα tokens στο $$\mathrm{T\_Y}$$ είναι το μοναδικό token που αναπαριστά `\xyz`.

Αν ενσωματώσουμε αυτή την πληροφορία στην «ανάλυσή» μας, παίρνουμε

$$\begin{align\*} &\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}\ &=\text{foo}*{\text{token}}\text{\<expansion of \abc>}*\text{token list (characters)}\text{xyx}*\text{token}\ &=\text{foo}*\text{token}\text{Hello}*\text{token list (characters)}\text{xyx}*\text{token}\\\[10pt] \end{align\*}$$

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

Όταν το TeX επεξεργάζεται την ακολουθία λίστας token που παράγεται από τις `\expandafter` εντολές μας, θα στοιχειοθετήσει `**Γ**εια, Κόσμε!`—μόνο `H` στοιχειοθετείται με έντονα. Θα μπορούσαμε να πετύχουμε το ίδιο αποτέλεσμα γράφοντας τον αντίστοιχο κώδικα TeX `\foo Γεια\xyz`. Παρατηρήστε ότι ο ορισμός του `\foo` χρησιμοποιούσε μία μόνο παράμετρο· κατά συνέπεια, `\foo` απορροφά το μοναδικό `H` token χαρακτήρα για το επιχείρημά του, αφήνοντας τα υπόλοιπα χαρακτηρικά tokens (`εια`) ανέπαφα.

**Σημειώσεις:**

* η γραφή `\foo\bar` παράγει πολύ διαφορετικό αποτέλεσμα: το token για το `\bar` θα χρησιμοποιούνταν ως όρισμα για το `\foo` με αποτέλεσμα να στοιχειοθετείται **`Γεια, Κόσμε`**—όλα στοιχειοθετούνται με έντονα.
* η γραφή `\expandafter\foo\bar` προκαλεί το `\bar` να επεκταθεί, κάτι που παράγει δύο tokens: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Έπειτα, αφού το $$\text{foo}*\text{token}$$ επανεισαχθεί από το `\expandafter` το TeX επεξεργάζεται την ακολουθία token $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ η οποία στοιχειοθετεί `**Γεια**, Κόσμε`—μόνο **`Γεια`** στοιχειοθετείται με έντονα. Εδώ, το μοναδικό token $$\text{abc}*\text{token}$$ επεξεργάζεται ως όρισμα για το token της μακροεντολής $$\text{foo}*\text{token}$$, αφήνοντας το token $$\text{xyz}\_\text{token}$$ ανέπαφο και το περιεχόμενό του στοιχειοθετημένο με την τρέχουσα γραμματοσειρά.

## Σημείωση για το \expandafter και μακροεντολές με ορίσματα

Όταν χρησιμοποιείτε `\expandafter` Για να εξαναγκάσουμε την επέκταση των μακροεντολών, αξίζει να ξέρουμε πώς λειτουργεί η επέκταση μακροεντολών—ιδίως για μακροεντολές που δέχονται ορίσματα. Πριν το TeX μπορέσει να εκτελέσει μια μακροεντολή—δηλαδή να διαβάσει και να επεξεργαστεί tokens που περιέχονται στον ορισμό της μακροεντολής—το TeX χρειάζεται να «ετοιμάσει» τη μακροεντολή για εκτέλεση εκτελώντας την αρχική διαδικασία επέκτασης της μακροεντολής. Αν ο ορισμός μιας μακροεντολής περιλαμβάνει τη χρήση παραμέτρων (`#1`, `#2`, ... `#9`), μέρος της διαδικασίας επέκτασης της μακροεντολής απαιτεί από το TeX να σαρώσει την είσοδο αναζητώντας tokens που αποτελούν το/τα όρισμα/τα που παρέχει ο χρήστης: αυτά τα tokens των ορισμάτων απορροφώνται (αφαιρούνται) από την είσοδο. Κατά την επέκταση της μακροεντολής το TeX διαβάζει και απορροφά tokens από την είσοδο για να δημιουργήσει μικρές λίστες token, μία λίστα για κάθε όρισμα· αυτές οι λίστες token στη συνέχεια θα εισαχθούν στην κατάλληλη θέση μέσα στο σώμα της μακροεντολής—όταν το TeX την εκτελέσει. Το τελικό βήμα στην επέκταση της μακροεντολής περιλαμβάνει το TeX να εντοπίσει τον ορισμό της μακροεντολής που είναι αποθηκευμένος στη μνήμη και να οργανώσει ώστε εκείνη η θέση να γίνει η πηγή από την οποία το TeX θα διαβάσει το επόμενο σύνολο tokens εισόδου. Η εκτέλεση της μακροεντολής ξεκινά όταν το TeX αρχίζει να διαβάζει και να επεξεργάζεται αυτά τα tokens, τροφοδοτώντας με τις λίστες token που δημιουργήθηκαν προηγουμένως για την αποθήκευση των ορισμάτων.

### Τα διαχωριστικά tokens επίσης απορροφώνται

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

&#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/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.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.
