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

# Τι είναι μια λίστα διακριτικών TeX

## Λοιπόν, τι ακριβώς είναι μια «λίστα διακριτικών TeX»;

Σε ένα [προηγούμενο άρθρο](/latex/el/se-vathos-arthra/53-what-is-a-tex-token.md)—επίσης μέρος αυτής [σειρά για χαμηλού επιπέδου TeXνικές λεπτομέρειες](/latex/el/se-vathos-arthra/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md)—εξερευνήσαμε τις διαδικασίες μέσω των οποίων το TeX σαρώνει το `.tex` αρχείο σας για να δημιουργήσει νέα διακριτικά: εξετάσαμε τη θεμελιώδη φύση ενός διακριτικού TeX και πώς το TeX τα δημιουργεί (βλ. [Τι είναι ένα «TeX token»;](/latex/el/se-vathos-arthra/53-what-is-a-tex-token.md)).

Σε αυτό το επόμενο άρθρο ρίχνουμε μια ματιά στις *λίστα διακριτικών*ς: τι είναι και πώς τα δημιουργούν/χρησιμοποιούν οι μηχανές TeX. Η κατανόηση των λιστών διακριτικών μπορεί να είναι δύσκολη, επειδή αποθηκεύονται βαθιά στα εσωτερικά του TeX: αυτές οι λεπτομέρειες είναι κρυμμένες από τον χρήστη—αν και σήμερα αυτό δεν ισχύει πάντα, αν κάνετε πιο προχωρημένο προγραμματισμό με το LuaTeX. Προς το παρόν, μπορείτε να αρχίσετε να σκέφτεστε τις λίστες διακριτικών ως τον τρόπο του TeX να αποθηκεύει μια σειρά ακέραιων τιμών, όπου κάθε ακέραιος είναι ένα διακριτικό που προέρχεται από έναν χαρακτήρα ή μια εντολή που το TeX διάβασε από το αρχείο εισόδου σας.

Οι λίστες διακριτικών παίζουν καθοριστικό ρόλο στην εσωτερική λειτουργία του TeX, συχνά με κάπως εκπληκτικούς τρόπους, όπως στην εσωτερική λειτουργία εντολών όπως η `\uppercase` και `\lowercase`. Μια ιδιαίτερα σημαντική χρήση των λιστών διακριτικών είναι η αποθήκευση και εκτέλεση μακροεντολών, ένα θέμα που θα εξετάσουμε λεπτομερώς σε μελλοντικό άρθρο αυτής της σειράς.

### Το TeX παίρνει την είσοδό του από αρχεία και λίστες διακριτικών

Οι μηχανές TeX έχουν τρεις πηγές εισόδου—δύο από τις οποίες ίσως γνωρίζετε:

* φυσικά αρχεία κειμένου αποθηκευμένα στον δίσκο·
* κείμενο που πληκτρολογεί ο χρήστης στο τερματικό (γραμμή εντολών)·

αλλά έχει επίσης έναν τρίτο τρόπο ανάγνωσης/λήψης εισόδου: τις λίστες διακριτικών!

Οι λίστες διακριτικών είναι, στην ουσία, μια εσωτερική εγκατάσταση αποθήκευσης δεδομένων που το TeX χρησιμοποιεί ως μέρος των λειτουργιών του. Επειδή οι λίστες διακριτικών του TeX λειτουργούν ως «χώρος αποθήκευσης» για διακριτικά που έχουν δημιουργηθεί προηγουμένως, είναι λογικό το TeX να μπορεί να τις επαναχρησιμοποιεί ως άλλη πηγή εισόδου. Όταν χρειαστεί να πάρει την επόμενη είσοδό του από μια συγκεκριμένη λίστα διακριτικών (ή όταν του δοθεί αυτή η εντολή), το TeX θα σταματήσει προσωρινά να διαβάζει είσοδο από ένα φυσικό αρχείο (δηλαδή να δημιουργεί *νέα διακριτικά*) και θα στραφεί στη λήψη της εισόδου του από *υπάρχοντα διακριτικά*: τη θέση στη μνήμη όπου είναι αποθηκευμένη η λίστα διακριτικών. Προφανώς, με μια λίστα διακριτικών η διαδικασία σάρωσης + δημιουργίας διακριτικών έχει ήδη λάβει χώρα, οπότε το TeX απλώς χρειάζεται να κοιτάξει κάθε διακριτικό στη λίστα και να αποφασίσει τι θα κάνει με το καθένα.

Για ένα σύντομο παράδειγμα, η χαμηλού επιπέδου (πρωτογενής εντολή TeX) `\toks` εντολή σας επιτρέπει να δημιουργήσετε μια λίστα διακριτικών που το TeX αποθηκεύει στη μνήμη για μελλοντική επαναχρησιμοποίηση:

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

Για να ανακτήσετε αυτά τα διακριτικά (δηλαδή να πείτε στο TeX να τα αντιμετωπίσει ως την επόμενη πηγή εισόδου του) θα δίνατε μια εντολή όπως

```latex
\the\toks100
```

Αυτό θα κάνει το TeX να αλλάξει από τη δημιουργία νέων διακριτικών από το αρχείο εισόδου σας στη λήψη του επόμενου από το σημείο όπου είναι αποθηκευμένα εκείνα τα διακριτικά (που δημιουργήθηκαν από `\toks`)—σε μια λεγόμενη *μητρώο διακριτικών* που είναι απλώς μια εσωτερική θέση μνήμης γνωστή στο TeX (εδώ είναι ο καταχωρητής 100).

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

```latex
\string\mymacro
```

