> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/el/perissotera-themata/24-how-tex-macros-actually-work-part-6.md).

# Πώς λειτουργούν πραγματικά οι μακροεντολές TeX: Μέρος 6

[Μέρος 1](/latex/el/perissotera-themata/19-how-tex-macros-actually-work-part-1.md) [Μέρος 2](/latex/el/perissotera-themata/20-how-tex-macros-actually-work-part-2.md) [Μέρος 3](/latex/el/perissotera-themata/21-how-tex-macros-actually-work-part-3.md) [Μέρος 4](/latex/el/perissotera-themata/22-how-tex-macros-actually-work-part-4.md) [Μέρος 5](/latex/el/perissotera-themata/23-how-tex-macros-actually-work-part-5.md) [Μέρος 6](/latex/el/perissotera-themata/24-how-tex-macros-actually-work-part-6.md)

## Εισαγωγή και επισκόπηση: Η ιστορία μέχρι τώρα

Στα προηγούμενα 5 μέρη αυτής της σειράς είδαμε:

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

```
<πρωτόγονο μακροεντολής TeX><όνομα μακροεντολής><κείμενο παραμέτρων>{<κείμενο αντικατάστασης>}
```

όπου:

* `<πρωτόγονο μακροεντολής TeX>` = ένα από `\def`, `\edef`, `\gdef` ή `\xdef`;
* `<macro name>`=το όνομα της μακροεντολής σας, όπως `\foo`;
* `<parameter text>` μπορεί να είναι «null» (να μην υπάρχει) ή μπορεί να είναι μια συμβολοσειρά από tokens οριοθέτη και tokens παραμέτρων μακροεντολής·
* `<replacement text>` είναι το πραγματικό σώμα της μακροεντολής σας: το τμήμα που «εκτελείται» (αναπτύσσεται) όταν καλείτε τη μακροεντολή.
* πώς το `<parameter text>` τμήμα μπορεί να περιέχει ένα ευρύ φάσμα tokens και ότι το TeX χρησιμοποιεί αυτό το τμήμα ως «πρότυπο tokens» για να αντιστοιχίσει μια κλήση μακροεντολής με τον αρχικό της ορισμό και να υπολογίσει τα ορίσματα που χρησιμοποιούνται με τη μακροεντολή — και πώς το TeX περιμένει η χρήση μιας μακροεντολής από εσάς να ταιριάζει με τον αρχικό της ορισμό·
* ότι, μέσα στο TeX, ο ορισμός μιας μακροεντολής αποθηκεύεται ως συνεχόμενη ακολουθία tokens που αναπαριστούν το `<parameter text>` και `<replacement text>` τμήματα.

Όταν χρησιμοποιείτε μια εντολή μακροεντολής, το TeX θα ελέγξει πρώτα αν δέχεται παραμέτρους. Αν ναι, τότε το TeX πρέπει να προσδιορίσει τα πραγματικά *ορίσματα* που χρησιμοποιούνται στην κλήση της μακροεντολής σας. Το TeX πρέπει να ελέγξει την κλήση της μακροεντολής σας σε σχέση με τον αποθηκευμένο στη μνήμη ορισμό του «προτύπου tokens». Συγκεκριμένα, το TeX χρησιμοποιεί τον εσωτερικό (αποθηκευμένο) ορισμό του `<parameter text>` τμήματος ως πρότυπο μέσω του οποίου μπορεί να ξεχωρίσει *tokens* που είναι τα πραγματικά ορίσματα, και ποια *tokens* υπάρχουν απλώς για να λειτουργούν ως οριοθέτες.

## Η σημασία της ανάπτυξης μακροεντολών

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

### Αλλά πρώτα, ένα σύντομο παράδειγμα: κάτι παράξενο;

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

#### Τα ορίσματα μετατρέπονται πρώτα σε tokens

