> 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/22-how-tex-macros-actually-work-part-4.md).

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

[Μέρος 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)

## Εισαγωγή και επισκόπηση

Στα Μέρη 1–3 κάναμε μια εις βάθος εξέταση ορισμένων λεπτομερειών χαμηλού επιπέδου, ως προετοιμασία για να κατανοήσουμε πώς λειτουργούν οι μακροεντολές της TeX. Σε αυτό το άρθρο θα «βγούμε για λίγο στην επιφάνεια» για να αναθεωρήσουμε μερικές βασικές πρακτικές αρχές των μακροεντολών της TeX, προετοιμαζόμενοι για άλλη μια εις βάθος εξέταση στα Μέρη 5 και 6. Σε όλο αυτό το άρθρο θα δείχνουμε παραδείγματα μακροεντολών που ορίζονται χρησιμοποιώντας την πρωτογενή εντολή της TeX `\def`: δεν θα χρησιμοποιήσουμε την, ίσως πιο γνωστή, εντολή LaTeX `\newcommand`. Υπάρχει πολύ καλός λόγος γι’ αυτό: στόχος μας είναι να κατανοήσουμε τις θεμελιώδεις αρχές που διέπουν τη συμπεριφορά των μακροεντολών της TeX, αλλά για να το κάνουμε αυτό πρέπει να χρησιμοποιήσουμε βασικές εντολές *ενσωματωμένες στο* λογισμικό TeX. Οι εντολές LaTeX, όπως `\newcommand`, είναι οι ίδιες μακροεντολές: εντολές με συγκεκριμένη προγραμματισμένη συμπεριφορά που, τελικά, κατασκευάζονται από στρώματα πρωτογενών εντολών TeX χαμηλότερου επιπέδου. Για να κατανοήσουμε καλύτερα τη θεμελιώδη συμπεριφορά της TeX πρέπει να χρησιμοποιήσουμε πρωτογενείς εντολές TeX, όχι μακροεντολές LaTeX.

### Πού κατευθυνόμαστε;

Ουσιαστικά, εργαζόμαστε προς μια εξήγηση των μακροεντολών ως μιας εξειδικευμένης μορφής λίστας συμβόλων: όταν δίνετε εντολή στην TeX να ορίσει μια μακροεντολή, δημιουργεί μια ακολουθία από σύμβολα (μια λίστα συμβόλων) και τα αποθηκεύει στη μνήμη της συνδεδεμένα με ένα όνομα που εσείς ορίζετε. Στα Μέρη 5 και 6 θα εξετάσουμε τις λίστες συμβόλων μακροεντολών αρκετά λεπτομερώς, αλλά αν προτιμάτε να απομακρυνθείτε από αυτό το άρθρο για να διαβάσετε κάποιες πληροφορίες υποβάθρου, μπορείτε να τις βρείτε στο [Τι είναι μια λίστα tokens του TeX;](/latex/el/se-vathos-arthra/54-what-is-a-tex-token-list.md)

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

## Τα τέσσερα μέρη μιας μακροεντολής

### Υπενθύμιση: παράμετροι μακροεντολής και ορίσματα μακροεντολής

Πριν ξεκινήσουμε, αξίζει να θυμηθούμε τη διαφορά ανάμεσα στις *παραμέτρους* και στα *ορίσματα*ορίσματα μιας μακροεντολής, επειδή θα χρησιμοποιούμε και τους δύο όρους σε όλο αυτό το άρθρο. Ας υποθέσουμε ότι ορίζετε μια μακροεντολή \foo

```
\def\foo#1#2{Αυτό είναι #1, αυτό είναι #2}
```

Οι δομές (σύμβολα) `#1`, `#2` (έως `#9`) ονομάζονται *παραμέτρους*: σκεφτείτε τα ως «θέσεις κράτησης» για τα πραγματικά δεδομένα που θα χρησιμοποιήσετε όταν καλέσετε τη μακροεντολή:

```
\foo{alpha}{beta}
```

Εδώ, `alpha` και `beta` είναι τα *ορίσματα* που χρησιμοποιούνται με αυτή την κλήση της \foo: τα ορίσματα μιας μακροεντολής είναι οι πραγματικές τιμές που τροφοδοτούν τα κενά θέσεων των παραμέτρων (`#1`, `#2`... `#9`) που χρησιμοποιήθηκαν όταν ορίσατε τη μακροεντολή.