δημιουργεί μια σειρά διακριτικών χαρακτήρων για κάθε γράμμα στο όνομα `\mymacro`—συμπεριλαμβανομένου του αρχικού `\` χαρακτήρα. Θα ρίξουμε μια πιο προσεκτική ματιά σε ορισμένες «εντολές δημιουργίας διακριτικών» στο τέλος αυτού του άρθρου.

## Λίστα διακριτικών: Εξήγηση με αναλογία

Εκτός αν έχετε υπόβαθρο στον προγραμματισμό και/ή κάποια γνώση της επιστήμης των υπολογιστών, οι «λίστες διακριτικών» μπορεί να είναι κάπως ασαφής έννοια και, ίσως, λίγο μπερδευτική. Ωστόσο, αν θέλετε να γίνετε έμπειροι στη συγγραφή μακροεντολών TeX/LaTeX, τότε η καλή κατανόηση θεμάτων όπως τα διακριτικά του TeX, οι λίστες διακριτικών και οι κωδικοί κατηγοριών (`\catcode`) θα αποδειχθεί εξαιρετικά χρήσιμη.

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

### Λίστες διακριτικών: Μια αναλογία (πείραμα σκέψης)

Θα δουλέψουμε πάνω σε ένα «πείραμα σκέψης» για να δώσουμε μια βάση κατανόησης των λιστών διακριτικών TeX. Φανταστείτε ότι είχατε πρόσβαση σε ένα μεγάλο σύνολο από δοχεία, όπως εκατοντάδες κουτιά κονσέρβας—δεν μπορούμε να χρησιμοποιήσουμε τον όρο «box» για να περιγράψουμε τα δοχεία του πειράματος σκέψης μας, γιατί, φυσικά, το «box» έχει πολύ συγκεκριμένη σημασία στο TeX, εντελώς άσχετη με τη συζήτησή μας εδώ. Έτσι θα ονομάσουμε τα δοχεία μας «Κονσέρβες», όπου κάθε Κονσέρβα:

* έχει έναν μοναδικό αριθμό αναγνώρισης τυπωμένο στο εξωτερικό της·
* είναι (εσωτερικά) χωρισμένη σε δύο διαμερίσματα.

Αυτά τα δύο διαμερίσματα έχουν σχεδιαστεί ως εξής:

* το αριστερό διαμέρισμα κρατά το αντικείμενο που θέλετε να βάλετε στην Κονσέρβα·
* το δεξί διαμέρισμα είναι σχεδιασμένο για να κρατά ένα κομμάτι χαρτί πάνω στο οποίο μπορείτε να γράψετε έναν μόνο αριθμό: τον αριθμό που αναγνωρίζει μια άλλη Κονσέρβα.

![δοκιμή](/files/b4d1bf332bccf8d44afcbb96edddb34ab734a22b)

Ας υποθέσουμε ότι έχετε μια συλλογή από, ας πούμε, 5 αντικείμενα και θέλετε να αποθηκεύσετε αυτή τη συλλογή μέσα σε αυτές τις Κονσέρβες· αλλά, δυστυχώς, κάθε Κονσέρβα μπορεί να χωρέσει μόνο 1 αντικείμενο του τύπου που θέλετε να αποθηκεύσετε.

Για απλότητα, ας υποθέσουμε ότι θέλουμε να αποθηκεύσουμε 5 χρωματιστούς κύκλους:

![{{{alt}}}](/files/fb03a852d71c3a434bfdfa26620a862b095484c6)

Επιπλέον, όταν επιστρέψετε για να ανακτήσετε αυτά τα αντικείμενα από το σύστημα αποθήκευσής σας (Κονσέρβες), αυτά τα αντικείμενα *πρέπει* να ανακτηθούν/βρεθούν με μια συγκεκριμένη σειρά—τη σειρά με την οποία αποθηκεύτηκαν: αυτή η ακολουθία πρέπει να διατηρηθεί. Πώς μπορείτε να το πετύχετε αυτό;

Μπορούμε να εκμεταλλευτούμε το γεγονός ότι κάθε Κονσέρβα:

* έχει έναν μοναδικό αριθμό αναγνώρισης προσαρτημένο στο εξωτερικό της·
* έχει 2 διαμερίσματα—από τα οποία μόνο 1 θα χρησιμοποιήσουμε για να περιέχει το αντικείμενό μας, ενώ το άλλο περιέχει ένα κομμάτι χαρτί με γραμμένο πάνω του τον αριθμό μιας άλλης Κονσέρβας.

Θα υποθέσουμε ότι κάθε Κονσέρβα είναι άδεια—αλλά τίποτα δεν σας εμποδίζει να ανοίξετε οποιαδήποτε συγκεκριμένη Κονσέρβα για να ελέγξετε αν είναι άδεια· αν δεν είναι, δοκιμάστε την επόμενη μέχρι να βρείτε μια άδεια Κονσέρβα.

Αυτό που θα μπορούσαμε να κάνουμε είναι το εξής. Βάζουμε το πρώτο αντικείμενό μας (σκούρος πράσινος κύκλος) σε μία από τις Κονσέρβες μας (π.χ., Κονσέρβα 124) και σημειώνουμε τον αριθμό αυτής της πρώτης Κονσέρβας—δεν έχει σημασία ποιον αριθμό έχει η πρώτη Κονσέρβα, το μόνο που έχει σημασία είναι να τον γράψουμε κάπου και να τον κρατήσουμε για μελλοντική χρήση.

![{{{alt}}}](/files/6a46aad8460f122eaa91ae2c68756c86a6bd3985)

Βρίσκουμε μια δεύτερη Κονσέρβα—οποιονδήποτε αριθμό Κονσέρβας (π.χ., Κονσέρβα 432)—και σημειώνουμε τον αριθμό της. Γράφουμε τον αριθμό αυτής της δεύτερης Κονσέρβας (432) σε ένα κομμάτι χαρτί και βάζουμε αυτή τη σημείωση *στην πρώτη Κονσέρβα* (Κονσέρβα 124). Τοποθετούμε το δεύτερο αντικείμενό μας (ανοιχτοπράσινος κύκλος) στη δεύτερη Κονσέρβα. Άρα, αυτή τη στιγμή έχουμε την εξής κατάσταση:

* μια γραπτή σημείωση—όχι αποθηκευμένη σε Κονσέρβα—που δηλώνει ότι η πρώτη Κονσέρβα είναι η 124 (περιέχει το πρώτο αντικείμενό μας)·
* μέσα στην Κονσέρβα 124 έχουμε προσθέσει άλλη μία σημείωση που λέει ότι το επόμενο αντικείμενο βρίσκεται στην Κονσέρβα 432.

Ουσιαστικά, έχουμε *συνδέσει* τις δύο πρώτες Κονσέρβες μας: ξέρουμε από πού να ξεκινήσουμε (Κονσέρβα 124) και ότι μια σημείωση στην Κονσέρβα 124 μάς λέει ποια Κονσέρβα περιέχει το επόμενο αντικείμενο (Κονσέρβα 432).

![{{{alt}}}](/files/b486f98712062069acdc1aefe0c45f3a1ec81f32)

Στη συνέχεια βρίσκουμε μια τρίτη Κονσέρβα, γράφουμε τον αριθμό της (π.χ., Κονσέρβα 543) σε ένα κομμάτι χαρτί και το τοποθετούμε στην *δεύτερη* Κονσέρβα (αριθμός 432). Έπειτα τοποθετούμε το τρίτο αντικείμενό μας (κόκκινος κύκλος) στην τρίτη Κονσέρβα.

Τώρα έχουμε συνδέσει τρεις Κονσέρβες στη σειρά: το σημείο εκκίνησής μας, Κονσέρβα 124 (σκούρος πράσινος κύκλος) → Κονσέρβα 432 (ανοιχτοπράσινος κύκλος)→ Κονσέρβα 543 (κόκκινος κύκλος) →…

![{{{alt}}}](/files/bcf391cb7e364a1017108c160a60a3a7ba996f3d)

Επαναλάβετε αυτή τη διαδικασία για τα δύο τελευταία αντικείμενα (ανοιχτό μπλε και σκούρο μπλε κύκλοι) χρησιμοποιώντας την Κονσέρβα 213 (ανοιχτό μπλε κύκλος) και την Κονσέρβα 102 (σκούρο μπλε κύκλος).

![{{{alt}}}](/files/0ef43621d180085e43c4b054e5fbbd6bb795720e)

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

### Τι γίνεται με το τελευταίο αντικείμενο στη λίστα μας (Κονσέρβα 102);

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

Όταν φτάνουμε στο τελικό αντικείμενο (Κονσέρβα), πρέπει να είναι προφανές ότι αυτή η Κονσέρβα (που περιέχει το τελευταίο αντικείμενο) είναι το τελευταίο στοιχείο στη λίστα μας—δεν χρειάζεται να ψάξουμε για άλλη Κονσέρβα, γιατί δεν υπάρχει. Ένας τρόπος να το κάνουμε αυτό είναι να τοποθετήσουμε έναν «ειδικό» αριθμό Κονσέρβας μέσα στην τελική μας Κονσέρβα (102). Μπορούμε να χρησιμοποιήσουμε οποιονδήποτε αριθμό θέλουμε, αρκεί να επιλέξουμε έναν μοναδικό αριθμό που δεν είναι ο αριθμός πραγματικής Κονσέρβας—για παράδειγμα «Κονσέρβα -1», «Κονσέρβα 0»: δεν έχει σημασία, αρκεί να ξέρουμε ότι το «Κονσέρβα -1» ή το «Κονσέρβα 0» κ.λπ. μας λέει αμέσως να σταματήσουμε να ψάχνουμε: δεν χρειάζεται να αναζητήσουμε άλλες Κονσέρβες, γιατί αυτή είναι η τελευταία και έτσι δεν υπάρχουν άλλα αντικείμενα για ανάκτηση.

### Από τα «αντικείμενα» και τις «Κονσέρβες» στα διακριτικά και το TeX

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

Δεν θέλουμε να μπούμε πολύ βαθιά σε έννοιες προγραμματισμού, αλλά μπορείτε να σκεφτείτε τις «Κονσέρβες» μας ως να αναπαριστούν λίγα bytes μνήμης υπολογιστή που έχουν «συσκευαστεί» σε μια βολική μονάδα αποθήκευσης. Η χρήση ενός αριθμητικού αναγνωριστικού για κάθε Κονσέρβα στην αναλογία μας μπορεί να θεωρηθεί ως η θέση μέσα στη μνήμη του υπολογιστή όπου βρίσκεται κάθε μικρό πακέτο μνήμης. Μέσα στο ίδιο το TeX, αυτά τα μικρά πακέτα αποθήκευσης ονομάζονται «λέξεις μνήμης»—ένας όρος που αντανακλά τον χρόνο/την εποχή κατά την οποία δημιουργήθηκε το TeX (δεκαετία του 1970). Αυτές οι «λέξεις μνήμης» είναι το θεμελιώδες δομικό στοιχείο που χρησιμοποιείται μέσα στο TeX, αλλά δεν χρειάζεται να τα εξερευνήσουμε εδώ περαιτέρω—όποιος θέλει περισσότερες λεπτομέρειες μπορεί να ανατρέξει σε ένα άρθρο στο [το προσωπικό ιστολόγιο του συγγραφέα](http://www.readytext.co.uk/?p=3537).

Σε όρους προγραμματισμού υπολογιστών, αυτό που συζητούσαμε ονομάζεται [*συνδεδεμένη λίστα*](https://en.wikipedia.org/wiki/Linked_list): μια λίστα διακριτικών TeX είναι μια συνδεδεμένη λίστα κατασκευασμένη από τα δοχεία αποθήκευσης του TeX που ονομάζονται *λέξεις μνήμης* όπου κάθε λέξη μνήμης μπορεί να χρησιμοποιηθεί για να αποθηκεύει:

* a *τιμή*: η τιμή του διακριτικού (ένας ακέραιος)·
* a *σύνδεσμος*: τη θέση μνήμης του επόμενου word μνήμης που περιέχει το επόμενο διακριτικό στη λίστα μας.

## Πού χρησιμοποιεί το TeX λίστες διακριτικών;

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

### Ένα παράδειγμα μακροεντολής

Μια μακροεντολή μπορεί να θεωρηθεί ότι αποτελείται από τρία μέρη:

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

Σημειώστε ότι αντί για `\def` θα μπορούσατε να είχατε χρησιμοποιήσει `\edef`, `\gdef` ή `\xdef`.

**Σημείωση για χρήστες LaTeX**: Εδώ ορίζουμε μακροεντολές χρησιμοποιώντας ακατέργαστες, χαμηλού επιπέδου εντολές TeX (που ονομάζονται *πρωταρχικές εντολές*). Οι χρήστες LaTeX θα είναι πιο εξοικειωμένοι με τη δημιουργία μακροεντολών μέσω της `\newcommand` (η οποία είναι και η ίδια μακροεντολή).

Όταν ζητάτε από το TeX να δημιουργήσει (ορίσει) μια μακροεντολή, θα δημιουργήσει ένα διακριτικό που αναπαριστά το `<macro name>` και ένα *λίστα διακριτικών* που αναπαριστά το συνδυασμένο `<parameter text>` και `<replacement text>`. Το TeX θα αποθηκεύσει προσεκτικά τα πάντα ώστε το διακριτικό που αναπαριστά το `<macro name>` να συνδέεται με τη λίστα διακριτικών που αναπαριστά τον ορισμό του (`<parameter text>` και `<replacement text>`).

Για παράδειγμα, αν ορίσουμε `\mymacro` ως εξής:

```latex
\def\mymacro abc #1 defz{Έγραψα "#1"!}
```

Βλέπουμε ότι τα συστατικά του μέρη είναι:

* `<macro name>` = `mymacro`
* `<parameter text>` = `abc #1 defz`
* `<replacement text>` = `Έγραψα "#1"!`