Το ακόλουθο παράδειγμα βασίζεται σε ένα που συζητείται στις σελίδες 114–5 του [The Advanced TeXbook](https://www.amazon.co.uk/Advanced-Texbook-David-Salomon/dp/0387945563) γραμμένο από τον David Salomon. Επιλέχθηκε επειδή συμπυκνώνει όμορφα τις κεντρικές ιδέες μέσα σε μια πολύ σύντομη μακροεντολή TeX.

Κατά τις κανονικές λειτουργίες TeX/LaTeX, το `$` σύμβολο έχει κωδικό κατηγορίας 3 («μετατόπιση μαθηματικών»), ο οποίος ενεργοποιεί/απενεργοποιεί το TeX από την ενσωματωμένη μαθηματική λειτουργία (`$...$`) ή από τη λειτουργία μαθηματικών σε εμφανή παράσταση (`$$...$$`)—φυσικά, το LaTeX χρησιμοποιεί `\(..\)` και `\[..\]` για τους ίδιους σκοπούς.

Ας υποθέσουμε ότι θέλουμε μια μακροεντολή που αλλάζει τον κωδικό κατηγορίας ενός `$` συμβόλου, ας πούμε σε 11, ώστε να μπορούμε να το στοιχειοθετήσουμε όπως οποιονδήποτε κανονικό χαρακτήρα. Μπορούμε να χρησιμοποιήσουμε την πρωτόγονη εντολή του TeX `\catcode` και η πρώτη μας προσπάθεια για μια τέτοια μακροεντολή, `\docat`, μπορεί να είναι

```
\def\docat #1{\catcode`\$=11 #1}
```

Ωστόσο, όταν προσπαθούμε να τη χρησιμοποιήσουμε, έτσι

```
\begin{document}
\def\docat #1{\catcode`\$=11 #1}
Πλήρωσα \docat{$90} για αυτό το βιβλίο.
\end{document}
```

περιμένουμε το TeX να στοιχειοθετήσει `Πλήρωσα $90 για αυτό το βιβλίο.` αλλά αποτυγχάνει με ένα μήνυμα σφάλματος:

```
! Έλειπε το $, προστέθηκε.
<εισαχθέν κείμενο>
                $
<θα διαβαστεί ξανά>
                   \par
l.7
```

Από το σφάλμα φαίνεται ότι το `$` που χρησιμοποιείται στο όρισμα της μακροεντολής μας εξακολουθεί να ενεργοποιεί το TeX να στοιχειοθετεί μαθηματικά· σαφώς, το TeX *δεν* άλλαξε τον κωδικό κατηγορίας του `$` που χρησιμοποιείται στο όρισμα της μακροεντολής μας (`$90`). Το ερώτημα είναι *γιατί* γιατί το TeX δεν άλλαξε τον κωδικό κατηγορίας του `$` σε 11 και δεν το στοιχειοθετεί ως κανονικό χαρακτήρα; Η σύντομη απάντηση είναι ότι το TeX πρώτα μετατρέπει τα ορίσματα των μακροεντολών σε tokens **πριν** προτού τα τροφοδοτήσει στη λίστα tokens της `<replacement text>`—αλλά θα εξετάσουμε τους υποκείμενους μηχανισμούς με πολύ περισσότερη λεπτομέρεια.

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

Αρχικά, ίσως νομίζουμε ότι η χρήση της `\docat` μακροεντολής στο `Πλήρωσα \docat{$90} για αυτό το βιβλίο.` είναι το ίδιο με το να γράφουμε απευθείας τον αντίστοιχο κώδικα TeX (ή LaTeX) — όπως το ακόλουθο, το οποίο *δεν* λειτουργεί:

```
\begin{document}
I paid \catcode`\$=11 $90 for that book.
\end{document}
```

![Κάποιος κώδικας TeX που εκτελείται στο Overleaf](/files/2468a364dc1ad4c222bda6b681430825b0713d65)

Ωστόσο, όπως είδαμε παραπάνω, ο τρόπος με τον οποίο το TeX επεξεργάζεται τα ορίσματα των μακροεντολών παράγει ένα αποτέλεσμα (`! Έλειπε το $, προστέθηκε.`) που είναι αρκετά διαφορετικό από το να γράφουμε τον κώδικα TeX: τώρα θα εξερευνήσουμε *γιατί* τι συμβαίνει.

### Μακροεντολές και ορίσματα ως λίστες tokens

Για να κατανοήσουμε πλήρως τη συμπεριφορά της `\docat` μακροεντολής, και του ορίσματος της (`$90`), και γιατί αποτυγχάνει, πρέπει πάλι να οπτικοποιήσουμε τον ορισμό της `\docat` μακροεντολής και τυχόν ορισμάτων που χρησιμοποιούνται (όταν καλείται η \docat) ως *λίστες tokens*, όχι ως ακολουθία χαρακτήρων.

Καθώς το TeX σαρώνει το κείμενο εισόδου σας, θα αναγνώριζε `\docat` ως εντολή μακροεντολής· μετά ελέγχει αν δέχεται παραμέτρους — το πώς το κάνει αυτό το TeX εξηγείται στην επόμενη ενότητα για τους αναγνώστες που ενδιαφέρονται για τις λεπτομέρειες.

#### Για όσους αγαπούν τις λεπτομέρειες...

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

**Ένα παράδειγμα**

Τα ακόλουθα διαγράμματα λίστας κόμβων συγκρίνουν τις λίστες tokens για δύο μακροεντολές:

* `\def\foo A#1B{#1}`: αυτό έχει `<parameter text>` του `A#1B`, κατά συνέπεια το **ταιριαστικό τέλους** token είναι **όχι** το πρώτο token, οπότε το TeX θα προχωρούσε να αναζητήσει παραμέτρους·
* `\def\foo{X}`: αυτό δεν έχει ένα `<parameter text>` τμήμα, κατά συνέπεια το **ταιριαστικό τέλους** token είναι το πρώτο στη λίστα tokens και το TeX ξέρει να μην αναζητήσει καμία παράμετρο.

![Πώς ελέγχει το TeX αν μια μακροεντολή δέχεται παραμέτρους](/files/f18212c31a5f440250808ad2aa7a440c4caf1969)

## Προς το «Μεγάλο Φινάλε»: ανάπτυξη

Ας υπενθυμίσουμε στον εαυτό μας το ερώτημα: γιατί η ακόλουθη μακροεντολή δεν λειτούργησε; δηλαδή, γιατί το TeX δεν αλλάζει τον κωδικό κατηγορίας οποιουδήποτε `$` συμβόλων που χρησιμοποιούνται στο όρισμα της `\docat` μακροεντολής, όπως `\docat{$90}`?

```
\begin{document}
\def\docat #1{\catcode`\$=11 #1}
Πλήρωσα \docat{$90} για αυτό το βιβλίο.
\end{document}
```

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

Για να αναγνωρίσει τα ορίσματα που υπάρχουν στην είσοδο (την κλήση μακροεντολής του χρήστη), το TeX θα καθοδηγηθεί από τον εσωτερικά αποθηκευμένο ορισμό της συγκεκριμένης μακροεντολής: συγκεκριμένα, το `<parameter text>` τμήμα του αποθηκευμένου ορισμού της μακροεντολής (λίστα tokens) — που παρέχει ένα είδος «προτύπου tokens». Χρησιμοποιώντας αυτό το «πρότυπο tokens», το TeX πρέπει να καθορίσει ποια *tokens* στην κλήση μακροεντολής του χρήστη είναι απλώς *οριοθέτες* (ουσιαστικά «στίξη») και ποια *tokens* αποτελούν μέρος ενός *ορίσματος*. Είναι όταν το TeX συναντά ένα **παράμετρος αντιστοίχισης** token στον αποθηκευμένο ορισμό της μακροεντολής `<parameter text>` τμήμα («πρότυπο tokens») που ξέρει να αρχίσει να σχηματίζει μια *λίστα tokens* για το συγκεκριμένο όρισμα.

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

### Γιατί απέτυχε η μακροεντολή \docat

Όπως σημειώθηκε, *πριν* Για να μπορέσει πραγματικά το TeX να καλέσει μια μακροεντολή, πρέπει να προσδιορίσει και να προετοιμάσει τυχόν ορίσματα που θα χρησιμοποιηθούν με αυτή τη μακροεντολή. Ωστόσο, για να προσδιορίσει τα ορίσματα, έτοιμα για τροφοδότηση στη μακροεντολή, το TeX πρέπει να δημιουργήσει κάθε όρισμα ως μια *λίστα tokens*: και αυτός είναι ο λόγος για την `\docat`αποτυχία της.

Στο παράδειγμά μας, παρέσχουμε `\docat` στη με ένα όρισμα `$90` αλλά αυτό το όρισμα πρώτα *μετατρέπεται σε μια λίστα tokens* καθώς το TeX σαρώνει την κλήση της μακροεντολής — το όρισμα μετατρέπεται σε tokens *πριν* πριν η μακροεντολή κληθεί πραγματικά. Εδώ, για το όρισμα `$90`, το TeX θα δημιουργήσει τρία tokens χαρακτήρων: ένα token για καθένα από τα `$`, `9` και `0`.

Το ακόλουθο γραφικό δείχνει τη λίστα tokens που δημιουργείται για το όρισμα `$90`, πριν τροφοδοτηθεί στο σώμα της `\docat` μακροεντολής:

![Λίστα tokens του TeX που δημιουργείται για ένα όρισμα μακροεντολής](/files/af76aaa8788c3592ec3c31087714f61c191bfc7a)

Στο παραπάνω γραφικό μπορούμε καθαρά να δούμε ότι η λίστα tokens του ορίσματος περιέχει το `$` ως token χαρακτήρα με βάση κωδικό κατηγορίας 3.

Όπως είδαμε στα Μέρη 1 έως 3, τα tokens χαρακτήρων δημιουργούνται χρησιμοποιώντας τις τιμές κωδικού κατηγορίας *που ισχύουν τη στιγμή που ο χαρακτήρας διαβάζεται*—δηλαδή, τη στιγμή που δημιουργείται (μετατρέπεται σε tokens) η λίστα tokens του ορίσματος. Τη στιγμή που τα ορίσματα γίνονται tokenization, η `\docat` μακροεντολή δεν έχει ακόμη εκτελεστεί, οπότε η αλλαγή του κωδικού κατηγορίας που βάλαμε στην κλήση της μακροεντολής (``\catcode`\$=11``) *δεν* να επηρεάσει τους κωδικούς κατηγορίας που χρησιμοποιούνται για τη δημιουργία των tokens του ορίσματος.