### Ορισμός μακροεντολής: έχει 4 στοιχεία

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

Κάθε ορισμός μακροεντολής αποτελείται από 4 μέρη:

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

όπου:

* `<πρωτόγονο μακροεντολής TeX>`: ένα από τα `\def`, `\edef`, `\gdef` ή `\xdef`;
* `<macro name>`: το όνομα που δίνετε στην εντολή της μακροεντολής σας, όπως `\foo`;
* `<parameter text>`: αυτό μπορεί να απουσιάζει, αλλά, αν υπάρχει, είναι μια σειρά από *tokens* που εμφανίζονται πριν από το `<replacement text>` της μακροεντολής. Το `<parameter text>` μπορεί να περιέχει παραμέτρους μακροεντολής (`#1`, `#2`... `#9`) και άλλα είδη συμβόλων. Ουσιαστικά, και όπως θα δούμε αναλυτικά, το `<parameter text>` παρέχει ένα είδος *προτύπου συμβόλων* που η TeX χρησιμοποιεί για να διαπιστώσει ποια σύμβολα θέλει να χρησιμοποιήσει ο χρήστης ως ορίσματα της μακροεντολής: όταν καλείτε μια μακροεντολή, η TeX τροφοδοτεί τα *ορίσματος* σύμβολα στο `<replacement text>` (το οποίο είναι επίσης μια λίστα συμβόλων);
* `{<κείμενο αντικατάστασης>}`: αυτό είναι το πραγματικό σώμα της μακροεντολής σας: είναι μια σειρά από σύμβολα μέσα στα οποία τα *ορίσματα* «εισάγονται» όταν η μακροεντολή επεξεργάζεται (αναπτύσσεται). Τα ορίσματα τροφοδοτούνται στις θέσεις που υποδεικνύουν οι παράμετροι μακροεντολής που χρησιμοποιήθηκαν στον αρχικό ορισμό.

**ΣΗΜΕΙΩΣΗ**: Σε όλη τη συζήτηση υποθέτουμε ότι `<macro name>` θα ακολουθείται από έναν χαρακτήρα διαστήματος με κωδικό κατηγορίας 10 για να λειτουργεί ως διαχωριστικό που τερματίζει το `<macro name>`. *δεν έχουμε* δείξει ρητά αυτόν τον χαρακτήρα διαστήματος στο κείμενο/τη συζήτησή μας, αλλά υποθέτουμε ότι υπάρχει. Αυστηρά μιλώντας, θα έπρεπε να τον αναπαραστήσουμε κάπως έτσι:

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

Ωστόσο, θα παραλείψουμε τη ρητή συμπερίληψη ενός `<διάστημα>` χαρακτήρα και θα υποθέτουμε σιωπηρά την παρουσία του.

#### Σημειώσεις για τα {}

Έχουμε δείξει τη χρήση δύο αγκυλών: `{` και `}` οι οποίες περιβάλλουν (οριοθετούν) το πραγματικό σώμα της μακροεντολής σας `<replacement text>`. Ωστόσο, η χρήση των `{` και `}` είναι απλώς μια υιοθετημένη σύμβαση, επειδή αυτό που στην πραγματικότητα περιμένει η TeX είναι το κείμενο της μακροεντολής σας `<replacement text>` να ανοίγει με έναν χαρακτήρα κατηγορίας 1 («Έναρξη ομάδας») και να κλείνει με έναν χαρακτήρα κατηγορίας 2 («Τέλος ομάδας»). Κατά σύμβαση, αυτοί είναι οι `{` και `}` χαρακτήρες, αντίστοιχα. Ωστόσο, μπορείτε, αν θέλετε, να αναθέσετε σε οποιοδήποτε ζεύγος χαρακτήρων να το κάνει αυτό. Για παράδειγμα