Για παράδειγμα, θα μπορούσατε να καλέσετε `\mymacro` ως εξής:

```latex
\mymacro abc THIS TEXT defz
```

το οποίο έχει ως αποτέλεσμα `Έγραψα "THIS TEXT"!` να στοιχειοθετείται—το `abc` και `defz` είστε *όχι* στοιχειοθετείται. `abc` και `defz` είναι ακολουθίες διακριτικών χαρακτήρων που χρησιμοποιούνται για να *οριοθετούν* την παράμετρο της μακροεντολής `#1` και απορροφώνται και απορρίπτονται όταν η κλήση της μακροεντολής σας επεξεργαστεί επιτυχώς από το TeX.

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

* ποια διακριτικά στην είσοδό σας είναι τα διακριτικά οριοθέτη·
* ποια διακριτικά στην είσοδό σας αποτελούν πραγματικά την παράμετρο/τις παραμέτρους της μακροεντολής σας (εδώ, αυτό που χρησιμοποιείτε για `#1` στην κλήση σας της `\mymacro`).

Πρέπει να καλέσετε `\mymacro` με ένα `<parameter text>` που περιέχει οριοθέτες οι οποίοι είναι πανομοιότυποι με εκείνους που χρησιμοποιήθηκαν για τον ορισμό του—και αυτό περιλαμβάνει τη χρήση οριοθετών χαρακτήρων με πανομοιότυπους κωδικούς κατηγορίας. Αν οι οριοθέτες που χρησιμοποιούνται στην `<parameter text>` που χρησιμοποιείται για να καλέσετε `\mymacro` είναι διαφορετικοί από εκείνους που χρησιμοποιήθηκαν για να τον ορίσουν (το «πρότυπο» που αποθηκεύεται στη μνήμη), τότε το TeX μπορεί να μπερδευτεί αρκετά—όταν προσπαθεί να επεξεργαστεί `\mymacro` δεν θα μπορούσε να αντιστοιχίσει το «πρότυπο» που έχει αποθηκεύσει στη μνήμη του.

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

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