Μόλις το TeX δημιουργήσει μια λίστα tokens που αναπαριστά το όρισμα της `$90`, αυτά τα τρία tokens χαρακτήρων τροφοδοτούνται στην πραγματική μακροεντολή `<replacement text>`. Ωστόσο, αυτό έχει ως αποτέλεσμα το `$` να τροφοδοτείται ως *χαρακτηρικό token* που δημιουργήθηκε με χρήση κωδικού κατηγορίας 3: «μαθηματικά ενεργά» και έχουμε δει ότι μόλις σχηματιστεί ένα token χαρακτήρα, ο συνημμένος κωδικός κατηγορίας είναι μόνιμος. Το `$` είναι *όχι* που τροφοδοτείται στη μακροεντολή *όχι ως χαρακτήρας*, αλλά ως ένα *χαρακτηρικό token* βασισμένο στο `$` που έχει κωδικό κατηγορίας 3.

### Εκτέλεση της \docat: ανάπτυξη μακροεντολής

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

#### Η πραγματική σημασία της ανάπτυξης μακροεντολής

Αφού το TeX ανιχνεύσει την `\docat` εντολή στην είσοδο του χρήστη, σαρώνει τα ορίσματα και δημιουργεί μια λίστα tokens για το όρισμά της (`$90`). Για να εκτελέσει (να αναπτύξει) τη μακροεντολή, το TeX απομακρύνει το βλέμμα του από το αρχείο εισόδου του χρήστη και αρχίζει να διαβάζει τα tokens που περιέχονται `\docat`του `<replacement text>` στη λίστα tokens που είναι αποθηκευμένη στη μνήμη του TeX.