```
\catcode`\(=1
\catcode`\)=2
```

Τώρα, μπορείτε να ορίσετε και να χρησιμοποιήσετε μακροεντολές έτσι:

```
\def\foo #1(Hello, #1)
\foo(World!)
```

Και μπορείτε ακόμη να χρησιμοποιείτε `{` και `}` επειδή δεν έχουμε αλλάξει τους κωδικούς κατηγορίας τους — πολλοί χαρακτήρες μπορούν, και πράγματι έχουν, τον ίδιο κωδικό κατηγορίας, οπότε θα μπορούσατε να συνεχίσετε να ορίζετε μακροεντολές με τον συνηθισμένο τρόπο:

```
\def\foo #1{Hello, #1}
\foo{World!}
```

### και {}

Τα συστατικά του ορισμού μιας μακροεντολής που είναι πιο συναφή με τη συζήτησή μας είναι `<parameter text>` και `{<κείμενο αντικατάστασης>}`. Όταν ορίζετε μια μακροεντολή, το `<parameter text>` είναι, στην πράξη, ένα αυστηρό πρότυπο συμβόλων που ορίζει πώς πρέπει να χρησιμοποιείται η μακροεντολή. Όπως σημειώθηκε, `<parameter text>` μπορεί να είναι κενό, π.χ., `\def\foo{Κάποιο κείμενο}` όπου δεν εμφανίζεται τίποτα ανάμεσα στο όνομα της εντολής μας (`\foo`) και την ανοίγουσα αγκύλη `{` η οποία, εδώ, σηματοδοτεί την αρχή του `<replacement text>`.

**Σημείωση**: Κάποιοι αναγνώστες ίσως γνωρίζουν τον μηχανισμό «hashquote» της TeX (`#{`) αλλά δεν θα ασχοληθούμε με αυτό εδώ.

### και οριοθέτες μακροεντολών

Το συγκεκριμένο άρθρο δεν έχει σχεδιαστεί ως μια πλήρως ολοκληρωμένη ανασκόπηση της συγγραφής μακροεντολών, αλλά αξίζει να κάνουμε μια σύντομη επανάληψη, με μερικά παραδείγματα, δείχνοντας ότι το `<parameter text>` μπορεί να γίνει πολύπλοκο, επειδή η TeX επιτρέπει `<parameter text>` να περιέχει:

* **παραμέτρους μακροεντολής**: (`#1`, `#2`,... `#9`) που λειτουργούν ως «θέσεις κράτησης» για τιμές που θα παρέχει ο χρήστης όταν εκτελέσει τη μακροεντολή — τα *ορίσματα*;
* **διακριτικά οριοθέτησης**: αυθαίρετα σύμβολα, παρεμβαλλόμενα μέσα/γύρω από τα σύμβολα παραμέτρων, και χρησιμοποιούνται για να προσδιορίσουν το όριο μεταξύ των παραμέτρων της μακροεντολής. Μπορείτε να σκεφτείτε αυτούς τους οριοθέτες ως ένα είδος «στίξης» που κάνει το `<parameter text>` ένα «πρότυπο συμβόλων» που θα πρέπει να ακολουθήσετε όταν χρησιμοποιείτε τη μακροεντολή. Τα διακριτικά οριοθέτησης δεν τυπογραφούνται.

Τι σημαίνει λοιπόν αυτό στην πράξη — ας δούμε μερικά παραδείγματα. Το `<parameter text>` βρίσκεται ανάμεσα στο όνομα της μακροεντολής και στο αριστερό άγκιστρο `{` του ορισμού της μακροεντολής.

#### Οριοθέτες: Παράδειγμα 1

Ας υποθέσουμε ότι ορίζουμε μια βασική μακροεντολή `\foo` ως εξής:

```
\def\foo ABC{hello, there}
```

* `<parameter text>` = `ABC`
* Δεν υπάρχουν σύμβολα παραμέτρων (`#1`, `#2`,... `#9`)
* Οι οριοθέτες είναι τα *τρία σύμβολα χαρακτήρων* `ABC` αλλά, σε αυτό το παράδειγμα, είναι κάπως περιττά και χρησιμοποιούνται απλώς ως παράδειγμα.

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

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

![Το Overleaf εκτελεί μια μακροεντολή TeX](/files/e8668d90ba3405667e40b15d22cc1d3e7596cbc9)

Αν προσπαθήσετε να χρησιμοποιήσετε `\foo` χωρίς τους `ABC` οριοθέτες, η TeX θα διαμαρτυρηθεί `Η χρήση της \foo δεν ταιριάζει με τον ορισμό της.`:

![Εμφάνιση σφάλματος της TeX στο Overleaf](/files/cea5700a4438eda23daef421b41a13f37b0b929f)

Στο παραπάνω παράδειγμα, αφού εντόπισε `\foo` η TeX αναμένει να δει τα τρία σύμβολα χαρακτήρων `ABC` αλλά δεν το κάνει: βλέπει το σύμβολο χαρακτήρα για `w` και αμέσως εντοπίζει ότι κάτι δεν πάει καλά.

#### Οριοθέτες: Παράδειγμα 2

Ένα ενδιαφέρον, και ίσως εκπληκτικό, γεγονός είναι ότι οι οριοθέτες μπορεί να είναι αυθαίρετα σύμβολα εντολών — συμπεριλαμβανομένων εντολών που δεν έχουν *ούτε καν οριστεί*. Για παράδειγμα, θα μπορούσαμε να ορίσουμε `\foo` ως:

```
\def\foo A\bob B\anne{Hello \TeX{}}
```

* `<parameter text>` = `A\bob B\anne`
* Δεν υπάρχουν σύμβολα παραμέτρων (`#1`, `#2`,... `#9`)
* Οι οριοθέτες είναι τα σύμβολα `A\bob B\anne` αλλά και πάλι, σε αυτό το παράδειγμα, είναι περιττά και μόνο για τους σκοπούς της συζήτησης. Σημειώστε ότι `\bob` και `\anne` είναι φανταστικές εντολές που *δεν ορίστηκαν*—και δεν χρειάζεται να οριστούν.

Όταν καλείτε μια μακροεντολή, η TeX ελέγχει (σάρωσει) το `<parameter text>` που είναι παρόν *στην κλήση της μακροεντολής σας* και το συγκρίνει, σύμβολο προς σύμβολο, με την έκδοση του «προτύπου συμβόλων» *που είναι αποθηκευμένη στη μνήμη*—εκείνη που δημιουργήθηκε τη στιγμή που ορίστηκε η μακροεντολή. Η TeX σαρώνει τα *που χρησιμοποιούνται στην κλήση της μακροεντολής σας* και απλώς μετατρέπει οποιεσδήποτε εντολές βρει εκεί στην αριθμητική τιμή συμβόλου τους: δεν προσπαθεί να εκτελέσει αυτές τις εντολές, επομένως δεν έχει σημασία ότι `\bob` και `\anne` δεν ορίστηκαν ποτέ. Η TeX χρησιμοποιεί απλώς το πρότυπο συμβόλων που είναι αποθηκευμένο στη μνήμη ως οδηγό, ο οποίος της επιτρέπει να διαπιστώσει ποια σύμβολα στο `<parameter text>` της κλήσης της μακροεντολής σας είναι τα πραγματικά ορίσματα που θα τροφοδοτηθούν στο `<replacement text>`.

Όπως μπορείτε να δείτε από το ακόλουθο απόσπασμα οθόνης του Overleaf, κανένα από τα σύμβολα χαρακτήρων (`Ένα` και `B`) μέσα στο `A\bob B\anne` δεν τυπογραφήθηκε και οι μη ορισμένες εντολές μας `\bob` και `\anne` δεν προκάλεσαν κανένα πρόβλημα. Όλα αυτά τα σύμβολα *απορροφήθηκαν* από την TeX καθώς ταίριαζε τη χρήση σας της `\foo` με τον ορισμό (πρότυπο συμβόλων) της `\foo` (μιας λίστας συμβόλων) που είναι αποθηκευμένη στη μνήμη.

![Το Overleaf εκτελεί μια μακροεντολή TeX](/files/48b77887af099295fbf5e8712ecc58c96a8054bb)

#### Οριοθέτες: Παράδειγμα 3

Μπορείτε να παρεμβάλλετε διάφορους οριοθέτες (σύμβολα χαρακτήρων, σύμβολα εντολών) με παραμέτρους μακροεντολής, όπως σε αυτό το παράδειγμα:

```
\def\foo A\bob#1B\anne#2\jane#3bye!{Γεια από τη \TeX{} προς \#1=#1, \#2=#2 και \#3=#3}
```

* `<parameter text>` = `A\bob#1B\anne#2\jane#3bye!`
* Υπάρχουν 3 σύμβολα παραμέτρων μακροεντολής: `#1`, `#2`, `#3`
* Αυτή τη φορά, οι παράμετροι (`#1`, `#2`, `#3`) οριοθετούνται από έναν συνδυασμό συμβόλων:

  `A\bob#1B\anne#2\jane#3bye!`

Εδώ, ουσιαστικά, έχετε δώσει στην TeX ένα πρότυπο που θα προσπαθήσει πολύ προσεκτικά, και θα αναμένει, να ταιριάξει όταν καλέσετε `\foo`: θα περάσει μέσα από την κλήση της μακροεντολής σας, *σύμβολο προς σύμβολο*, και θα αναμένει να ταιριάξει (να βρει):

* τα δύο σύμβολα `Ένα` και `\bob` πριν `#1`
* τα δύο σύμβολα `B` και `\anne` πριν `#2`
* το σύμβολο `\jane` πριν από την παράμετρο `#3` και ο *τέσσερα σύμβολα χαρακτήρων* `b`, `y`,`e` και `!` μετά το `#3`.

**Να θυμάστε**: η TeX σκέφτεται σε σύμβολα, οπότε `bye!` είναι *τέσσερα σύμβολα χαρακτήρων*.

Υπάρχουν δύο τρόποι με τους οποίους μπορούμε να χρησιμοποιήσουμε αυτή τη μακροεντολή — θα μπορούσαμε να βάλουμε οποιαδήποτε ορίσματα πολλών συμβόλων μέσα σε αγκύλες για να δημιουργήσουμε μια ομάδα:

```
\foo A\bob{This}B\anne{That}\jane{Other}bye!
```

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

```
\foo A\bob ThisB\anne That\jane Otherbye!
```

και η TeX μπορεί να ξεχωρίσει τα ορίσματα ώστε να παράγει το ίδιο αποτέλεσμα όπως με τη χρήση ομάδων `{...}`:

![Το Overleaf εκτελεί μια μακροεντολή TeX χρησιμοποιώντας οριοθέτες](/files/25dd3ec5f5dd9c6f94156b849418be76fa048520)

Παρατηρήστε πώς η TeX μπόρεσε να εντοπίσει με ακρίβεια ποια σύμβολα ταίριαζαν με τις παραμέτρους `#1` και `#3`:

![Το Overleaf εκτελεί μια μακροεντολή TeX χρησιμοποιώντας οριοθέτες](/files/bbc8e7f4e707211ec8e9e911b98759fe32cb996e)

#### Οριοθέτες: Παράδειγμα 4 (όλα είναι θέμα συμβόλων, όχι χαρακτήρων!)

Ακολουθεί ένα σύντομο παράδειγμα για να δείξει ότι, όταν εργαζόμαστε με μακροεντολές, είναι σημαντικό να θυμόμαστε ότι πράγματι βρισκόμαστε στον κόσμο των *tokens* και **όχι** *χαρακτήρια*…

Θα ορίσουμε την ακόλουθη σύντομη μακροεντολή όπου τα A και B είναι χαρακτήρες που λειτουργούν ως οριοθέτες και έχουν και τα δύο κωδικό κατηγορίας 11. Αυτό λειτουργεί χωρίς προβλήματα:

```
\documentclass{article}
\begin{document}
\def\foo A#1B{Hello, #1}
\foo AGrahamB
\end{document}
```

και τυπώνει `Hello, Graham`.

Ωστόσο, αν αλλάξετε τον κωδικό κατηγορίας του A ή του B σε κάτι διαφορετικό από το 11, η κλήση της μακροεντολής θα αποτύχει. Ας υποθέσουμε ότι αλλάζουμε τον κωδικό κατηγορίας του B σε 12, χρησιμοποιώντας ``\catcode`B=12`` και προσπαθούμε να καλέσουμε ξανά τη μακροεντολή, όπως πριν:

```
\documentclass{article}
\begin{document}
\def\foo A#1B{Hello, #1}
\foo AGrahamB % Αυτό λειτουργεί
\catcode`\B=12\relax
\foo AGrahamB
\end{document}
```

Αποτυγχάνει με ένα κάπως αινιγματικό σφάλμα:

```
Ξέφυγε όρισμα;
GrahamB \end {document}
! Το αρχείο τελείωσε ενώ γινόταν σάρωση της χρήσης της \foo.
<εισαχθέν κείμενο>
                \par
<*> main.tex

Υποψιάζομαι ότι έχετε ξεχάσει ένα `}', με αποτέλεσμα να με
αναγκάσει να διαβάσω πέρα από το σημείο όπου θέλατε να σταματήσω.
Θα προσπαθήσω να ανακάμψω· αλλά αν το σφάλμα είναι σοβαρό,
καλύτερα πληκτρολογήστε τώρα `E' ή `X' και διορθώστε το αρχείο σας.