Ας υποθέσουμε ότι αλλάζαμε τον κωδικό κατηγορίας του `z` σε, ας πούμε, 12—συνήθως είναι 11—και προσπαθούσαμε να καλέσουμε τη μακροεντολή μας έτσι:

```latex
\catcode`z=12
\mymacro abc THIS TEXT defz more text here...
```

Αυτή τη φορά δεν θα λειτουργήσει επειδή ο κωδικός κατηγορίας του `z` έχει αλλάξει. Θα δείτε ένα σφάλμα όπως αυτό:

```latex
Αχαλίνωτο όρισμα;
THIS TEXT defz
! Η παράγραφος τελείωσε πριν ολοκληρωθεί η \mymacro.
<θα διαβαστεί ξανά>
\par
l.22
```

Όταν το TeX διαβάζει και σαρώνει το `z` σε `defz` δεν μπορεί να το αναγνωρίσει ως το τέλος του `\mymacro`του `<parameter text>` που χρησιμοποιείται στο αρχείο εισόδου σας. Μέχρι να δει εκείνο το λανθασμένο `z` το TeX είχε ταιριάξει σωστά τους πρώτους 3 χαρακτήρες `def` αλλά αυτό το `z` (με κωδικό κατηγορίας 12) μπλοκάρει τη σάρωση του TeX. Υποθέτοντας ότι το `z` είχε κωδικό κατηγορίας 11 όταν *ορίζαμε* `\mymacro`: αυτό θα είχε ως αποτέλεσμα να αποθηκευτεί μια τιμή διακριτικού 256×11 + 122 = 2938 ως μέρος του `\mymacro`’ς ορισμού του (δηλαδή αποθηκευμένη ως μέρος του «προτύπου»). Ωστόσο, με κωδικό κατηγορίας 12, `z` θα δημιουργήσει τώρα μια τιμή διακριτικού 256×12 + 122 = 3194. Επειδή η τιμή διακριτικού (για `z`) που διαβάστηκε από την είσοδό σας (τιμή 3194) δεν ταιριάζει με το `z`-διακριτικό που περιέχεται στο αποθηκευμένο `<parameter text>` πρότυπο λίστας διακριτικών (τιμή 2938), το TeX θα συνεχίσει να σαρώνει την είσοδό σας. Το TeX θα συνεχίσει να σαρώνει το κείμενο που ακολουθεί μετά τη μακροεντολή σας (*περισσότερο κείμενο εδώ* ...) αναζητώντας επιπλέον διακριτικά—προσπαθώντας να αντιστοιχίσει το αποθηκευμένο πρότυπο με τα διακριτικά που βρίσκει στην είσοδό σας. Πιθανότατα δεν θα βρει το σωστό μοτίβο διακριτικών και θα προκύψουν σφάλματα, καθώς το TeX θα «ξεπεράσει» την είσοδό σας και θα διαβάσει λανθασμένα επιπλέον κείμενο για να δημιουργήσει πρόσθετα διακριτικά—αυτά τα επιπλέον διακριτικά δεν θα έπρεπε να είχαν διαβαστεί σε αυτό το σημείο και σχεδόν σίγουρα θα προκαλέσουν σφάλμα.

Θα το εξετάσουμε αυτό πιο αναλυτικά σε μελλοντικό άρθρο.

## Άλλες χρήσεις των λιστών διακριτικών

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

```latex
\toks<n>={...}
\everypar={...}
\everymath={...}
\everydisplay={...}
\everyhbox={...}
\everyvbox={...}
\output={...}
\everyjob={...}
\everycr={...}
\errhelp={...}
```

Κάθε μία από αυτές τις εντολές δημιουργεί μια λίστα διακριτικών από τους χαρακτήρες και τις εντολές μέσα στα άγκιστρα «{...}» και αυτή η λίστα διακριτικών προορίζεται να επαναχρησιμοποιηθεί σε ορισμένες περιστάσεις. Για παράδειγμα, `\everypar={...}` δημιουργεί και αποθηκεύει ένα σύνολο διακριτικών (μια λίστα διακριτικών) που το TeX εισάγει στην είσοδο ακριβώς πριν ξεκινήσει μια νέα παράγραφο.

## Κρυφές χρήσεις των λιστών διακριτικών: παραδείγματα

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

### Παράδειγμα 1: \uppercase{...} και \lowercase{....}—προσωρινές λίστες διακριτικών

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

Καλό παράδειγμα είναι οι εντολές `\uppercase{...}` ή `\lowercase{...}` γιατί η λειτουργία τους μπορεί, με την πρώτη ματιά, να είναι αρκετά μπερδευτική. Μόλις καταλάβετε τι κάνουν—βαθιά μέσα στο TeX και αόρατα στον χρήστη—η λειτουργία τους γίνεται πολύ πιο εύκολο να κατανοηθεί.

Ας υποθέσουμε ότι έχετε μια απλή σειρά γραμμάτων που θέλετε να τη βάλετε σε κεφαλαία—π.χ., abcde και να τη μετατρέψετε σε ABCDE. Λοιπόν, είναι αρκετά απλό με το `\uppercase` εντολή:

```latex
\uppercase{abcde}
```

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

```latex
\toks100={abcde}
\def\mychars{abcde}
```

Στη συνέχεια, κάποια στιγμή, μπορεί να αποφασίσετε ότι θα θέλατε να επαναχρησιμοποιήσετε τη σειρά γραμμάτων σας αλλά, αυτή τη φορά, σε κεφαλαία· έτσι δοκιμάζετε

```latex
\uppercase{\the\toks100}
```

και

```latex
\uppercase{\mychars}
```

Αλλά, δυστυχώς, κανένα από τα δύο δεν λειτουργεί. Γιατί;

### Μυστικές λίστες διακριτικών!

Για να καταλάβουμε πώς οι εντολές `\uppercase{...}` `\lowercase{...}` στην πραγματικότητα λειτουργούν, χρειάστηκε να ρίξω μια ματιά στα εσωτερικά λειτουργικά μέρη του TeX, οπότε η ακόλουθη εξήγηση προκύπτει από αυτό.

Όταν το TeX εντοπίζει είτε `\uppercase{<υλικό>}` ή `\lowercase{<υλικό>}` στην είσοδό σας, το πρώτο πράγμα που κάνει το TeX είναι να δημιουργήσει μια (προσωρινή) εσωτερική λίστα διακριτικών από το `<υλικό>` που περικλείεται ανάμεσα στα ‘{’ και ‘}’ που ακολουθούν μετά τις `\uppercase{...}` ή `\lowercase{...}` εντολές—αυτή η προσωρινή λίστα διακριτικών είναι εσωτερική στο TeX.

Ένα κρίσιμο σημείο, και κεντρικό για να κατανοήσουμε πώς `\uppercase{<υλικό>}` και `\lowercase{<υλικό>}` στην πραγματικότητα λειτουργούν, είναι ότι οποιεσδήποτε εντολές ή μακροεντολές περιέχονται στο `<υλικό>` δεν *επεκταθεί*: το μόνο που κάνει το TeX είναι να δημιουργεί διακριτικά από χαρακτήρες και εντολές που τοποθετούνται ανάμεσα στα `{...}`. Κατά τη λειτουργία των `\uppercase{<υλικό>}` ή `\lowercase{<υλικό>}` τίποτα ανάμεσα στα άγκιστρα δεν εκτελείται: απλώς μετατρέπεται σε διακριτικά.

Μετά το `<υλικό>` μέσα στο `{...}` έχει μετατραπεί σε μια (προσωρινή) λίστα διακριτικών, το TeX στη συνέχεια επανεξετάζει κάθε διακριτικό σε εκείνη τη λίστα και ελέγχει αν είναι ένα *χαρακτήρα* διακριτικό ή ένα *εντολή* διακριτικό (χρησιμοποιώντας την αριθμητική τιμή του διακριτικού). Αν το TeX εντοπίσει ένα διακριτικό χαρακτήρα, τροποποιεί αυτό το διακριτικό για να αλλάξει το πεζό/κεφαλαίο του χαρακτήρα (ανάλογα με το αν `\uppercase` ή `\lowercase` επεξεργάζεται το

Έτσι, για παράδειγμα, αν δώσουμε μια εντολή TeX όπως `\uppercase{abcde}` το TeX θα δημιουργήσει μια λίστα διακριτικών από το `abcde` που περιέχει μόνο διακριτικά χαρακτήρων: όλα προσαρμόζονται ώστε να δημιουργηθεί μια σειρά τροποποιημένων διακριτικών που αναπαριστούν τα A, B, C, D και E. Αυτά τα τροποποιημένα διακριτικά τροφοδοτούνται ξανά στον επεξεργαστή εισόδου του TeX, με αποτέλεσμα να `ABCDE` στοιχειοθετηθούν. Ωστόσο, αν έχουμε αποθηκεύσει τους χαρακτήρες μας *μέσα σε μια μακροεντολή*—για παράδειγμα `\def\mychars{abcde}`—και προσπαθήσουμε να τους μετατρέψουμε σε κεφαλαία έτσι:

```latex
\uppercase{\mychars}
```

τότε θα αποτύχει και θα στοιχειοθετηθεί το abcde—όχι το ABCDE όπως ίσως περιμένατε. Αν στη συνέχεια προσπαθήσουμε να αποθηκεύσουμε τους χαρακτήρες μας σε μια λίστα διακριτικών όπως `\toks0={abcde}` και κάνουμε `\uppercase{\the\toks0}` τότε, και πάλι, `\uppercase` θα αποτύχει, επειδή η λίστα διακριτικών θα αποτελείται εξ ολοκλήρου από διακριτικά που δεν επηρεάζονται από το `\uppercase`.

Παίρνοντας το παράδειγμα της μακροεντολής μας, `\mychars`, αφού το TeX εντοπίσει `\uppercase` στην είσοδο, το TeX αναζητά τη σημασία του `\uppercase` και το εκτελεί, δημιουργώντας μια προσωρινή λίστα διακριτικών από `{\mychars}`. Προφανώς, αυτή η προσωρινή λίστα διακριτικών περιέχει μόνο ένα διακριτικό που δεν είναι διακριτικό χαρακτήρα αλλά ένα διακριτικό που αναπαριστά την εντολή μακροεντολής μας `\mychars`: επομένως, για τους σκοπούς εκτέλεσης του `\uppercase`, αυτό το διακριτικό αγνοείται—`\mychars` δεν αναπαριστά διακριτικό χαρακτήρα. Ωστόσο, όπως σημειώθηκε παραπάνω, μόλις `\uppercase` έχει κάνει τη δουλειά του, η προσωρινή λίστα διακριτικών (που δημιουργήθηκε από τη δράση του `\uppercase`) τροφοδοτείται ξανά στον πλήρη μηχανισμό επεξεργασίας εισόδου (σάρωσης) του TeX. Όταν το TeX ξαναδιαβάζει αυτή τη λίστα διακριτικών, εντοπίζει ένα διακριτικό που αναπαριστά τη `\mychars` μακροεντολή μας, την οποία το TeX εκτελεί (αναπτύσσει) και δημιουργεί μια σειρά χαρακτήρων για να στοιχειοθετήσει το abcde—ακόμη σε πεζά, επειδή ήταν «τυλιγμένοι» μέσα σε μια μακροεντολή και έτσι αόρατοι στις ενέργειες του `\uppercase`.

Μόλις το TeX επανεξετάσει την προσωρινή λίστα διακριτικών που δημιουργήθηκε για `\uppercase{...}` ή `\lowercase{...}`, και επεξεργαστεί τυχόν διακριτικά χαρακτήρων, στη συνέχεια αλλάζει και χρησιμοποιεί εκείνη την προσωρινή λίστα διακριτικών ως πηγή εισόδου του: στοιχειοθέτηση χαρακτήρων (επεξεργασμένων διακριτικών χαρακτήρων) και εκτέλεση εντολών και μακροεντολών.

### Πώς μπορεί να διορθωθεί αυτό;

Επειδή `\uppercase{...}` ή `\lowercase{...}` θα ενεργήσει μόνο πάνω σε διακριτικά χαρακτήρων, χρειαζόμαστε έναν τρόπο να «αναγκάσουμε το ξεπακετάρισμα» των χαρακτήρων που περιέχονται στη μακροεντολή μας `\mychars` (ή που περιέχονται σε έναν `\toks` καταχωρητή) πριν το `\uppercase{...}` ή `\lowercase{...}` ενεργήσει πάνω του. Με το «ξεπακετάρισμα» εννοούμε στην πραγματικότητα τη διαδικασία του TeX να *επέκταση*:

* αντικαθιστά μια εντολή TeX/LaTeX με την *ακολουθία* των διακριτικών *από τα οποία αυτή η εντολή* (*π.χ., μια μακροεντολή*) *αποτελείται,* ή
* παράγοντας την ακολουθία διακριτικών που μια εντολή έχει σχεδιαστεί να *δημιουργεί*. Ένα παράδειγμα εντολής που δημιουργεί διακριτικά είναι το `\jobname`, το οποίο παράγει μια ακολουθία διακριτικών χαρακτήρων που αναπαριστούν το όνομα του κύριου αρχείου TeX που επεξεργάζεται.

#### Μαγεία χαμηλότερου επιπέδου: scantoks(..., ...)

Εδώ πραγματικά εξερευνούμε ορισμένες πιο σκοτεινές γωνιές των εσωτερικών λειτουργιών του TeX, οπότε μπορείτε να αγνοήσετε αυτή την ενότητα εκτός αν απολαμβάνετε τις λεπτομέρειες…

Αφού το TeX εντοπίσει `\uppercase` ή `\lowercase` στη ροή εισόδου, εκτελεί μια εσωτερική συνάρτηση που ονομάζεται `scantoks(..., ...)` της οποίας η δουλειά είναι να δημιουργεί τη λίστα διακριτικών χρησιμοποιώντας τα στοιχεία ανάμεσα στο ανοιχτό ‘{’ και το κλειστό ‘}’—όπως συζητήθηκε, αυτή η λίστα διακριτικών στη συνέχεια εξετάζεται για να εντοπίσει (και έπειτα να προσαρμόσει) τυχόν διακριτικά χαρακτήρων ώστε να αλλάξει η κλίση των χαρακτήρων όπως απαιτείται. Σημειώστε προσεκτικά ότι αναφερόμαστε στο `scantoks(..., ...)` ως την εσωτερική συνάρτηση ενσωματωμένη στον πηγαίο κώδικα των μηχανών TeX—εδώ δεν αναφερόμαστε σε αυτήν ως το όνομα μιας ακολουθίας ελέγχου.

Ως μέρος της εργασίας της, `scantoks(..., ...)` μπορεί να της δοθεί οδηγία αν θα αναπτύξει ή όχι τη λίστα διακριτικών που κατασκευάζει και για `\uppercase` και (`\lowercase`) δεν αναπτύσσει τα διακριτικά: απλώς τα δημιουργεί και τα τοποθετεί σε μια λίστα διακριτικών.

Ένα από τα πρώτα πράγματα που `scantoks(..., ...)` πρέπει να κάνει είναι να ελέγξει για ένα ανοιχτό ‘{’ (ή οποιονδήποτε χαρακτήρα με `\catcode` 1) γιατί πρέπει να βεβαιωθεί ότι ο χρήστης δεν έχει κάνει συντακτικό λάθος και δεν ξέχασε το ανοιχτό ‘{’ (ή οποιονδήποτε χαρακτήρα με κωδικό κατηγορίας 1)—επειδή απαιτείται ένας χαρακτήρας με κωδικό κατηγορίας 1 για να οριοθετήσει την αρχή μιας λίστας στοιχείων που θα μετατραπεί σε διακριτικά.

Και εδώ είναι το τέχνασμα: η αναζήτηση για ένα ανοιχτό ‘{’ ενεργοποιεί `scantoks(..., ...)` για να εκτελεστεί η διαδικασία επέκτασης του TeX, πράγμα που σημαίνει ότι τα ακόλουθα παραδείγματα θα λειτουργήσουν:

```latex
\let\ob={
\uppercase\ob abcde}
\def\obb{\ob}
\uppercase\obb xyz}
```

Παίρνοντας το παράδειγμα του `\obb`, μιας μακροεντολής, αναγνωρίζεται ως *επεκτάσιμη εντολή* και επεκτείνεται δεόντως από το TeX (μέσω της `scantoks(..., ...)` συνάρτησης) στην αναζήτησή του για ένα ανοιχτό άγκιστρο (οποιοσδήποτε χαρακτήρας με κωδικό κατηγορίας 1). Αυτό σημαίνει ότι μπορούμε να χρησιμοποιήσουμε το «`\expandafter` τέχνασμα» για να πετύχουμε τον στόχο μας να «ξεπακετάρουμε» τους χαρακτήρες μας από τα όρια της μακροεντολής μας—δηλαδή, να την επεκτείνουμε. Σημειώστε ότι `\expandafter` εμπίπτει επίσης στην κατηγορία του να είναι *επεκτάσιμη εντολή*, οπότε το TeX το ενεργοποιεί εδώ και το αφήνει να κάνει τη δουλειά του ως μέρος της αναζήτησης για ένα ανοιχτό ‘{’ (ή οποιονδήποτε χαρακτήρα με κωδικό κατηγορίας 1).

Άρα, αν ορίσετε:

```latex
\toks0={abcde}
\def\mychars{abcde}
```

Και κάνετε αυτό:

```latex
\uppercase\expandafter{\mychars}
\uppercase\expandafter{\the\toks0}
```

και στις δύο περιπτώσεις θα δείτε τώρα να στοιχειοθετείται το ABCDE, επειδή το `\expandafter` προκαλεί το «ξεπακετάρισμα» (επέκταση) του `\mychars` και `\the\toks0`—και τα δύο καταλήγουν στο να `\uppercase` βλέπουν μια ροή διακριτικών χαρακτήρων, την οποία μπορούν να επεξεργαστούν για να αλλάξουν το πεζό/κεφαλαίο.

### Παράδειγμα 2: \string—περισσότερες προσωρινές λίστες διακριτικών

Εσωτερικά, το TeX κατατάσσει `\string` ως μία από τις λεγόμενες εντολές του «convert»: εκτελώντας τη λειτουργία «μετατροπή σε κείμενο». Το `\string` η εντολή έχει σχεδιαστεί για να μετατρέπει ένα token σε μια αναγνώσιμη από τον άνθρωπο εκδοχή κειμένου—δηλ. να στοιχειοθετεί τη αναγνώσιμη από τον άνθρωπο συμβολοσειρά χαρακτήρων από την οποία δημιουργήθηκε αρχικά αυτό το token.

Για παράδειγμα `\string\hello` δημιουργεί μια προσωρινή λίστα tokens η οποία περιέχει τους χαρακτήρες \\, h, e, l, l, o — ναι, ακόμη και συμπεριλαμβανομένου του αρχικού ‘\’. Μόλις δημιουργηθεί αυτή η λίστα tokens, διαβάζεται ξανά από το TeX και το κείμενο της εντολής “`\hello`” στοιχειοθετείται—ναι, συμπεριλαμβανομένου του ‘\’ αν επιλέξετε τη σωστή γραμματοσειρά…

Ίσως αναρωτιέστε πώς/γιατί το TeX μπορεί να στοιχειοθετήσει τον χαρακτήρα διαφυγής όταν συνήθως χρησιμοποιείται για να ενεργοποιεί τον σαρωτή του TeX ώστε να δημιουργήσει ένα token εντολής: γιατί δεν το κάνει εδώ; Η απάντηση έχει να κάνει με τους κωδικούς κατηγορίας: συνήθως, ένας χαρακτήρας ‘\’ έχει catcode 0 (χαρακτήρας διαφυγής), αλλά όταν `\string` δημιουργεί την εσωτερική του λίστα tokens κάνει κάτι λίγο διαφορετικό. Όταν δημιουργεί μια λίστα χαρακτήρων-token αναθέτει κωδικό κατηγορίας 12 σε όλους τους χαρακτήρες εκτός από τον χαρακτήρα διαστήματος, στον οποίο ανατίθεται catcode 10—να θυμάστε ότι τα character tokens υπολογίζονται από 256 x catcode + τιμή ASCII. Έτσι, όταν το TeX διαβάζει ξανά (εισάγει) την προσωρινή λίστα tokens που `\string` δημιουργήθηκε από `\hello`, το TeX *δεν βλέπει έναν χαρακτήρα διαφυγής* επειδή το token για το ‘\’ υπολογίστηκε με catcode 12 και όχι 0: το TeX απλώς αντιμετωπίζει το ‘\’ ως κανονικό χαρακτήρα και το στοιχειοθετεί.

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

### Τεχνική σημείωση

Μια εντολή με το όνομα `\showtokens{...}` (εισήχθη από τη μηχανή e-TeX) μπορεί να εμφανίσει λίστες tokens (στο αρχείο καταγραφής). Από το εγχειρίδιο του e-TeX:

> Η εντολή `\showtokens{<token list>}` εμφανίζει τη λίστα tokens και επιτρέπει την εμφάνιση ποσοτήτων που δεν μπορούν να εμφανιστούν από το `\show` ή `\showthe`, π.χ.:
>
> ```latex
> \showtokens\expandafter{\jobname}
> ```

## Συμπερασματικά

Στην ενότητα 291 του πηγαίου κώδικα του TeX (βλ. σελίδα 122 του [TeX: Το Πρόγραμμα](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373)) ο Knuth περιγράφει μια λίστα tokens ως εξής:

> «Μια λίστα tokens είναι μια απλά συνδεδεμένη λίστα κόμβων μίας λέξης στη μνήμη, όπου κάθε λέξη περιέχει ένα token και έναν σύνδεσμο. Οι ορισμοί μακροεντολών, οι ορισμοί της ρουτίνας εξόδου, τα σημάδια, `\write` τα κείμενα και μερικά άλλα πράγματα απομνημονεύονται από το TeX με τη μορφή λιστών tokens, συνήθως με προηγούμενο έναν κόμβο με μετρητή αναφορών στο πεδίο «token\_ref\_count».»

Με την πρώτη ανάγνωση αυτό ίσως να μην ήταν εύκολο να κατανοηθεί, αλλά, ελπίζουμε, τώρα ίσως να βγάζει λίγο περισσότερο νόημα.


---

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