Καθώς το TeX επεξεργάζεται `\docat`τον ορισμό της, θα δει στη συνέχεια και θα εκτελέσει τη σειρά των tokens που χρησιμοποιήθηκαν αρχικά για να ορίσουν τη μακροεντολή (`**catcode**`, ``**`**``, `**\$**`, `**=**`, `**1**`, `**1**`, `**#1**`).

Το ακόλουθο γραφικό δείχνει τη διαδικασία ανάπτυξης της `\docat` μακροεντολής: το TeX σταματά να λαμβάνει tokens από το αρχείο εισόδου και αρχίζει να διαβάζει tokens από το `<replacement text>` τμήμα του `\docat` ορισμού της μακροεντολής που είναι αποθηκευμένος στη μνήμη. Το TeX συνεχίζει να εκτελεί αυτά τα προετοιμασμένα εκ των προτέρων tokens μέχρι να δει ένα **παράμετρος εξόδου** token το οποίο δίνει εντολή στο TeX να διαβάσει («εισάγει») και να «εκτελέσει» τα tokens του ορίσματος σε αυτό το σημείο. Στο παράδειγμά μας, αυτά είναι τρία tokens χαρακτήρων που αναπαριστούν `$90` και αυτό καταλήγει σε σφάλμα επειδή το προετοιμασμένο εκ των προτέρων token χαρακτήρα για το `$` έχει κωδικό κατηγορίας 3. Επειδή έχουμε να κάνουμε με tokens χαρακτήρων, όχι με χαρακτήρες, το `$` δεν επηρεάζεται από την προηγούμενη αλλαγή κωδικού κατηγορίας που προκλήθηκε από τα tokens στο ``\catcode`\$=11``.

![Εμφάνιση της διαδικασίας ανάπτυξης της μακροεντολής \docat](/files/6845f18f3282cf99f3cdb9c3582b617ed43c7d1e)

Αφού το TeX επεξεργαστεί τα tokens που αναπαριστούν ``\catcode`\$=11``, η αλλαγή του κωδικού κατηγορίας για το `$` θα ισχύει πλέον. Στη συνέχεια το TeX συναντά το «ειδικό token» που ονομάζεται **παράμετρος εξόδου** που λέει στο TeX να **εισάγουν** τη λίστα tokens του ορίσματος. Ωστόσο, αυτή η λίστα tokens είναι τρία tokens χαρακτήρων *tokens*, το πρώτο από τα οποία είναι ένα token για ένα `$` με κωδικό κατηγορίας 3 («μαθηματικά ενεργά») ορισμένο σε αυτό: η προηγούμενη αλλαγή κωδικού κατηγορίας μέσα στη μακροεντολή δεν μπορεί να επηρεάσει αυτό το token χαρακτήρα, οπότε το TeX το αντιμετωπίζει ως σήμα για να ξεκινήσει η επεξεργασία μαθηματικών, κάτι που προκαλεί την αποτυχία της μακροεντολής.

### Μπορεί να διορθωθεί η μακροεντολή \docat;

Από τις παραπάνω συζητήσεις, είναι σαφές ότι οποιοιδήποτε χαρακτήρες εμφανίζονται στα ορίσματα μακροεντολής γίνονται token με τους κωδικούς κατηγορίας που ισχύουν τη στιγμή που γίνεται η tokenization — η οποία, στο παράδειγμά μας, είναι *πάντα* πριν από το `<replacement text>` του `\docat` μακροεντολή εκτελεστεί πραγματικά. Άρα, πώς μπορούμε να διασφαλίσουμε ότι οι κωδικοί κατηγορίας των ορισμάτων μιας μακροεντολής θα αλλάξουν;

Ένας τρόπος είναι να τροποποιήσουμε `\docat` ώστε να γίνει μια μακροεντολή χωρίς παραμέτρους η οποία κάνει μόνο την αλλαγή του κωδικού κατηγορίας — δεν έχει ορίσματα για να γίνουν token. Στη συνέχεια χρησιμοποιούμε μια δεύτερη μακροεντολή, `\getarg`, η οποία δέχεται μία μόνο παράμετρο, και φροντίζουμε ώστε το όρισμα αυτής της μακροεντολής να γίνεται token όταν ο κατάλληλος κωδικός κατηγορίας για το `$` είναι ενεργός.

```
\begin{document}
\def\docat{\catcode`\$=11 \getarg} % Χωρίς παραμέτρους, καλεί μια δεύτερη μακροεντολή \getarg
\def\getarg#1{#1} % 1 παράμετρος της οποίας το όρισμα θα μετατραπεί σε tokens
Τώρα μπορείτε να το εκτελέσετε έτσι και θα λειτουργήσει:

