> 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/53-what-is-a-tex-token.md).

# Τι είναι ένα «διακριτικό TeX»;

## Κίνητρο για μια σειρά σχετικά με τα TeX tokens και συναφείς έννοιες

Σε αυτό το άρθρο συζητούνται το κίνητρο και η μεθοδολογία που χρησιμοποιήθηκαν για την παραγωγή μιας σειράς άρθρων σχετικά με τα TeX tokens και συναφείς έννοιες [Μια νέα σειρά άρθρων: TeX Tokens και Συναφείς Έννοιες—Αλλά γιατί (και πώς);](https://www.overleaf.com/blog/521-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how) Όπως σημειώνεται σε εκείνο το άρθρο, σε ολόκληρη αυτή τη σειρά βασίζουμε τις συζητήσεις και τις εξηγήσεις μας σε γνώσεις που αποκτήθηκαν μέσω μιας προσαρμοσμένης έκδοσης του αρχικού προγράμματος TeX του Knuth—χρησιμοποιώντας το για να παράγουμε μια σειρά άρθρων που στοχεύει να παρέχει απλές περιγραφές και εύκολες στην παρακολούθηση εξηγήσεις βασικών εννοιών του TeX.

## Εισαγωγή: ποιος είναι ο στόχος μας;

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

Ξεκινάμε παρουσιάζοντας μερικές σημαντικές εσωτερικές έννοιες του TeX: *πρωτόγονα*, *κωδικοί εντολών* και *τροποποιητές εντολών*. Από εκεί, χρησιμοποιούμε ένα πολύ απλό παράδειγμα μακροεντολής για να δούμε ακριβώς πώς το TeX επεξεργάζεται την εντολή `\def` και το token που δημιουργεί το TeX για να αναπαραστήσει αυτή την εντολή.

Συμπεραίνουμε με μια σύντομη ματιά στο πώς το TeX δημιουργεί tokens για να αναπαραστήσει χαρακτήρες και πώς το `\catcode` ενός χαρακτήρα πράγματι συνδέεται μόνιμα με ένα token χαρακτήρα—κάτι που συχνά αναφέρεται σε βιβλία για το TeX, αλλά εδώ βλέπουμε ακριβώς πώς επιτυγχάνεται αυτό.

Το ακόλουθο γραφικό δείχνει τη διαδρομή που θα συνοψίσουμε—από το κείμενο εισόδου στα tokens του TeX:

![Η διαδρομή από την είσοδο του TeX στο token του TeX.](/files/cb6b6f7f0fad1a7289442d7f8783ed3884e509c3)

## Αλλά πρώτα: πρωτόγονα και κωδικοί εντολών

Κάθε μηχανή TeX (Knuthian TeX, pdfTeX, XeTeX, LuaTeX) κατανοεί έναν αριθμό ενσωματωμένων εντολών: τα λεγόμενα *πρωτόγονα*—τα θεμελιώδη δομικά στοιχεία εντολών που στηρίζουν την προγραμματιστικότητα του TeX. Ονομάζονται «πρωτόγονα» επειδή, σε αντίθεση με τις μακροεντολές που ορίζει ο χρήστης, δεν κατασκευάζονται από άλλες εντολές και δεν μπορούν να αναχθούν περαιτέρω σε απλούστερες οδηγίες. Για το TeX του Knuth υπάρχουν περίπου 320 πρωτόγονα—αν και πρέπει να σημειώσουμε ότι άλλες μηχανές TeX όπως τα pdfTeX, XeTeX και LuaTeX έχουν προσθέσει νέες εντολές στο αρχικό πρόγραμμα του Knuth και περιέχουν πρωτόγονα που δεν υπάρχουν στο λογισμικό TeX του Knuth.

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

Ομάδες εντολών που έχουν σχετική λειτουργικότητα μοιράζονται τον ίδιο κωδικό εντολής. Για παράδειγμα, οι `\def`, `\gdef`, `\edef` και `\xdef` πρωτόγονα χρησιμοποιούνται όλα για τον ορισμό μακροεντολών και μοιράζονται τον κωδικό εντολής 97 (στο TeX του Knuth). Προφανώς, αυτές οι 4 εντολές ορισμού μακροεντολών δημιουργούν καθεμία μακροεντολές με λίγο διαφορετικό τρόπο· κατά συνέπεια, κατά την επεξεργασία, το TeX χρειάζεται έναν τρόπο να τις διακρίνει.

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

### Τροποποιητές εντολών: δύο τύποι

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

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

#### Τροποποιητές εντολών Τύπου 1 (ένα παράδειγμα)

Όπως σημειώθηκε, στο TeX του Knuth οι τέσσερις πρωτόγονες εντολές για τον ορισμό μακροεντολών: `\def`, `\gdef`, `\edef`, `\xdef` μοιράζονται όλες τον κωδικό εντολής 97: διαφοροποιούνται μέσω των τροποποιητών εντολής τους, οι οποίοι παρατίθενται στον ακόλουθο πίνακα:

| Εντολή  | <p>Κωδικός<br>εντολής</p> | <p>Τροποποιητής<br>εντολής</p> |
| ------- | ------------------------- | ------------------------------ |
| `\def`  | 97                        | 0                              |
| `\gdef` | 97                        | 1                              |
| `\edef` | 97                        | 2                              |
| `\xdef` | 97                        | 3                              |

Ως δεύτερο παράδειγμα, ο Knuth αποφάσισε να υλοποιήσει τις εντολές `\openout`, `\write`, `\closeout`, `\special`, `\immediate` και `\setlanguage` ως «επεκτάσεις» του TeX, αποκλειστικά για να δείξει πώς μπορείτε να προσθέσετε νέα πρωτόγονα στο TeX. Σε αυτή την περίπτωση, αυτές οι εντολές δεν μοιράζονται πραγματικά «παρόμοια λειτουργικότητα», πέρα από το ότι ο Knuth αποφάσισε να τις ομαδοποιήσει για τους σκοπούς της εξήγησης του πώς να επεκτείνετε το TeX. Αυτές οι 6 εντολές ταξινομούνται ως «επεκτάσεις» και ομαδοποιούνται με την τιμή κωδικού εντολής 59, αλλά καθεμία έχει έναν κατάλληλο τροποποιητή εντολής για να διαφοροποιείται από τις άλλες:

| Εντολή         | <p>Κωδικός<br>εντολής</p> | <p>Τροποποιητής<br>εντολής</p> |
| -------------- | ------------------------- | ------------------------------ |
| `\openout`     | 59                        | 0                              |
| `\write`       | 59                        | 1                              |
| `\closeout`    | 59                        | 2                              |
| `\special`     | 59                        | 3                              |
| `\immediate`   | 59                        | 4                              |
| `\setlanguage` | 59                        | 5                              |

#### Τροποποιητές εντολών Τύπου 2 (μια σύντομη εξήγηση)

Παρόλο που όλοι οι τροποποιητές εντολών είναι ακέραιοι, οι τροποποιητές Τύπου 2 χρειάζονται λίγη περισσότερη εξήγηση. Αυτοί οι τροποποιητές εντολών αναφέρονται στο TeX ως «δείκτες» επειδή δείχνουν σε μια θέση στη μνήμη όπου το TeX μπορεί να βρει πρόσθετες πληροφορίες για εκείνη την εντολή. Αυτό ίσως ακούγεται λίγο ασαφές, αλλά ο τρόπος με τον οποίο το TeX χρησιμοποιεί αυτούς τους δείκτες για την αναζήτηση πληροφοριών είναι αρκετά ποικίλος και μια πληρέστερη εξήγηση θα απομάκρυνε από τον κεντρικό στόχο αυτού του άρθρου. Ένα παράδειγμα ίσως βοηθήσει: οι μακροεντολές. Όταν ορίζεται μια εντολή μακροεντολής, το TeX θα χρειαστεί να αποθηκεύσει το κείμενο αντικατάστασης κάπου στη μνήμη. Όπως θα δούμε παρακάτω, οι μακροεντολές που ορίζει ο χρήστης έχουν κωδικούς εντολής μεταξύ 111 και 114, με έναν τροποποιητή εντολής που είναι δείκτης στη μνήμη και λέει στο TeX πού είναι αποθηκευμένο το κείμενο αντικατάστασής τους (ο ορισμός της μακροεντολής).

### Κωδικοί εντολών: επεκτάσιμες και μη επεκτάσιμες

Στον πηγαίο κώδικα του Knuth για το TeX οι κωδικοί εντολών κυμαίνονται από 0 έως 120—σημειώστε ότι ορισμένοι κωδικοί μέσα σε αυτό το εύρος προορίζονται αποκλειστικά για εξειδικευμένη εσωτερική χρήση και δεν αντιστοιχίζονται σε εντολές προσβάσιμες στον χρήστη. Αξίζει να σημειωθεί ότι άλλες μηχανές TeX όπως τα pdfTeX, XeTeX και LuaTeX έχουν όλες προσθέσει νέες εντολές στο αρχικό σύνολο του Knuth και περιέχουν περισσότερα πρωτόγονα και αντίστοιχους κωδικούς εντολών· ωστόσο, οι αρχές που περιγράφονται εδώ είναι θεμελιώδεις για όλες τις μηχανές που βασίζονται στο TeX και προέρχονται από τον πηγαίο κώδικα του Knuth.

Η συλλογή των κωδικών εντολών χωρίζεται σε δύο κύρια σύνολα:

* *μη επεκτάσιμες εντολές*: έχουν κωδικούς εντολών μικρότερους ή ίσους με το 100;
* *επεκτάσιμες εντολές*: έχουν κωδικούς εντολών μεγαλύτερους από 100, με μέγιστη τιμή το 120. Το εύρος 101 έως 120 περιλαμβάνει μακροεντολές που ορίζει ο χρήστης καθώς και εντολές όπως οι `\csname`, `\expandafter` και `\the`.

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

Όπως σημειώθηκε παραπάνω, όλες οι μακροεντολές (εντολές που ορίζει ο χρήστης) λαμβάνουν κωδικούς εντολών μεταξύ 111 και 114: οι διαφορετικές τιμές αντικατοπτρίζουν το αν η μακροεντολή ορίστηκε ως `\long`, `\outer`, και τα δύο ή κανένα από τα δύο. Ορίστε ένα παράδειγμα:

| Τύπος μακροεντολής | Παράδειγμα                     | Σχόλιο                        |
| ------------------ | ------------------------------ | ----------------------------- |
| Μη long, μη outer  | `\def\ohyeah{....}`            | `\ohyeah` κωδικός εντολής=111 |
| Long, μη outer     | `\long\def\ohyeah{....}`       | `\ohyeah` κωδικός εντολής=112 |
| Μη long, outer     | `\outer\def\ohyeah{....}`      | `\ohyeah` κωδικός εντολής=113 |
| Long outer         | `\long\outer\def\ohyeah{....}` | `\ohyeah` κωδικός εντολής=114 |

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

## Η διαδρομή από το κείμενο εισόδου στα tokens του TeX

Σε αυτή την ενότητα θα χρησιμοποιήσουμε ένα πολύ απλό παράδειγμα μακροεντολής για να δούμε ακριβώς πώς το TeX επεξεργάζεται την εντολή `\def` για να δημιουργήσει ένα token που αναπαριστά την `\def` εντολή. Η λεπτομερής επεξεργασία του TeX μπορεί να είναι εξαιρετικά περίπλοκη, οπότε δεν χρησιμοποιούμε παραμέτρους μακροεντολών ή οριοθέτες, επειδή αυτό θα πρόσθετε πολυπλοκότητα και θα αποσπούσε την προσοχή από τη διαδρομή μας.

Ας υποθέσουμε ότι το αρχείο εισόδου σας στο TeX περιέχει την ακόλουθη γραμμή:

```latex
\def\ohyeah{Το Overleaf είναι φοβερό!}
```

Καθώς το TeX αρχίζει να επεξεργάζεται αυτή τη γραμμή εισόδου, ελέγχει το `\catcode` κάθε χαρακτήρα και βλέπει ότι ο πρώτος χαρακτήρας είναι `\` (πρώτος χαρακτήρας του `\def`). Ανιχνεύει (τον αναζητά σε έναν εσωτερικό πίνακα) ότι το `\` έχει `\catcode` 0, που σημαίνει ότι εισάγει την αρχή μιας *ακολουθίας ελέγχου*. Φυσικά, μπορείτε να επαναορίσετε οποιονδήποτε χαρακτήρα ώστε να έχει `\catcode` 0, αλλά θα υποθέσουμε ότι χρησιμοποιούνται οι συμβατικοί ορισμοί του plain TeX ή της LaTeX.

Αυστηρά μιλώντας, ο όρος *ακολουθίας ελέγχου* έχει δύο υποκατηγορίες: *control word* και *control symbol*:

* *control word*: μια ακολουθία χαρακτήρων με `\catcode` γράμμα (11);
* *control symbol*: ένας μεμονωμένος χαρακτήρας του οποίου το `\catcode` είναι *όχι* γράμμα (11).

Σε αυτό το σημείο, ο `\` χαρακτήρας έχει κάνει τη δουλειά του και πλέον έχει τελειώσει. Όταν ανιχνεύεται ένας χαρακτήρας διαφυγής, η αντίδραση του TeX είναι να αρχίσει να διαβάζει όλους τους επόμενους χαρακτήρες στην είσοδο με στόχο να ανιχνεύσει μια control word ή ένα control symbol.

Μετά τον αρχικό `\`, το TeX ανιχνεύει αμέσως το `d`: ένας χαρακτήρας του οποίου το `\catcode` είναι 11, κάτι που λέει στο TeX ότι βρήκε το πρώτο γράμμα μιας *control word*. Συνεχίζει να σαρώνει τους επόμενους χαρακτήρες μέχρι να ανιχνεύσει τελικά έναν χαρακτήρα που *δεν* έχει `\catcode` γράμμα (11). Όλοι οι επόμενοι χαρακτήρες (μετά τον αρχικό `\`) με `\catcode` 11 (γράμμα) θεωρούνται ότι σχηματίζουν το όνομα μιας control word: δηλαδή, το όνομα μιας εντολής—ίσως μιας μακροεντολής ή ενός πρωτογόνου, αλλά το TeX, προς το παρόν, δεν έχει ιδέα ποιος τύπος εντολής είναι. Σε αυτό το σημείο είναι απλώς μια συμβολοσειρά χαρακτήρων.

Έτσι, στο παράδειγμά μας το TeX σαρώνει ευχαρίστως, ελέγχοντας κάθε χαρακτήρα, μέχρι να φτάσει το αρχικό `\` του `\ohyeah` που επίσης έχει `\catcode` 0. Το TeX αναγνωρίζει ότι σάρωσε υπερβολικά μακριά και ευγενικά επιστρέφει αυτό το `\` πίσω στη ροή κειμένου ώστε να γίνει ο επόμενος χαρακτήρας που θα φανεί κατά την περαιτέρω σάρωση του κειμένου. Σε αυτό το σημείο, το TeX έχει αναγνωρίσει μια συμβολοσειρά (`def`) την οποία γνωρίζει ότι σχηματίζει το κείμενο μιας control word που αποτελείται από τρεις χαρακτήρες, καθένας με `\catcode` 11 (`d`, `e` και `f`). Αυτό που χρειάζεται τώρα να κάνει το TeX είναι να μάθει τι `def` σημαίνει: τι κάνει; Όπως ίσως μαντέψατε, το TeX πρέπει να βρει τον κωδικό εντολής και το αναγνωριστικό εντολής για το `def` ώστε να μπορέσει να υπολογίσει τι πρέπει να κάνει με αυτή την εντολή.

## Κάνοντας ένα hash

Αφού ανιχνεύσει μια control word (`def`), το πρώτο πράγμα που κάνει το TeX είναι να «μετατρέψει» τη συμβολοσειρά χαρακτήρων (`def` στο παράδειγμά μας) σε έναν ακέραιο αριθμό χρησιμοποιώντας κάτι που ονομάζεται συνάρτηση κατακερματισμού. Δεν χρειάζεται να ανησυχούμε υπερβολικά για τις λεπτομέρειες· μια γενική περιγραφή αρκεί. Στην ουσία, το TeX εξετάζει κάθε χαρακτήρα στην control word που μόλις ανίχνευσε και χρησιμοποιεί την τιμή του κωδικού ASCII (ή την τιμή Unicode για XeTeX/LuaTeX) κάθε χαρακτήρα για να υπολογίσει έναν αριθμό που ονομάζεται τιμή hash: είναι απλώς ένας απλός ακέραιος.

Ως μέρος αυτής της διαδικασίας υπολογισμού hash το TeX θα ελέγξει επίσης αν η συμβολοσειρά χαρακτήρων στην newly-detected control word είναι ήδη γνωστή σε αυτό. Το κείμενο σε αναγνώσιμη μορφή όλων των εντολών, είτε πρόκειται για πρωτόγονα είτε για μακροεντολές που ορίζει ο χρήστης, αποθηκεύεται σε μια εσωτερική περιοχή αποθήκευσης που ονομάζεται *δεξαμενή συμβολοσειρών*. Το TeX πρέπει να το κάνει αυτό επειδή ίσως χρειαστεί να εξάγει το αναγνώσιμο από άνθρωπο όνομα μιας εντολής—για παράδειγμα, όταν το TeX χρειάζεται να αναφέρει ένα σφάλμα και να δώσει το όνομα της προβληματικής εντολής. Για παράδειγμα, η μακροεντολή μας `\def\ohyeah{Το Overleaf είναι φοβερό!}` ορίζει μια νέα εντολή που ονομάζεται `\ohyeah` και το TeX θα χρειαστεί (σε μεταγενέστερο στάδιο) όχι μόνο να υπολογίσει μια τιμή hash για το `ohyeah` (*χωρίς* τον αρχικό `\` χαρακτήρα) αλλά και να αποθηκεύσει τη συμβολοσειρά κειμένου (αναγνώσιμη από άνθρωπο) σε περίπτωση που χρειαστεί να τη χρησιμοποιήσει για αναφορά σφάλματος (ή για άλλες εργασίες).

Αν θέλετε περισσότερες λεπτομέρειες σχετικά με τις διαδικασίες χειρισμού συμβολοσειρών του TeX, έχω γράψει γι’ αυτό στο [προσωπικό μου ιστολόγιο](http://www.readytext.co.uk/?p=3590).

Το τελικό αποτέλεσμα είναι ότι η συμβολοσειρά χαρακτήρων που αναπαριστά την εντολή `def` μετατρέπεται στην αριθμητική τιμή 1218 (αυτή είναι η πραγματική τιμή που υπολογίζει το TeX). Σε αυτό το σημείο οι μεμονωμένοι χαρακτήρες `d`, `e` και `f` δεν αποτελούν πλέον μέρος της κύριας ιστορίας—έχουν ήδη διαβαστεί από την είσοδο και έκαναν τη δουλειά τους: από εδώ και πέρα το θέμα είναι ακέραιοι και *διακριτικών*—σε λίγο θα δούμε τι ακριβώς είναι ένα token! Εσωτερικά, το TeX αναφέρεται σε αυτούς τους αριθμούς hash ως το *τρέχουσα ακολουθία ελέγχου* αλλά στον πηγαίο κώδικα ο όρος αυτός συντομεύεται σε μια μεταβλητή που ονομάζεται `curcs`. Ο πηγαίος κώδικας του TeX είναι γεμάτος από πολύ σύντομα, συχνά μάλλον αινιγματικά, ονόματα μεταβλητών.

Αλλά τι κάνει το TeX *στην πραγματικότητα* με αυτή τη φρεσκοδημιουργημένη ακέραια τιμή 1218; Πώς μαθαίνει το TeX ότι η αρχική συμβολοσειρά `def`, που τώρα αναπαρίσταται από τον ακέραιο 1218, αναφέρεται στην πραγματικότητα σε μια οδηγία για τον ορισμό μιας μακροεντολής; Η απάντηση είναι ότι το TeX έχει ένα είδος εσωτερικού «ντουλαπιού αρχειοθέτησης» όπου αποθηκεύει την τρέχουσα σημασία και τιμή κάθε εντολής για την οποία γνωρίζει αυτή τη στιγμή—είτε αυτή η εντολή είναι μια μακροεντολή που ορίζει ο χρήστης είτε ένα ενσωματωμένο πρωτόγονο. Ο λόγος που το TeX μπήκε στον κόπο να μετατρέψει το `def` στην τιμή hash 1218 (που τώρα αποθηκεύεται στη μεταβλητή που ονομάζεται `curcs`) είναι για να το χρησιμοποιήσει για την αναζήτηση του *νοήματος* του `def`. Το TeX, φυσικά, θα επαναλάβει αυτή την άσκηση υπολογισμού hash για όλες τις control words που ανιχνεύει στην είσοδο—αν και, φυσικά, διαφορετικές control words δίνουν διαφορετικές ακέραιες τιμές από τη συνάρτηση κατακερματισμού: αυτό είναι όλο το νόημα.

Το εσωτερικό «ντουλάπι αρχειοθέτησης» του TeX ονομάζεται *πίνακας ισοδυνάμων* και είναι το θέμα της επόμενης ενότητας.

### Συμβουλευόμενοι τον πίνακα ισοδυνάμων

Για να συνοψίσουμε, ας δούμε τι έχουμε μάθει μέχρι τώρα:

* `\` εισάγει την αρχή μιας ακολουθίας ελέγχου (είτε μιας *control symbol* ή μιας *control word*).
* Αν ο πρώτος χαρακτήρας μετά το `\` έχει `\catcode` είναι 11 (γράμμα), τότε είναι η αρχή μιας *control word*.
* Για *control words* Το TeX σαρώνει για να ελέγξει όλους τους επόμενους χαρακτήρες εισόδου που έχουν `\catcode` 11 και θα σταματήσει να σαρώνει μόλις βρει τον πρώτο χαρακτήρα που *όχι* έχει `\catcode` τιμή 11.
* Η συμβολοσειρά των χαρακτήρων εισόδου (που ακολουθούν το `\`) και οι οποίοι έχουν `\catcode` 11 θεωρείται ότι είναι μια *control word* που ο χρήστης έχει πληκτρολογήσει: μια εντολή που ζητά από το TeX να «κάνει κάτι».
* Για να ξεκινήσει η διαδικασία του «να κάνει κάτι», το TeX μετατρέπει τη συμβολοσειρά χαρακτήρων της control word σε έναν ακέραιο. Το κάνει αυτό χρησιμοποιώντας μια λεγόμενη συνάρτηση κατακερματισμού που παράγει έναν ακέραιο.
* Ο ακέραιος (υπολογισμένη τιμή hash) αναφέρεται ως ο *τρέχουσα ακολουθία ελέγχου*, αλλά το TeX του δίνει το μικρότερο όνομα `curcs`.
* Στο παράδειγμά μας, η control word `def` μετατρέπεται στην τιμή 1218—η οποία αποθηκεύεται σε μια μεταβλητή που ονομάζεται `curcs`: δηλαδή, `curcs=1218`.

Το TeX τώρα χρειάζεται να μάθει τι σημαίνει στην πραγματικότητα η newly detected *τρέχουσα ακολουθία ελέγχου* —τι κάνει το TeX με αυτό;

#### Σημείωση για την ομαδοποίηση: η ανάγκη αποθήκευσης και επαναφοράς πληροφοριών

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

Όποιος έχει γράψει έστω και την απλούστερη μακροεντολή θα πρέπει να γνωρίζει τον μηχανισμό ομαδοποίησης του TeX—για παράδειγμα, χρησιμοποιώντας `\def` για να δημιουργεί μακροεντολές μέσα σε μια ομάδα. Εκτός αν εφαρμόσετε το `\global` πρόθεμα στις μακροεντολές που δημιουργούνται με `\def`οι οποίες ορίζονται μέσα σε μια ομάδα, η τιμή ή η σημασία εκείνης της μακροεντολής διατηρείται μόνο μέσα σε εκείνη την ομάδα (και στις υποομάδες της): ο ορισμός της χάνεται όταν η ομάδα τελειώσει. Για παράδειγμα, αν ορίσετε μια απλή μακροεντολή μέσα σε μια ομάδα, όπως εδώ:

```latex
{\def\foo{Hello}}
```

και προσπαθήσετε να χρησιμοποιήσετε το `\foo` εκτός της ομάδας

```latex
{\def\foo{Hello}}% \foo ορίζεται μέσα σε μια ομάδα (σημείωση: χωρίς χρήση του \global)
\foo %<--- δεν ορίζεται πλέον, τώρα είναι αόριστο
```

τότε παίρνουμε το αγαπημένο σφάλμα: `Αόριστη ακολουθία ελέγχου`. `\foo` έχει νόημα μόνο μέσα στην ομάδα (και στις υποομάδες της) μέσα στην οποία ορίστηκε. Επιπλέον, όταν επαναορίζετε μια μακροεντολή μέσα σε μια ομάδα, η νέα τιμή μπορεί να χαθεί όταν η ομάδα τελειώσει και αποκαθίσταται η προηγούμενη σημασία (που υπήρχε εκτός της ομάδας).

```latex
\def\foo{Goodbye}
\foo\par% Εμφανίζει Goodbye
{\def\foo{Hello}% Επαναορίζεται μέσα σε μια ομάδα:
{Μέσα σε ομάδα 2ου επιπέδου: \foo\par}}% Χρήση μέσα σε ομάδα 2ου επιπέδου: \foo εμφανίζει Hello
Εκτός ομάδας, η παλιά τιμή αποκαθίσταται: \foo\par% Εμφανίζει Goodbye
```

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

### Ο πίνακας ισοδυνάμων: κατ’ αναλογία

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

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

Το TeX χρησιμοποιεί το 1218 για να εντοπίσει το σωστό συρτάρι και εκεί βρίσκει ένα μικρό σημείωμα που περιέχει τρία κομμάτια πληροφοριών, των οποίων τα ονόματα είναι αυτά που χρησιμοποιούνται στον πηγαίο κώδικα του TeX:

* **`eq_level:`** το επίπεδο ομαδοποίησης στο οποίο ορίστηκε αυτή η καταχώριση (επίπεδο 1 = ορισμένο καθολικά). Είδαμε παραπάνω τα αποτελέσματα της ομαδοποίησης σε δράση: εδώ στον πίνακα ισοδυνάμων αποθηκεύεται αυτή η πληροφορία του επιπέδου ομαδοποίησης;
* **`eq_type:`** ο κωδικός εντολής για αυτή την καταχώριση;
* **`equiv:`** τρέχουσα «τιμή» αυτής της καταχώρισης—μπορεί να είναι ένας απλός ακέραιος όπως ο τροποποιητής εντολής που αναφέρθηκε παραπάνω ή ένας δείκτης σε μια περιοχή της μνήμης· για παράδειγμα, η θέση μνήμης για τη συλλογή tokens που αναπαριστούν έναν ορισμό μακροεντολής.

Έτσι, η τιμή hash 1218 μας (που είναι αποθηκευμένη στη μεταβλητή `curcs`) έχει, στην ουσία, χρησιμοποιηθεί ως το *κλειδί* για να αποκτήσουμε πρόσβαση σε ένα συρτάρι που περιέχει την τρέχουσα σημασία και τιμή της εντολής που αρχικά πληκτρολογήσαμε ως τη συμβολοσειρά των γραμμάτων `\def`.

Στον πηγαίο κώδικα του προγράμματος TeX, το `eq_type` για οποιαδήποτε εντολή αποθηκεύεται χρησιμοποιώντας μια μεταβλητή που ονομάζεται `curcmd` και η τιμή του `equiv` αποθηκεύεται σε μια μεταβλητή που ονομάζεται `curchr`.

### Τι λέει ο πίνακας ισοδυνάμων για το def;

Όπως σημειώθηκε, η τιμή hash που υπολογίζεται για οποιαδήποτε εντολή αποθηκεύεται σε μια μεταβλητή που ονομάζεται `curcs`· επομένως για το `def` έχουμε `curcs=1218`. Αν κοιτάξουμε στη θέση 1218 στον πίνακα ισοδυνάμων, το TeX θα βρει τις ακόλουθες πληροφορίες:

* `curcmd`=97. Αυτός είναι ο κωδικός εντολής για το `\def`;
* `curchr`=0. Αυτός είναι ο τροποποιητής εντολής για το `\def`.

`\def` είναι μια πρωτόγονη (ενσωματωμένη) εντολή TeX και, εκτός αν έχει επαναοριστεί κάπου, το τρίτο και τελευταίο κομμάτι πληροφορίας θα πρέπει να είναι `eq_level=1` υποδεικνύοντας ότι η σημασία του `\def` ορίζεται καθολικά και δεν περιορίζεται σε κάποιο χαμηλότερο επίπεδο ομαδοποίησης. Εσωτερικά, η τιμή του `eq_level` που συνδέεται με μια εντολή παίζει εξαιρετικά σημαντικό ρόλο στον μηχανισμό ομαδοποίησης του TeX, αλλά δεν θα το εξετάσουμε περαιτέρω.

Το ακόλουθο γραφικό συνοψίζει την εξήγηση που διανύσαμε:

![Η διαδρομή από την είσοδο του TeX στο token του TeX.](/files/cb6b6f7f0fad1a7289442d7f8783ed3884e509c3)

## Tokens του TeX για εντολές

Αφού περάσαμε μέσα από τις παραπάνω εξηγήσεις, ο πραγματικός υπολογισμός των tokens του TeX για ακολουθίες ελέγχου αποδεικνύεται στην πραγματικότητα πραγματικά πολύ απλός. Το TeX χρησιμοποιεί την τιμή του `curcs` (1218) από τη συνάρτηση κατακερματισμού για να δημιουργήσει έναν απλό ακέραιο τον οποίο ονομάζει *token*token `curcs` Ο υπολογισμός για τη δημιουργία ενός token από την τιμή του

```c
είναι:
```

curtok = 4095 + curcs `curtok`.

Άρα, ως συμπέρασμα, το token του TeX που αναπαριστά το `\def` εντολής είναι `4095 + 1218 = 5313`. Και αυτό είναι όλο για τα tokens του TeX που αναπαριστούν ακολουθίες εντολών: είναι απλώς ένας ακέραιος αριθμός που υπολογίζεται από μια τιμή πίνακα κατακερματισμού συν 4095.

## Tokens του TeX για χαρακτήρες

Όταν το TeX χρειάζεται να δημιουργήσει ένα token που αναπαριστά έναν χαρακτήρα, χρησιμοποιεί τον ακόλουθο, εξίσου απλό, υπολογισμό:

```c
curtok = 256*catcode + (ASCII value of character)
```

Σημειώστε ότι χρησιμοποιούνται ελαφρώς διαφορετικοί υπολογισμοί για μηχανές που υποστηρίζουν Unicode, όπως το LuaTeX.

Για παράδειγμα, το token του TeX που αναπαριστά έναν χαρακτήρα κενού με `\catcode` 10 και τιμή ASCII 32 είναι:

```c
256*10 + 32 = 2592
```

### Λίστες tokens που περιέχουν χαρακτήρες

Όταν δημιουργείτε μια απλή λίστα tokens με, για παράδειγμα,

```latex
\toks100={Hello}
```

Το TeX θα δημιουργήσει την ακόλουθη λίστα tokens και θα την αποθηκεύσει στη μνήμη για μελλοντική χρήση:

* H→ 256 × 11 + 72 = 2888
* e→ 256 × 11 + 101 = 2917
* l→ 256 × 11 +108 = 2924
* l→ 256 × 11 +108 = 2924
* o→256 × 11 + 111 = 2927

Βαθιά μέσα στη μνήμη του TeX, ο καταχωρητής tokens 100 θα παρέχει πρόσβαση στη θέση αποθήκευσης του «Hello», αποθηκευμένου ως 5 τιμές token: 2888, 2917, 2924, 2924, 2927. Σημειώστε ότι αυτά τα tokens συνδυάζουν τον κωδικό ASCII κάθε χαρακτήρα και την τιμή του `\catcode`όταν εκείνοι μετατρέπονται σε tokens (tokenized). Μόλις οι χαρακτήρες μετατραπούν σε tokens χαρακτήρων, η `\catcode` τιμή που συνδέεται με αυτούς είναι μόνιμη και αποθηκεύεται μέσα στα tokens για μελλοντική χρήση όταν ο χρήστης πει, για παράδειγμα, `\the\toks100`.

Όπως σημειώθηκε, ένα token χαρακτήρα υπολογίζεται από `256*catcode + (ASCII value)` ενώ ένα token ακολουθίας ελέγχου υπολογίζεται από `4095 + curcs` όπου `curcs` είναι η τιμή hash της control word (συμβολοσειρά κειμένου μιας εντολής που πληκτρολόγησε ο χρήστης) η οποία ανιχνεύεται στην είσοδο από το TeX. Αξίζει να σημειωθεί ότι τα tokens χαρακτήρων είναι πάντα μικρότερα από 4095. Έτσι το TeX μπορεί εύκολα να καθορίσει αν ένα συγκεκριμένο token αναπαριστά μια ακολουθία ελέγχου (μια εντολή) ή έναν χαρακτήρα και στη συνέχεια να υπολογίσει ποια ακολουθία ελέγχου ή ποιος χαρακτήρας και `\catcode` ζεύγος είναι κωδικοποιημένο μέσα σε αυτό το token.


---

# 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/53-what-is-a-tex-token.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.