! Έκτακτη διακοπή.
<*> main.tex

*** (η εργασία διακόπηκε, δεν βρέθηκε έγκυρο \end)
```

![Το Overleaf εμφανίζει σφάλμα μακροεντολής TeX](/files/23a719d8e124f7ab6aed8dc31498ff032499ff90)

Δυστυχώς, η προεπιλεγμένη υπόδειξη της TeX για ``Υποψιάζομαι ότι έχετε ξεχάσει ένα `}'`` είναι **είναι λανθασμένη**, δεν προκαλείται από ελλείπουσα αγκύλη (`}`).

#### Τι έχει συμβεί;

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

Οι τιμές συμβόλων για τα A και B, $$\mathrm{T\_A}$$ και $$\mathrm{T\_B}$$ αντίστοιχα, είναι:

$$\mathrm{T\_A = 256 \times 11 + 65 = 2881}$$ $$\mathrm{T\_B = 256 \times 11 + 66 =2882}$$

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

$$\mathrm{T'\_B= 256 \times 12 + 66 =3138}$$

Στο `\foo` ορισμό της μακροεντολής, η τιμή συμβόλου για το B (που χρησιμοποιείται ως οριοθέτης) ήταν 2882, αλλά η TeX τώρα βλέπει μια τιμή συμβόλου 3138: θεωρεί ότι αυτό είναι απλώς ένα ακόμη σύμβολο προορισμένο για χρήση στο *ορίσματος* που παρέχεται στο `\foo`. Όσον αφορά την TeX, το τελικό σύμβολο του ορίσματος δεν έχει βρεθεί ακόμη, οπότε προχωρά να πάρει άλλο σύμβολο στην αναζήτησή της για ένα B με κωδικό κατηγορίας 11. Εκείνη τη στιγμή, και γι’ αυτόν τον λόγο, η μακροεντολή αποτυγχάνει: στην προσπάθειά της να βρει το όρισμα, η TeX «υπερπηδά» και αρχίζει να διαβάζει σύμβολα που δεν είχατε σκοπό να γίνουν μέρος του ορίσματος για την `\foo` κλήση της μακροεντολής. Το τι θα συμβεί στη συνέχεια εξαρτάται από τα σύμβολα που η TeX ανακαλύπτει μετά το B — αυτά θα προκαλέσουν διάφορα `Ξέφυγε όρισμα;` σφάλματα.

Στο παράδειγμά μας, η TeX υπερπηδά και καταναλώνει τη ροή των συμβόλων `\end {document}` και φτάνει γρήγορα στο τέλος του αρχείου, εξ ου και το μήνυμα σφάλματος:

```
! Το αρχείο τελείωσε ενώ γινόταν σάρωση της χρήσης της \foo
```

## Μέρος 5

Όπως είδαμε παραπάνω, το `<parameter text>` τμήμα του ορισμού της μακροεντολής μας μπορεί να κυμαίνεται από εξαιρετικά απλό έως έναν σύνθετο συνδυασμό παραμέτρων μακροεντολής παρεμβαλλόμενων με σύμβολα χαρακτήρων και σύμβολα εντολών που λειτουργούν ως οριοθέτες. Η TeX είναι σε θέση να επεξεργάζεται τους διάφορους συνδυασμούς συμβόλων που υπάρχουν στο `<parameter text>` για να εξάγει τα ορίσματα που παρέχονται σε μια μακροεντολή — και να εντοπίζει πότε προσπαθούμε να χρησιμοποιήσουμε μια μακροεντολή λανθασμένα. Το πώς το κάνει αυτό είναι το θέμα του επόμενου άρθρου της σειράς.

[Μέρος 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/22-how-tex-macros-actually-work-part-4.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.