Πλήρωσα \docat{$90} για αυτό το βιβλίο.
\end{document}
```

Όταν χρησιμοποιούμε τη νέα μας έκδοση της `\docat` (όπως αυτό `\docat{$90}`) φαίνεται *φαίνεται* σαν να `$90` εξακολουθεί να χρησιμοποιείται ως όρισμα για τη `\docat` μακροεντολή. Ωστόσο, όπως συζητήθηκε παραπάνω, όταν το TeX ανιχνεύσει `\docat` στην είσοδο, ελέγχει αν έχει ορίσματα: τώρα δεν έχει, οπότε το TeX προχωρά να την εκτελέσει (να την αναπτύξει). Η ανάπτυξη της `\docat` είναι η ακολουθία tokens `**catcode**`, ``**`**``, `**\$**`, `**=**`, `**1**`, `**1**`, `**space**`, `**getarg**` και αυτό συμβαίνει *πριν* το TeX αρχίζει να διαβάζει (να μετατρέπει σε tokens) τους επόμενους χαρακτήρες που περιέχονται στο αρχείο εισόδου — δηλαδή, το group `{$90}`. Να θυμάστε ότι όταν το TeX αναπτύσσει μια μακροεντολή, παίρνει την επόμενη είσοδό του διαβάζοντας τα tokens που περιέχονται στη λίστα tokens του ορισμού αυτής της μακροεντολής· δηλαδή, από το `<replacement text>` τμήμα που είναι αποθηκευμένο στη μνήμη.

Το TeX θα επεξεργαστεί και θα εκτελέσει την ανάπτυξη της `\docat` και θα ανιχνεύσει το *token* **`getarg`**, αναγνωρίζοντάς το ως token που αναπαριστά μια εντολή η οποία δέχεται παραμέτρους. Σε αυτό το σημείο, το TeX θα σαρώσει το αρχείο εισόδου για το **`getarg`**’s argument: τους χαρακτήρες: `{$90}`. Ως συνήθως, αυτά γίνονται token, αλλά επειδή το TeX έχει διαβάσει και επεξεργαστεί την ανάπτυξη της `\docat`, οι χαρακτήρες `$90` γίνονται token όταν ο κωδικός κατηγορίας του `$` έχει αλλάξει σε 11. Ο ορισμός (`<replacement text>`) της `\getarg` είναι απλώς `#1` που σημαίνει «στοιχειοθέτησε το παρεχόμενο όρισμα», και αυτό ακριβώς συμβαίνει, με αποτέλεσμα να δημιουργείται ένα `$` με κωδικό κατηγορίας 11 και να στοιχειοθετείται με ασφάλεια.

## Καταληκτικές παρατηρήσεις: η ιστορία στους κόμβους

Η ακολουθία των γεγονότων που προκύπτει από την επανεγγραφή του `\docat` ώστε να χρησιμοποιεί τη μακροεντολή `\getarg` περιλαμβάνεται στο ακόλουθο σχολιασμένο διάγραμμα λίστας κόμβων, το οποίο δείχνει τη διαδικασία ανάπτυξης για τη μακροεντολή `\docat`. Οι αναγνώστες που θέλουν να μελετήσουν προσεκτικά αυτό το διάγραμμα μπορούν να κατεβάσουν το γραφικό ως [PDF](https://assets.ctfassets.net/nrgyaltdicpt/7MOBdavza4WxAEQGISEEht/cabe5097d9063a6415bc553cd38237e6/newdocatexpansion.pdf) ή [SVG](https://images.ctfassets.net/nrgyaltdicpt/2FIqqVRXjakdAzTpZsV0m9/10ccc1353741d42d3df18f1692d8aa84/newdocatexpansion--plain.svg) αρχείο για χρήση εκτός σύνδεσης.

![Εμφάνιση της διαδικασίας ανάπτυξης της τροποποιημένης μακροεντολής \docat και της μακροεντολής \getarg](/files/a58fc7ad4e4222eaa46ac29b41afbea47d457bfe)

[Μέρος 1](/latex/el/perissotera-themata/19-how-tex-macros-actually-work-part-1.md) [Μέρος 2](/latex/el/perissotera-themata/20-how-tex-macros-actually-work-part-2.md) [Μέρος 3](/latex/el/perissotera-themata/21-how-tex-macros-actually-work-part-3.md) [Μέρος 4](/latex/el/perissotera-themata/22-how-tex-macros-actually-work-part-4.md) [Μέρος 5](/latex/el/perissotera-themata/23-how-tex-macros-actually-work-part-5.md) [Μέρος 6](/latex/el/perissotera-themata/24-how-tex-macros-actually-work-part-6.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/perissotera-themata/24-how-tex-macros-actually-work-part-6.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.
