> 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/23-how-does-latex-typeset-headers-and-footers.md).

# Πώς στοιχειοθετεί το LaTeX κεφαλίδες και υποσέλιδα;

## Πώς στοιχειοθετεί το LaTeX τις κεφαλίδες και τα υποσέλιδα;

### Εισαγωγή

Αν αναζητάτε έναν οδηγό για το πώς να αλλάξετε κεφαλίδες και υποσέλιδα, παρακαλούμε [επισκεφθείτε τη σελίδα βοήθειάς μας](/latex/el/morfopoiisi/02-headers-and-footers.md) επειδή αυτό το άρθρο επικεντρώνεται στην εξήγηση των μηχανισμών χαμηλού επιπέδου που χρησιμοποιούν οι μηχανές TeX και το LaTeX για να παράγουν κεφαλίδες και υποσέλιδα.

* **Σημείωση (ενημέρωση)**: Αυτό το άρθρο εξετάζει τον βασικό μηχανισμό marks του LaTeX που χρησιμοποιούνταν πριν από τον Ιούνιο του 2022, οπότε εισήχθη μια νέα και πιο ευέλικτη υλοποίηση του χειρισμού marks του LaTeX. Δείτε [Επισκόπηση του νέου μηχανισμού marks του LaTeX](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) για περισσότερες λεπτομέρειες. Για λόγους συμβατότητας προς τα πίσω, το LaTeX συνεχίζει να υποστηρίζει τον παλαιό μηχανισμό marks. Το υλικό του άρθρου που συζητά τη συμπεριφορά των μηχανών TeX δεν επηρεάζεται από αυτές τις αλλαγές στο LaTeX.
* **Σημείωση**: οι όροι «LaTeX», «TeX» και «μηχανή TeX» χρησιμοποιούνται σε όλη αυτή τη συζήτηση, οπότε είναι χρήσιμο να κατανοήσετε τη σημασία τους—δείτε το άρθρο του Overleaf [Τι κρύβει ένα Όνομα: Ένας Οδηγός για τις Πολλές Μορφές του TeX](/latex/el/se-vathos-arthra/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) για περισσότερες πληροφορίες.

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

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

### Μερικές σημειώσεις για την αποθήκευση περιεχομένου: κόμβοι TeX

Καθώς η υποκείμενη μηχανή TeX επεξεργάζεται τον κώδικα LaTeX σας για να παράγει στοιχειοθετημένο υλικό — όπως παραγράφους, πίνακες και μαθηματικά — πρέπει να αποθηκεύει προσωρινά αυτό το περιεχόμενο στη μνήμη οποιασδήποτε μηχανής TeX χρησιμοποιείται για την επεξεργασία του κώδικα LaTeX σας. Για την αποθήκευση στοιχειοθετημένου περιεχομένου οι μηχανές TeX χρησιμοποιούν μια ακολουθία από τους λεγόμενους *κόμβων*, τους οποίους μπορείτε να θεωρήσετε ως «κομμάτια» μνήμης υπολογιστή (συσκευής) μεταβλητού μεγέθους, συνδεδεμένα μεταξύ τους ώστε να σχηματίζουν μια λίστα (δείτε αυτό το [άρθρο της Wikipedia για συνδεδεμένες δομές δεδομένων](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Σχηματική αναπαράσταση του πώς οι μηχανές TeX αποθηκεύουν περιεχόμενο χρησιμοποιώντας συνδεδεμένους κόμβους](/files/8166afbd6977d6e246ed73db58c6dd9e071ec68b)

Για να αναπαραστήσουν τα θεμελιώδη στοιχεία της στοιχειοθεσίας με βάση το TeX — όπως χαρακτήρες, glue, πλαίσια, ποινές, kerns και [*marks*](#why-were-here-understanding-mark-nodes) για να αναφέρουμε μόνο μερικά — οι μηχανές TeX χρησιμοποιούν διαφορετικούς *είδη* τύπους κόμβων. Ορισμένοι κόμβοι, όπως αυτοί για τα πλαίσια, χρειάζονται να αποθηκεύσουν περισσότερα δεδομένα σε σύγκριση με απλούστερους τύπους κόμβων, όπως οι κόμβοι χαρακτήρων· κατά συνέπεια, ορισμένοι κόμβοι είναι μεγαλύτεροι από άλλους — απαιτώντας περισσότερα bytes για την αποθήκευσή τους στη μνήμη. Όταν διαβάζετε για το TeX μπορεί να συναντήσετε όρους όπως *κόμβοι χαρακτήρων*, *κόμβοι glue*, [*κόμβοι mark*](#why-were-here-understanding-mark-nodes) και ούτω καθεξής: τώρα ξέρετε ότι αυτά είναι απλώς ονόματα που δίνονται σε τμήματα μνήμης που έχουν εκχωρηθεί για να αποθηκεύουν δεδομένα που αναπαριστούν ένα στοιχείο της στοιχειοθεσίας του TeX.

#### Γιατί είμαστε εδώ: κατανοώντας τους κόμβους mark

Από τους πολλούς τύπους κόμβων, αυτόν που χρειάζεται να συζητήσουμε ονομάζεται *κόμβος mark* ο οποίος δημιουργείται από την `\mark` εντολή:

```latex
\mark{πράγματα προς αποθήκευση}
```

Η `\mark` Η εντολή δεν παράγει άμεσα κανένα στοιχειοθετημένο περιεχόμενο: το όρισμά της `*πράγματα προς αποθήκευση*` αποθηκεύεται στη μνήμη για μελλοντική χρήση και δημιουργείται ένας *κόμβος mark* για να περιέχει τη θέση μνήμης του *πράγματα προς αποθήκευση*. Όπως θα δούμε, η `\mark` εντολή δημιουργήθηκε *ειδικά* για να βοηθήσει στην παραγωγή κεφαλίδων και υποσέλιδων.

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

#### Το ε-TeX προσθέτει την εντολή \marks

[Η έκδοση 2 του ε-TeX](https://texdoc.org/serve/e-TeX/0), μια επέκταση του αρχικού TeX του Knuth, δημοσιεύτηκε το 1998 και παρέχει νέες δυνατότητες μαζί με βελτιώσεις σε υπάρχοντα χαρακτηριστικά. Σήμερα, οι περισσότερες από τις βελτιώσεις του ε-TeX έχουν ενσωματωθεί στις κύριες μηχανές TeX: pdfTeX, LuaTeX και XeTeX—δείτε την επιλογή γραμμής εντολών [**`-etex`** των μηχανών TeX](/latex/el/perissotera-themata/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) η οποία επιτρέπει τη χρήση επεκτάσεων του ε-TeX.

Το αρχικό λογισμικό TeX του Knuth παρέχει την εντολή \mark, η οποία δημιουργεί μόνο 1 «κλάση», ή «τύπο» κόμβου mark. Το έγγραφό σας θα μπορούσε να περιλαμβάνει πολλές εντολές \mark, αλλά όλες δημιουργούν κόμβους mark του ίδιου «τύπου» ή «κλάσης» — δεν υπάρχει ενσωματωμένος μηχανισμός για να τους ομαδοποιήσει ή να τους ταξινομήσει. Αυτός ο περιορισμός αφαιρέθηκε από μια βελτίωση του ε-TeX: την εντολή \marks, η οποία υποστηρίζεται από τα pdfTeX, LuaTeX και XeTeX:

```latex
\marks n {πράγματα προς αποθήκευση}
```

όπου `n` είναι ένας ακέραιος (`0` <= `n` < `32768`) που καθορίζει την κλάση *του κόμβου mark*.

Σημειώσεις:

* γράφοντας `\marks 0` (δηλ., `n`=`0`) είναι συνώνυμο με τη χρήση της αρχικής εντολής `\mark` εντολή
* Το ε-TeX εισήγαγε επίσης μεταβλητές marks ([δείτε παρακάτω](#pre-output-checks-looking-for-mark-nodes)) για κάθε κλάση (`n`) του mark: `\firstmarks n`, `\topmarks n` και `\botmarks n`. Επιλεγμένες κλάσεις μεταβλητών marks θα μπορούσαν να χρησιμοποιηθούν για να παρέχουν δεδομένα mark για συγκεκριμένες εργασίες στοιχειοθεσίας.
* Το LuaTeX αύξησε τη μέγιστη τιμή του `n` σε `65535`, επιτρέποντας $$2^{16}$$ κλάσεις marks

### Λόγοι για τη χρήση marks από το TeX

Για να κατανοήσουμε *γιατί* (και πώς) οι μηχανές TeX χρησιμοποιούν την εντολή `\mark` (ή `\marks`) για να παράγουν κεφαλίδες και υποσέλιδα, πρέπει να εκτιμήσουμε ορισμένες «ιδιορρυθμίες» των μηχανισμών της μηχανής TeX για την κατασκευή σελίδων — την εύρεση διακοπών σελίδας και την αποστολή ολοκληρωμένων σελίδων σε ένα αρχείο PDF. Στην πραγματικότητα, αυτές οι διαδικασίες κατασκευής σελίδας είναι πολύπλοκες, αλλά οι βασικές αρχές/έννοιες μπορούν να απλοποιηθούν ώστε να παρέχουν επαρκείς επεξηγήσεις υποβάθρου που βοηθούν στην κατανόησή μας για τα marks.

Καθώς μια μηχανή TeX ολοκληρώνει τη στοιχειοθεσία επιμέρους αντικειμένων περιεχομένου, όπως παραγράφων, πινάκων ή μαθηματικών, καλεί μια εσωτερική ρουτίνα (μια συνάρτηση που ονομάζεται `build_page(...)`) η οποία προσπαθεί να προσθέσει αυτά τα νεοστοιχειοθετημένα στοιχεία στη σελίδα που κατασκευάζεται αυτή τη στιγμή στη μνήμη. Όταν αυτό το νέο υλικό προστεθεί στη σελίδα που χτίζεται, το TeX ελέγχει επίσης αν αυτό το νέο περιεχόμενο έχει κάνει την τρέχουσα σελίδα «αρκετά γεμάτη». Αν η σελίδα είναι γεμάτη, το TeX μπορεί να δημιουργήσει μια *διακοπή σελίδας*—στέλνοντας το περιεχόμενο αυτής της σελίδας για τελική επεξεργασία («πακετάρισμα») και μετέπειτα έξοδο στο αρχείο PDF.

Ένα βασικό χαρακτηριστικό του τελικού σταδίου του πακεταρίσματος σελίδας (σύνθεσης) είναι κάτι που ονομάζεται *ρουτίνα εξόδου* η οποία είναι, ουσιαστικά, μια ακολουθία εντολών ορισμένη από τον χρήστη και χρησιμοποιείται για να πακετάρει τη σελίδα περιεχομένου ώστε να είναι έτοιμη για αποστολή στο αρχείο PDF. Μία δραστηριότητα «πακεταρίσματος» είναι η προσθήκη κεφαλίδων και υποσέλιδων, αλλά υπάρχουν πολλοί τρόποι χρήσης των ρουτινών εξόδου — για παράδειγμα, δείτε [αυτό το άρθρο στο TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Οι ρουτίνες εξόδου είναι μια αρκετά πολύπλοκη περιοχή του TeX, οπότε δεν θα μπούμε σε λεπτομέρειες εδώ: για τους παρόντες σκοπούς απλώς να θυμάστε ότι το τελικό στάδιο της σύνθεσης σελίδας περιλαμβάνει τη χρήση κάποιας ακολουθίας εντολών ορισμένης από τον χρήστη (συλλογικά αποκαλούμενης *ρουτίνα εξόδου*).

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

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

![Σχηματική αναπαράσταση μιας παραγράφου που εκτείνεται πάνω από μια διακοπή σελίδας](/files/2e8b74c3935e0d80963c85e9b337231f0e8bed11)

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

Για το παράδειγμα της παραγράφου μας, το πλήρες κείμενο αυτής της παραγράφου, *συμπεριλαμβανομένων τυχόν εντολών μέσα σε αυτό το κείμενο*, έχει επεξεργαστεί πλήρως — που σημαίνει ότι η στοιχειοθεσία του TeX έχει φτάσει σε μια συγκεκριμένη θέση στο `.tex` αρχείο σας. Η «τρέχουσα εσωτερική κατάσταση» της μηχανής TeX, όπως η τιμή των μεταβλητών ή οι αποθηκευμένες ρυθμίσεις παραμέτρων, θα αντανακλά το υλικό, συμπεριλαμβανομένων τυχόν εντολών, που έχει επεξεργαστεί μέχρι την τρέχουσα θέση — το τέλος της παραγράφου.

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

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

![Σχηματική αναπαράσταση της θέσης των κόμβων όπου το TeX βρίσκει μια διακοπή σελίδας, δείχνοντας επίσης περιεχόμενο που κρατείται για την επόμενη σελίδα](/files/1e1df4e4df5ad8112e4918d4ca357b42d6f4b518)

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

Το γράφημά μας (παραπάνω) αναπαριστά τη στιγμή κατά την οποία το TeX έχει επιλέξει να κάνει διακοπή σελίδας σε κάποιο συγκεκριμένο κόμβο, όπως `\baselineskip` glue μεταξύ στοιχειοθετημένων γραμμών, και είναι έτοιμο να αρχίσει το πακετάρισμα της τρέχουσας σελίδας χρησιμοποιώντας τη ρουτίνα εξόδου — μια ακολουθία ενσωματωμένων εντολών και μακροεντολών ορισμένων από τον χρήστη. *Ωστόσο*, επιπλέον του περιεχομένου που αποτελεί την τρέχουσα σελίδα (αποθηκευμένου στη μνήμη), το TeX έχει ήδη επεξεργαστεί και αποθηκεύσει (στη μνήμη) *πρόσθετο υλικό*, από το `.tex` αρχείο σας. Αυτό το επιπλέον υλικό εκτείνεται *πέρα από τη διακοπή σελίδας* και *θα μπορούσε* μπορεί να έχει συμπεριλάβει εντολές που άλλαξαν σημαντικές τιμές ή μεταβλητές σχετικές με τη σελίδα, επηρεάζοντας την «τρέχουσα εσωτερική κατάσταση» του TeX — η οποία περιλαμβάνει τιμές εσωτερικών παραμέτρων ή δεδομένα που αποθηκεύονται από μακροεντολές.

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

#### Υποθετικό παράδειγμα: πώς να πάρετε λανθασμένες κεφαλίδες

Το παρακάτω διάγραμμα απεικονίζει υποθετικές εντολές `\myheader` και `\myfooter` που χρησιμοποιούνται για την αποθήκευση του επιθυμητού κειμένου των κεφαλίδων και υποσέλιδων· για παράδειγμα, χρησιμοποιώντας βασικούς ορισμούς όπως

```latex
\newtoks\headertoks% μια νέα μεταβλητή λίστας συμβόλων για το κείμενο της κεφαλίδας
\newtoks\footertoks% μια νέα μεταβλητή λίστας συμβόλων για το κείμενο του υποσέλιδου
% Χρησιμοποιήστε το \global για να διασφαλίσετε ότι τα αποθηκευμένα δεδομένα κεφαλίδας ή υποσέλιδου είναι
% προσβάσιμα παντού, συμπεριλαμβανομένων των εντολών στη
% ρουτίνα εξόδου
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

στο οποίο `\headertoks` και `\footertoks` είναι λίστες συμβόλων που χρησιμοποιούνται για την αποθήκευση του κειμένου των κεφαλίδων και υποσέλιδων.

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

![Γράφημα που απεικονίζει λανθασμένες κεφαλίδες και υποσέλιδα που παράγονται αν η ρουτίνα εξόδου χρησιμοποιεί μόνο μακροεντολές TeX για να ανακτήσει το κείμενο κεφαλίδας και υποσέλιδου](/files/4d2a187295b9023743cccc9f6c1d8f87975a1197)

#### Η ασύγχρονη συμπεριφορά του TeX: η εντολή \mark στη διάσωση

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

Στο [Το TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), ο Donald Knuth, δημιουργός του TeX, περιγράφει αυτή την κατάσταση ως

> ... η ρουτίνα εξόδου του TeX καθυστερεί σε σχέση με τις δραστηριότητές του κατασκευής σελίδων

Λόγω αυτής της μη συγχρονισμένης σχέσης, απαιτούνται «ειδικές διευκολύνσεις» με τη μορφή του *μηχανισμού marks*, που εφαρμόζεται μέσω της `\mark` (ή `\marks n`) εντολής, για να διασφαλιστεί ότι οι κεφαλίδες και τα υποσέλιδα περιέχουν υλικό σχετικό με την πραγματική σελίδα που εξάγεται. Η `\mark` εντολή ενσωματώνει κόμβους mark στο περιεχόμενο της σελίδας, αποθηκεύοντας τη θέση μνήμης του περιεχομένου που μπορεί να χρησιμοποιηθεί για την κεφαλίδα και το υποσέλιδο της σελίδας-ξενιστή.

Ο συγγραφέας του γνωστού και σεβαστού βιβλίου [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) περιγράφει τον `\mark` μηχανισμό ως

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

Η `\mark` εντολή είναι ένας μηχανισμός σχεδιασμένος να παρακάμπτει την ασύγχρονη φύση του αλγορίθμου διακοπής σελίδας και της ρουτίνας εξόδου του TeX.

![Σχηματική αναπαράσταση δεδομένων mark (κόμβων) ενσωματωμένων στο περιεχόμενο του σώματος της σελίδας](/files/2987b8517298cd9b081a1b63dd79664177b2ae6e)

### Έλεγχοι πριν από την έξοδο: αναζητώντας κόμβους mark

Αφού η μηχανή TeX προσδιορίσει τη θέση μιας διακοπής σελίδας, καλεί μια εσωτερική ρουτίνα (που ονομάζεται `fire_up()`) η οποία κάνει πολλή προεπεξεργασία πριν η ρουτίνα εξόδου ολοκληρώσει τη σύνθεση της σελίδας και γράψει την τελική σελίδα στο αρχείο PDF. Ένα σημαντικό μέρος αυτών των βημάτων προεπεξεργασίας είναι να οριστεί η τιμή τριών *καθολικών μεταβλητών mark*: `\botmark`, `\topmark` και `\firstmark` που χρησιμοποιούνται για την παροχή δεδομένων για την κατασκευή κεφαλίδων και υποσέλιδων. Φυσικά, μια σελίδα μπορεί να περιέχει πολλούς κόμβους mark, αλλά αυτοί φιλτράρονται ώστε να παραχθούν οι τρεις μεταβλητές mark οι οποίες λειτουργούν ως εξής:

* **`\botmark`** είναι το mark που ισχύει στη τρέχουσα διακοπή σελίδας· δηλαδή, το τελευταίο mark που είδαμε στη *τρέχον* page
* **`\topmark`** είναι η τιμή του `\botmark` από το *προηγούμενου* page
* **`\firstmark`** είναι το πρώτο mark στη *τρέχον* σελίδα — το πρώτο mark μεταξύ `\topmark` και `\botmark`

Το παρακάτω σχήμα παρουσιάζει τις βασικές αρχές της προεπεξεργασίας του στοιχειοθετημένου περιεχομένου της σελίδας για τον προσδιορισμό των τιμών των τριών καθολικών μεταβλητών mark `\botmark`, `\topmark` και `\firstmark`:

![Σχηματική αναπαράσταση των βασικών αρχών που χρησιμοποιούνται για τον προσδιορισμό των τιμών των τριών καθολικών μεταβλητών mark \botmark, \topmark και \firstmark](/files/8f26f311a81f772d0ed15665821426fb822d9cbb)

Η επόμενη ενότητα χρησιμοποιεί ορισμένες από τις εξηγήσεις που δόθηκαν παραπάνω για να περιγράψει πώς το LaTeX στοιχειοθετεί κεφαλίδες και υποσέλιδα.

### Οι κλάσεις του LaTeX: στυλ σελίδας και κεφαλίδες/υποσέλιδα

Όταν γράφετε `\documentclass{*κλάση*}` όπου `*κλάση*` μπορεί να είναι `article`, `book`, `αναφορά` ή `letter`, το LaTeX φορτώνει ένα αρχείο με όνομα `*κλάση*.cls`; για παράδειγμα, `book.cls`, `article.cls` και ούτω καθεξής. Αυτά τα `.cls` αρχεία περιέχουν κώδικα LaTeX για να υλοποιήσουν παραλλαγές συγκεκριμένες για την κλάση διαφόρων εντολών και χαρακτηριστικών που αναμένεται να υπάρχουν και να παρέχονται από όλες τις κλάσεις εγγράφων — τις συμπεριφορές που μοιράζονται όλες οι κλάσεις εγγράφων. Παραδείγματα μπορεί να περιλαμβάνουν περιθώρια διάταξης σελίδας συγκεκριμένα για την κλάση μαζί με εκδόσεις συγκεκριμένες για την κλάση εντολών όπως `\section`, `\subsection` και ούτω καθεξής.

Ένα άλλο σημαντικό στοιχείο των `.cls` αρχείων είναι η υλοποίηση συγκεκριμένη για την κλάση των τυπικών στυλ σελίδας που ορίζουν τις κεφαλίδες και τα υποσέλιδα των εγγράφων που παράγονται χρησιμοποιώντας μια συγκεκριμένη κλάση και στυλ σελίδας. Για παράδειγμα:

* **`book.cls`** και **`article.cls`** περιέχουν υλοποιήσεις των στυλ σελίδας `headings` και `myheadings`
* **`letter.cls`** περιέχει ορισμούς για τα στυλ σελίδας `headings`, `empty`, `plain` και ένα που ονομάζεται `firstpage`
* **`report.cls`** περιέχει ορισμούς για τα στυλ σελίδας `headings` και `myheadings`

Οι υλοποιήσεις των στυλ σελίδας συχνά εξαρτώνται από την `twoside` επιλογή του `\documentclass`—αν το έγγραφο είναι μονής ή διπλής όψης—ώστε οι κεφαλίδες και τα υποσέλιδα να ορίζονται κατάλληλα για αριστερές (ζυγές) σελίδες και δεξιές (μονές) σελίδες.

Οι κλάσεις εγγράφων μπορεί να βασίζονται σε προεπιλεγμένους ορισμούς των `plain` ή `empty` στυλ σελίδας που παρέχονται αλλού στο LaTeX — εκτός του `.cls` αρχείου που χρησιμοποιείται.

#### Περισσότερα για τα στυλ σελίδας

Όταν αλλάζετε το στυλ μιας σελίδας χρησιμοποιώντας `\pagestyle{*κάποιοστυλ*}` ή `\thispagestyle{*κάποιοστυλ*}` το LaTeX αναμένει να βρει μια εσωτερική εντολή με όνομα `ps@*κάποιοστυλ*`—συνήθως παρέχεται από την κλάση εγγράφου `.cls` αρχείου ή ίσως από ένα πακέτο όπως το `fancyhdr`. Παρεμπιπτόντως, με τον όρο «εσωτερική εντολή» εννοούμε μια εντολή που αποτελεί μέρος του πηγαίου κώδικα του LaTeX και της οποίας το όνομα περιέχει ένα `@` σύμβολο, το οποίο συνήθως αποτρέπει την περιστασιακή χρήση (λόγω του [κωδικός κατηγορίας](/latex/el/perissotera-themata/43-table-of-tex-category-codes.md)).

Ο ορισμός του `\ps@*somestyle*` είναι υπεύθυνος για την υλοποίηση των χαρακτηριστικών/συμπεριφορών αυτού του στυλ σελίδας, τα οποία περιλαμβάνουν την παροχή ορισμών των:

* εντολών που χρησιμοποιούνται στα τελικά στάδια της σύνθεσης σελίδας (για την προσθήκη κεφαλίδων και υποσέλιδων, δείτε [αργότερα στο άρθρο](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* εντολών για την εισαγωγή δεδομένων mark σχετικών με ενότητες, για χρήση στη δημιουργία κεφαλίδων και υποσέλιδων εγγράφων που περιέχουν τίτλους, αριθμούς και παρόμοια των ενοτήτων. Για παράδειγμα, το `headings` στυλ σελίδας (μέσα στο `book.cls`) ορίζει τις ακόλουθες εντολές παραγωγής mark:
  * `\chaptermark`
  * `\sectionmark`

Θα [εξετάσουμε περαιτέρω εντολές που παράγουν marks](#mark-commands-and-mark-data), όπως `\chaptermark`, αλλά μόνο ενδεικτικά: όταν γράφετε `\chapter{τίτλος κεφαλαίου}` το `\chaptermark` εκτελείται επίσης για να εισαχθούν δεδομένα mark σχετικά με το κεφάλαιο για την επακόλουθη παραγωγή κεφαλίδων σελίδας.

#### Ανατομία των εντολών κεφαλίδας και υποσέλιδου με βάση το στυλ σελίδας

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

**Το μοντέλο του LaTeX για κεφαλίδες και υποσέλιδα**

Το περιεχόμενο των (προεπιλεγμένων) κεφαλίδων και υποσέλιδων του LaTeX βασίζεται σε μια ιεραρχία δύο επιπέδων των ενοτήτων του εγγράφου: μια ενότητα «υψηλότερου επιπέδου» που περιέχει πολλές ενότητες «χαμηλότερου επιπέδου». Για τις κλάσεις book και article αυτό μεταφράζεται ως εξής:

* `**book**` **του κόμβου mark**: οι ενότητες «υψηλότερου επιπέδου» παράγονται από τις `\chapter` εντολές και οι ενότητες «χαμηλότερου επιπέδου» μέσω των `\section`, αντανακλώντας κεφάλαια που περιέχουν πολλές ενότητες.
* `**article**` **του κόμβου mark** (υποθέτοντας έγγραφα διπλής όψης): οι ενότητες «υψηλότερου επιπέδου» παράγονται χρησιμοποιώντας τις `\section` εντολές και οι «χαμηλότερου επιπέδου» μέσω των `\subsection`, αντανακλώντας πολλαπλές υποενότητες που εμφανίζονται μέσα στην ίδια ενότητα.

Το LaTeX εφαρμόζει το «μοντέλο» του για κεφαλίδες και υποσέλιδα μέσω των εντολών διαίρεσης σε ενότητες, οι οποίες «εισάγουν» κόμβους mark (μέσω της `\mark` εντολής) για να αποθηκεύσουν δεδομένα σχετικά με την ενότητα του εγγράφου που δημιουργείται. Για παράδειγμα, κάθε φορά που γράφετε `\section{*κάποιος τίτλος ενότητας*}` θα δημιουργείται ένας κόμβος mark, ο οποίος περιέχει δεδομένα που αντικατοπτρίζουν `*κάποιος τίτλος ενότητας*` και τον αριθμό της ενότητας.

Το LaTeX χρησιμοποιεί ένα σύστημα marks που περιέχουν δεδομένα της μορφής `{left}{right}`, το οποίο τελικά παράγεται μέσω της `\mark` εντολές

```latex
\mark{{left}{right}}
```

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

#### Εξερεύνηση της κλάσης book

Όταν φορτώνεται το `book.cls` αρχείο, μία από τις τελευταίες ενέργειές του είναι να εκτελέσει `\pagestyle{headings}` το οποίο ορίζει το προεπιλεγμένο στυλ σελίδας σε `headings`\pagestyle{headings}, οπότε θα εξετάσουμε αυτό το στυλ σελίδας με περισσότερες λεπτομέρειες.

Όπως [σημειώθηκε παραπάνω](#more-on-page-styles), τα χαρακτηριστικά/ιδιότητες του `headings` στυλ σελίδας, όπως υλοποιούνται από την `book` κλάση, θα ορίζονται από την (εσωτερική) εντολή `\ps@headings` που περιέχεται στο αρχείο `book.cls`. Ο ακριβής ορισμός του `\ps@headings` εξαρτάται από το αν το έγγραφο είναι μονής ή διπλής όψης (προεπιλογή για την `book` κλάση).

**«Εντολές mark» και «δεδομένα mark»**

Για έγγραφα διπλής όψης που παράγονται από την `book` κλάση, ο ορισμός του `\ps@headings` δημιουργεί (ορίζει) δύο «εντολές mark»: `\chaptermark` και `\sectionmark` οι οποίες παράγουν «δεδομένα mark», της μορφής `{left}{right}`, για χρήση σε κεφαλίδες και υποσέλιδα. Αυτές οι εντολές mark αντικατοπτρίζουν το μοντέλο κεφαλίδων και υποσέλιδων του LaTeX — βασισμένο στην ιεραρχία των ενοτήτων του εγγράφου:

* η εντολή ενότητας «υψηλότερου επιπέδου» (εδώ, `\chapter`) χρησιμοποιείται για να παρέχει «δεδομένα mark» για κεφαλίδες σε αριστερές (ζυγές) σελίδες. Όταν ξεκινάτε ένα νέο κεφάλαιο, γράφοντας `\chapter{*τίτλος κεφαλαίου*}`, `\chaptermark` καλείται για να δημιουργήσει «δεδομένα mark» που αντικατοπτρίζουν αυτό το νέο κεφάλαιο — περιέχοντας τον `*chapter title*` και τον αριθμό του.
* η εντολή ενότητας «χαμηλότερου επιπέδου» (εδώ, `\section`) χρησιμοποιείται για να παρέχει «δεδομένα σήμανσης» για σελίδες με δεξιά όψη (μονός αριθμός). Όταν γράφετε `\section{*section title*}` το `\sectionmark` η εντολή θα κληθεί για να δημιουργήσει «δεδομένα σήμανσης» που αντικατοπτρίζουν τη νέα ενότητα—περιέχοντας το `*section title*` και τον αριθμό της. Οποιαδήποτε δεδομένα σήμανσης που παρέχονται από την προηγούμενη `\chapter` δεν επηρεάζεται από οποιεσδήποτε επόμενες εντολές \section.

**\markboth και \markright**

Οι εντολές σήμανσης ανά ενότητα του LaTeX, όπως `\chaptermark` και `\sectionmark`, χρησιμοποιούν δύο επιπλέον εντολές που ονομάζονται `\markboth` και `\markright` οι οποίες παρέχουν τα πραγματικά δεδομένα σήμανσης για κεφαλίδες και υποσέλιδα. `\markboth` και/ή `\markright` μπορούν να περιλαμβάνουν εντολές για τη μορφοποίηση του κειμένου της κεφαλίδας ή του υποσέλιδου, όπως η μετατροπή του σε κεφαλαία.

Για έγγραφα που παράγονται με χρήση `book` προεπιλογές κλάσης (διπλής όψης, `headings` στυλ σελίδας), οι εντολές που παράγουν σήμανση λειτουργούν ως εξής:

* `\chaptermark` παράγει δεδομένα σήμανσης χρησιμοποιώντας `\markboth`
* `\sectionmark` παράγει δεδομένα σήμανσης `\markright`

`\markboth` και `\markright` είναι μακροεντολές οι οποίες, τελικά, χρησιμοποιούν την πρωτογενή (ενσωματωμένη, χαμηλού επιπέδου) `\mark` εντολή για να εισάγουν πραγματικά τις σημάνσεις που παράγονται μέσα από εντολές τμηματοποίησης.

`\markboth` έχει τη μορφή

* **`\markboth{left}{right}`**: εισάγει μια σήμανση (κόμβο) χρησιμοποιώντας `\mark{{left}{right}}` με αποτέλεσμα έναν κόμβο σήμανσης που περιέχει ένα ζεύγος τιμών μέσα σε αγκύλες `{left}{right}`.

`\markright` έχει τη μορφή

* **`\markright{newright}`**: εισάγει μια σήμανση (κόμβο) χρησιμοποιώντας `\mark{{currentleft}{newright}}`· δηλαδή, αλλάζει την τρέχουσα τιμή του `right` σε `newright` αλλά η τρέχουσα τιμή του `left` (δηλ., `currentleft`) παραμένει αμετάβλητη, με αποτέλεσμα έναν κόμβο σήμανσης που περιέχει ένα ζεύγος τιμών μέσα σε αγκύλες `{currentleft}{newright}`.

Η συμπεριφορά του `\markboth` και `\markright` υποστηρίζουν την ιεραρχία δύο επιπέδων των ενοτήτων, όπως ένα έγγραφο που περιέχει πολλαπλές ενότητες μέσα σε κάθε κεφάλαιο.

Ως παραδείγματα για την (διπλής όψης) `book` κλάση εγγράφου (χρησιμοποιώντας το στυλ σελίδας επικεφαλίδων):

* `\chaptermark` χρησιμοποιεί `\markboth` για να ορίσει:
  * a `{left}` πεδίο το οποίο στοιχειοθετεί το CHAPTER . σε κεφαλαία.
  * ένα πεδίο {right} το οποίο είναι κενό (`{}`)
* `\sectionmark` χρησιμοποιεί `\markright` για να ορίσει το `{right}` πεδίο σήμανσης ώστε να στοιχειοθετηθεί., επίσης σε κεφαλαία.

Για να καταλάβουμε γιατί `\sectionmark` χρησιμοποιεί `\markright` μπορούμε να παρατηρήσουμε ότι κάθε νέα `\section` εντολή θα πρέπει:

* να εισάγει μια νέα σήμανση που περιέχει δεδομένα για αυτήν την `\section` (όπως τον τίτλο και τον αριθμό της).
* αλλά *όχι* να επηρεάζει τις τιμές των δεδομένων σήμανσης για την τρέχουσα `\chapter` στην οποία η συγκεκριμένη `\section` εντολή εμφανίζεται

Για αυτούς τους λόγους, η `\section` εντολή καλεί `\sectionmark` η οποία χρησιμοποιεί `\markright` για να δημιουργήσει μια `\section`-σχετική σήμανση: ενημερώνει το `{right}` πεδίο δεδομένων σήμανσης αλλά δεν επηρεάζει την τρέχουσα `{left}` τιμή του πεδίου δεδομένων σήμανσης που ορίστηκε από την τρέχουσα `\chapter`.

Σημείωση: ο πηγαίος κώδικας LaTeX περιέχει την προειδοποίηση:

> Οι εντολές σήμανσης λειτουργούν αρκετά καλά για δεξιές σημάνσεις «αριθμημένες μέσα σε» αριστερές σημάνσεις—π.χ. η αριστερή σήμανση αλλάζει από μια εντολή \chapter και η δεξιά σήμανση αλλάζει από μια εντολή \section. Ωστόσο, δίνει κάπως ανώμαλα αποτελέσματα αν 2 \markboth εμφανιστούν στην ίδια σελίδα.

**Εντολές για τη ρουτίνα εξόδου**

Η `\ps@headings` η εντολή υλοποιεί ορισμούς των ακόλουθων εντολών

* `\@oddhead`
* `\@oddfoot`
* `\@evenhead`
* `\@evenfoot`

οι οποίες χρησιμοποιούνται από τη ρουτίνα εξόδου για να προσθέτουν κεφαλίδες και υποσέλιδα κατά το τελικό στάδιο της σύνθεσης της σελίδας. Για παράδειγμα, `book.cls` ορίζει `\@oddfoot` και `\@evenfoot` στην τιμή `\@empty`, το οποίο ορίζεται ως `\def\@empty{}`, έτσι `\ps@headings` παράγει κενά υποσέλιδα σε σελίδες αριστερής και δεξιάς όψης:

```latex
\let\@oddfoot\@empty
\let\@evenfoot\@empty
```

Οι κεφαλίδες ορίζονται ως εξής:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
```

όπου

* `\leftmark` εξάγει την `{left}` τιμή από ένα `{left}{right}` ζεύγος σήμανσης
* `\rightmark` εξάγει την `{right}` τιμή από ένα `{left}{right}` ζεύγος σήμανσης
* \thepage εμφανίζει τον τρέχοντα αριθμό σελίδας

Ουσιαστικά, αυτές οι υλοποιήσεις του `\@evenhead` και `\@oddhead` παράγουν τα ακόλουθα αποτελέσματα:

* `\@evenhead`: ο αριθμός της σελίδας εμφανίζεται αριστερά στην κεφαλίδα και το περιεχόμενο του `\leftmark`, μορφοποιημένο με την εντολή γραμματοσειράς `\slshape`, εμφανίζεται δεξιά στην κεφαλίδα—το ενδιάμεσο λευκό διάστημα παρέχεται από το ιδιαίτερα ευέλικτο `\hfil` glue.
* `\@oddhead`: το περιεχόμενο του `\rightmark`, μορφοποιημένο με την εντολή γραμματοσειράς `\slshape`, εμφανίζεται αριστερά στην κεφαλίδα και ο τρέχων αριθμός σελίδας εμφανίζεται δεξιά στην κεφαλίδα—και πάλι, το ενδιάμεσο λευκό διάστημα παρέχεται από το `\hfil` glue.

Ωστόσο, παραμένει ένα βασικό ερώτημα: *οι οποίοι* `{left}{right}` ζεύγη σήμανσης χρησιμοποιούνται από `\leftmark` και `\rightmark`: με άλλα λόγια, από πού αντλούν τις τιμές των δεδομένων σήμανσης;

Όπως [σημειώθηκε παραπάνω](#filtering) αλλά [εξηγείται παρακάτω](#explainfiltering), κατά τα τελικά στάδια σύνθεσης της σελίδας, οποιεσδήποτε σημάνσεις περιέχονται στις σελίδες του εγγράφου «φιλτράρονται» και χρησιμοποιούνται για να ορίσουν την τιμή τριών παγκόσμιων μεταβλητών σήμανσης: `\botmark`, `\topmark` και `\firstmark`. Λόγω της [δομής των σημάνσεων του LaTeX](#latexs-model-of-headers-and-footers), καθεμία από αυτές τις 3 μεταβλητές σήμανσης θα περιέχει τελικά μια τιμή `{left}{right}` για κάποιο ζεύγος τιμών `{left}` και `{right}` και αυτές είναι που παρέχουν το πραγματικό `{left}{right}` ζεύγος σήμανσης (πεδία) για `\leftmark` και `\rightmark`:

* `\leftmark` εξάγει την `left` τιμή από το `{left}{right}` ζεύγος σήμανσης (πεδία) που παρέχεται από `\botmark`
* `\rightmark` εξάγει την `right` τιμή από το `{left}{right}` ζεύγος σήμανσης που παρέχεται από `\firstmark`

Σημείωση `\markboth` και `\markright` μπορεί να περιέχει εντολές για τη μορφοποίηση του κειμένου της κεφαλίδας και του υποσέλιδου—όπως η μετατροπή σε κεφαλαία.

### Παραδείγματα με χρήση εντολών χαμηλότερου επιπέδου του LaTeX

Τα ακόλουθα παραδείγματα δείχνουν πώς να γίνουν αλλαγές στα στυλ σελίδας ή στις κεφαλίδες και τα υποσέλιδα επαναορίζοντας ορισμένες από τις εντολές χαμηλού επιπέδου (εσωτερικές) του LaTeX που συζητούνται σε αυτό το άρθρο (εκείνες που περιέχουν το σύμβολο @). Δεν προτείνουμε αυτήν τη μέθοδο για την αλλαγή κεφαλίδων και υποσέλιδων, αλλά είναι διαθέσιμη σε όσους τη χρειάζονται (π.χ. συγγραφείς πακέτων). Η προτιμώμενη λύση για την αλλαγή κεφαλίδων και υποσέλιδων είναι η χρήση του [`fancyhdr` πακέτο](https://ctan.org/pkg/fancyhdr?lang=en), η οποία συζητείται σε ένα [άρθρο βοήθειας του Overleaf](/latex/el/morfopoiisi/02-headers-and-footers.md).

#### Ορισμός ενός ελάχιστου στυλ σελίδας

Το ακόλουθο παράδειγμα ορίζει ένα νέο, εξαιρετικά ελάχιστο, στυλ σελίδας που ονομάζεται `demostyle` το οποίο χρησιμοποιεί στατικό κείμενο για να ορίσει τις κεφαλίδες και τα υποσέλιδα και δεν βασίζεται σε εντολές τμηματοποίησης (`\chapter`, `\section` κ.λπ.) για να ορίσει το περιεχόμενο της κεφαλίδας και του υποσέλιδου.

Το παράδειγμα ξεκινά αλλάζοντας τον κωδικό κατηγορίας του `@` χαρακτήρα σε 11 ώστε να μπορεί να χρησιμοποιηθεί μέσα σε ονόματα μακροεντολών. Η `\ps@demostyle` εντολή υλοποιεί το ελάχιστο στυλ σελίδας μας επαναορίζοντας τις εντολές που χρησιμοποιούνται (στη ρουτίνα εξόδου) για την παραγωγή των κεφαλίδων και των υποσέλιδων: `\@oddhead`, `\@oddfoot`, `\@evenhead` και `\@evenfoot`. Σημειώστε την `twoside` επιλογή στην `\documentclass` δήλωσή μας—η οποία χρησιμοποιεί την `article` κλάση.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil Το υποσέλιδο της μονής σελίδας\hfil}%
\renewcommand\@evenfoot{\hfil Το υποσέλιδο της ζυγής σελίδας\hfil}%
\renewcommand\@evenhead{\thepage\hfil Η κεφαλίδα της ζυγής σελίδας}%
\renewcommand\@oddhead{Η κεφαλίδα της μονής σελίδας\hfil\thepage}
\catcode`@=12
\title{Επίδειξη ενός στυλ σελίδας}
\author{Overleaf}
\date{Αύγουστος 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Εισαγωγή}
\newpage
\section{Περισσότερο υλικό}
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα στο Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+new+page+style\&snip=%5Cdocumentclass%5Btwoside%5D%7Barticle%7D%0A%5Ccatcode%60%40%3D11%0A%5Cnewcommand%7B%5Cps%40demostyle%7D%7B%25%0A%5Crenewcommand%5C%40oddfoot%7B%5Chfil+The+odd-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenfoot%7B%5Chfil+The+even-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenhead%7B%5Cthepage%5Chfil+The+even-page+header%7D%25%0A%5Crenewcommand%5C%40oddhead%7BThe+odd-page+header%5Chfil%5Cthepage%7D%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+a+page+style%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bdemostyle%7D%0A%5Cmaketitle%0A%5Cnewpage%0A%5Csection%7BIntroduction%7D%0A%5Cnewpage%0A%5Csection%7BMore+material%7D%0A%5Cend%7Bdocument%7D)

#### Αλλαγή κεφαλίδων για την κλάση βιβλίου

Το ακόλουθο παράδειγμα αλλάζει τις κεφαλίδες για την κλάση βιβλίου επαναορίζοντας `\@oddhead` και `\@evenhead` ώστε οι κεφαλίδες των σελίδων αριστερής και δεξιάς όψης να περιέχουν τον τρέχοντα αριθμό σελίδας και τον τίτλο του κεφαλαίου. Δείτε πώς η δεύτερη `\chapter` εντολή χρησιμοποιεί τον προαιρετικό σύντομο τίτλο κεφαλαίου `[Ο σύντομος τίτλος]` ο οποίος τώρα παρέχει το κείμενο της κεφαλίδας, αντί για τον πλήρη τίτλο.

`\section` οι εντολές δεν έχουν καμία επίδραση στο περιεχόμενο της κεφαλίδας επειδή οι επαναορισμοί της κεφαλίδας μας χρησιμοποιούν μόνο `\leftmark` οι οποίοι αντλούν λεπτομέρειες του τρέχοντος κεφαλαίου. Για να αποκτήσουμε πρόσβαση στις λεπτομέρειες της τρέχουσας ενότητας θα έπρεπε να χρησιμοποιήσουμε `\rightmark` στον ορισμό του `\@oddhead` και/ή `\evenhead`.

```latex
\documentclass{book}
% ΣΗΜ: ο κωδικός κατηγορίας του '@' αλλάζει προσωρινά σε 11
% για να επιτραπεί η χρήση του σε ονόματα εντολών
\catcode `@=11
% Ας γίνει το \@oddfoot και το \evenfoot ισοδύναμα του \@empty
% ώστε να είναι κενά (empty)
\let\@oddfoot\empty\let\evenfoot\empty
% Επαναορισμός των \@oddhead και \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Χρησιμοποιήστε ένα βολικά μικρό μέγεθος σελίδας
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Απομνημονεύματα ενός χρήστη του \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Αυτό είναι το frontmatter που χρησιμοποιεί ρωμαϊκούς αριθμούς.
\mainmatter
\chapter{Από πού να αρχίσω;}
Κεφάλαιο 1: Ένα σύντομο κεφάλαιο.
\newpage
\section{Στην αρχή...}
Μια ενότητα.
\chapter[Ο σύντομος τίτλος]{Ένα κεφάλαιο με πολύ μεγάλο τίτλο, που το καθιστά ακατάλληλο για κεφαλίδες}
\newpage
\section{Άλλη ενότητα}
Με λίγο περιεχόμενο.
\newpage
\section{Τι, άλλη ενότητα;}
Επίσης με λίγο περιεχόμενο.
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα στο Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+headers+for+the+book+class\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%25+Let+%5C%40oddfoot+and+%5Cevenfoot+be+equivalent+to+%5C%40empty%0A%25+to+make+them+blank+%28empty%29%0A%5Clet%5C%40oddfoot%5Cempty%5Clet%5Cevenfoot%5Cempty%0A%25+Redefine+%5C%40oddhead+and+%5C%40evenhead%0A%5Crenewcommand%7B%5C%40oddhead%7D%7B%5Cleftmark%5Chfil%5Cthepage%7D%0A%5Crenewcommand%7B%5C%40evenhead%7D%7B%5Cthepage%5Chfil%5Cleftmark%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cchapter%5BThe+short+title%5D%7BA+chapter+with+a+very+long+title%2C+making+it+unsuitable+for+headers%7D%0A%5Cnewpage%0A%5Csection%7BAnother+section%7D%0AWith+little+content.%0A%5Cnewpage%0A%5Csection%7BWhat%2C+another+section%3F%7D%0AAlso+with+little+content.%0A%5Cend%7Bdocument%7D)

#### Χρήση των επεκταμένων εντολών σημάνσεων του ε-TeX

Η `book` η κλάση χρησιμοποιεί τους ακόλουθους ορισμούς του `\@evenhead` και `\@oddhead` για την παραγωγή κεφαλίδων:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}
```

όπου οι εντολές `\leftmark` και `\rightmark` ορίζονται ως

```latex
\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty}
\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty}
```

Χρησιμοποιώντας τις επεκταμένες εντολές του ε-TeX, και την ισοδυναμία μεταξύ της κλάσης 0 σημάνσεων του ε-TeX και των αρχικών εντολών του TeX, μπορούμε:

* να ξαναγράψουμε `\leftmark` για να αντικαταστήσουμε το `\botmark` με το `\botmarks0` ισοδύναμο, και
* να ξαναγράψουμε `\rightmark` για να αντικαταστήσουμε το `\firstmark` με το `\firstmarks0` ισοδύναμο

Αυτοί οι επαναορισμοί παράγουν

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
```

Σημειώστε τη χρήση του `\\relax` για να τερματιστεί το κυνήγι του TeX για περαιτέρω ψηφία—μπορείτε επίσης να αντικαταστήσετε το `\\relax` με ένα κενό διάστημα ώστε να λειτουργεί ως τερματικό.

Το ακόλουθο παράδειγμα παράγει έξοδο που είναι πανομοιότυπη με τους αρχικούς ορισμούς του `\leftmark` και `\rightmark`.

```latex
\documentclass{book}
% Επαναορίστε το \leftmark και το \rightmark ώστε να χρησιμοποιούν
% τα \botmarks0 και \firstmarks0 αντίστοιχα
% ΣΗΜ: ο κωδικός κατηγορίας του '@' αλλάζει προσωρινά σε 11
% για να επιτραπεί η χρήση του σε ονόματα εντολών
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Χρησιμοποιήστε ένα βολικά μικρό μέγεθος σελίδας
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Απομνημονεύματα ενός χρήστη του \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Αυτό είναι το frontmatter που χρησιμοποιεί ρωμαϊκούς αριθμούς.
\mainmatter
\chapter{Από πού να αρχίσω;}
Κεφάλαιο 1: Ένα σύντομο κεφάλαιο.
\newpage
\section{Στην αρχή...}
Μια ενότητα.
\newpage
Άλλη ενότητα.
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα στο Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+%CE%B5-TeX%E2%80%99s+extended+marks+command\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks0+and+%5Cfirstmarks0+respectively%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cnewpage%0AAnother+section.%0A%5Cend%7Bdocument%7D)

**Σημειώσεις για το ε-TeX**

Όπως [σημειώσαμε παραπάνω](#etex), το ε-TeX εισάγει το `\marks` εντολή:

```latex
\marks n {πράγματα προς αποθήκευση}
```

το οποίο επεκτείνει το αρχικό `\mark` χαρακτηριστικό της μηχανής TeX του Knuth και είναι διαθέσιμο και στις τρεις κύριες μηχανές TeX: pdfTeX, LuaTeX και XeTeX.

η υλοποίηση του ε-TeX εισάγει επίσης νέες παγκόσμιες μεταβλητές σήμανσης `\firstmarks n`, `\botmarks n` και `\topmarks n`: μία για κάθε κλάση `n`. Αυτές οι μεταβλητές σήμανσης βάσει κλάσης καθορίζονται [χρησιμοποιώντας τους μηχανισμούς που περιγράφονται παραπάνω](#pre-output-checks-looking-for-mark-nodes), και όλες μπορούν να χρησιμοποιηθούν στην παραγωγή κεφαλίδων και υποσέλιδων.

Μπορείτε να χρησιμοποιήσετε οποιαδήποτε από τις $$2^{15}$$ = 32768 κλάσεις σημάνσεων, από 0 έως 32767, μέσα σε επαναορισμούς του `\leftmark` ή `\rightmark`. Αυτό προϋποθέτει ότι έχετε παράσχει (εισαγάγει) κατάλληλα δεδομένα σήμανσης για την κλάση σήμανσης που επιλέξατε, `n`, μέσω του `\marks n{{left}{right}}`.

Σημειώστε ότι το LuaTeX παρέχει $$2^{16}$$ = 65536 κλάσεις σημάνσεων, με το `n` να κυμαίνεται από 0 έως 65535.

**Παράδειγμα με χρήση της κλάσης σημάνσεων 10**

Αυτό το παράδειγμα δείχνει τη χρήση της κλάσης σημάνσεων 10 (επιλεγμένης τυχαία) για τη δημιουργία κεφαλίδων εγγράφου. Το δείγμα εγγράφου στοιχειοθετεί 6 σελίδες οι οποίες περιέχουν τη σειρά σημάνσεων που παρουσιάζεται στο [λυμένο παράδειγμα στο τέλος αυτού του άρθρου](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). Η μελέτη εκείνου του παραδείγματος θα δείξει γιατί η μηχανή TeX επέλεξε μια συγκεκριμένη σήμανση, $$\alpha$$, $$\beta$$, $$\gamma$$ και $$\delta$$, για χρήση σε καθεμία από τις κεφαλίδες.

Ξεκινάμε ορίζοντας μια βολική μακροεντολή, `\domark`, η οποία χρησιμοποιεί `\marks 10` για να εισαγάγει δεδομένα σήμανσης που ακολουθούν τη σύμβαση του LaTeX: `{left}{right}` σύμβαση:

```latex
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
```

Οι σημάνσεις της κλάσης 10 καθίστανται προσβάσιμες στον μηχανισμό κεφαλίδας και υποσέλιδου του LaTeX με τον επαναορισμό του `\leftmark` και `\rightmark`—με λίγες πρόσθετες πληροφορίες να προστίθενται:

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
```

Αφού εισαχθεί ένας αριθμός σημάνσεων (κλάσης 10), η μηχανή TeX (εδώ, το pdfTeX) δημιουργεί πρόθυμα παγκόσμιες μεταβλητές σήμανσης για την κλάση 10—`\botmarks10`, `\topmarks10` και `\firstsmarks10` οι οποίοι `\leftmark` και `\rightmark` για να παράγει τις κεφαλίδες.

```latex
\documentclass{book}
% Μια σύντομη εντολή για τη χρήση σημάνσεων με κλάση 10
% και ακολουθώντας τη δομή σήμανσης του LaTeX {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Επαναορίστε το \leftmark και το \rightmark ώστε να χρησιμοποιούν
% \botmarks10 και \firstmarks10 αντίστοιχα
\catcode`@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
\catcode`@=12
\title{Επίδειξη των βελτιωμένων σημάνσεων του \(\varepsilon\)-\TeX{}}
\author{Overleaf}
\date{Αύγουστος 2022}
\begin{document}

Σελίδα 1: Δεν προστίθενται σημάνσεις, έτσι όλες οι μεταβλητές σήμανσης παραμένουν στην αρχικοποιημένη τους κατάσταση: κενές (NULL).

\newpage
Σελίδα 2: προστίθεται σήμανση $\alpha$ σε αυτή τη σελίδα μέσω του

\verb|\domark{$\alpha$-left}{$\alpha$-right}|\domark{$\alpha$-left}{$\alpha$-right}

\newpage
Σελίδα 3: Δεν προστίθενται νέες σημάνσεις σε αυτή τη σελίδα.

\newpage
Σελίδα 4: σήμανση $\beta$ ακολουθούμενη από σήμανση $\gamma$ προστίθενται σε αυτή τη σελίδα μέσω του

\verb|\domark{$\beta$-left}{$\beta$-right}|

\verb|\domark{$\gamma$-left}{$\gamma$-right}|.
\domark{$\beta$-left}{$\beta$-right}
\domark{$\gamma$-left}{$\gamma$-right}

\newpage
Σελίδα 5: προστίθεται σήμανση $\delta$ σε αυτή τη σελίδα μέσω του

\verb|\domark{$\delta$-left}{$\delta$-right}|
\domark{$\delta$-left}{$\delta$-right}

\newpage
Σελίδα 6: Δεν προστίθενται σημάνσεις σε αυτή τη σελίδα.
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα στο Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+e-TeX+global+marks+variables\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+A+short+command+to+use+marks+with+class+10%0A%25+and+following+LaTeX%27s+mark+structure+%7Bleft%7D%7Bright%7D%0A%5Cnewcommand%7B%5Cdomark%7D%5B2%5D%7B%5Cmarks+10%7B%7B%231%7D%7B%232%7D%7D%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks10+and+%5Cfirstmarks10+respectively%0A%5Ccatcode%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cbotmarks10%7D%29%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cfirstmarks10%7D%29%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+%5C%28%5Cvarepsilon%5C%29-%5CTeX%E2%80%99s+enhanced+marks%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%0APage+1%3A+No+marks+added+so+all+mark+variables+remain+in+their+initialized+state%3A+empty+%28NULL%29.%0A%0A%5Cnewpage%0APage+2%3A+%24%5Calpha%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%0A%0A%5Cnewpage%0APage+3%3A+No+new+marks+added+to+this+page.%0A%0A%5Cnewpage%0APage+4%3A+%24%5Cbeta%24-mark+followed+by+%24%5Cgamma%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%7C%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%7C.%0A%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%0A%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%0A%0A%5Cnewpage%0APage+5%3A+%24%5Cdelta%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%7C%0A%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%0A%0A%5Cnewpage%0APage+6%3A+No+marks+added+to+this+page.%0A%5Cend%7Bdocument%7D)

Το ακόλουθο γραφικό δείχνει τις κεφαλίδες που παράγονται από αυτό το παράδειγμα:

![Γραφικό που δείχνει την έξοδο από κώδικα LaTeX που χρησιμοποιεί τις επεκταμένες εντολές σημάνσεων του ε-TeX](/files/624b0f862b7b0ec6ac3d118e0e8cdacc9c5548a0)

* **Σημείωση**: Η κεφαλίδα στη σελίδα 1 δημιουργείται τη στιγμή που και οι τρεις μεταβλητές σήμανσης για την κλάση 10—`\botmarks10`, `\topmarks10` και `\firstsmarks10`—είναι κενές. Το τελικό αποτέλεσμα είναι ότι `\rightmark` (για τη σελίδα 1) εισάγει μόνο το τελευταίο τμήμα κεφαλίδας: `(μέσω \texttt{\string\firstmarks10})`, όπως φαίνεται στο παραπάνω γραφικό.

## Ένα λυμένο παράδειγμα που δείχνει πώς οι μηχανές TeX καθορίζουν τιμές για τα \botmark, \topmark και \firstmark

![Db.gif](/files/3003b44d1254162bdfe134acb8502abf88e035d4)![Db.gif](/files/3003b44d1254162bdfe134acb8502abf88e035d4) Φαίνεται ταιριαστό να αναπαραγάγουμε τη χρήση από τον Knuth των διπλών επικίνδυνων συμβόλων κλίσης (η εικόνα προσφέρεται ευγενικά από το [αυτόν τον ιστότοπο](http://www.truetex.com/db.htm)) επειδή το υλικό είναι κάπως χαμηλού επιπέδου και «κοιτάζει κάτω από το καπό»—αν και ελπίζουμε να ενδιαφέρει τους τολμηρούς αναγνώστες που θέλουν να κατανοήσουν μερικές ακόμη λεπτομέρειες.

Η ακόλουθη συζήτηση βασίζεται στενά στο τελευταίο παράδειγμα στη σελίδα 258 του [Το TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Εδώ, έχουμε επεξεργαστεί και ξαναστοιχειοθετήσει εκείνο το παράδειγμα για όσους δεν έχουν πρόσβαση στο The TeXbook:

![Μια επεξεργασμένη και ξαναστοιχειοθετημένη έκδοση ενός παραδείγματος από τη σελίδα 258 του TeXbook](/files/82e9b87fc0b2ca0a298757162794bc6428daa2db)

Ο πίνακας που παρουσιάζεται σε αυτό το γραφικό αναπαράγεται από έναν που παρείχε ο Knuth, αλλά, όπως και το πρωτότυπο, δεν υπάρχει εξήγηση για το πώς προέκυψε. Εδώ θα το αντιμετωπίσουμε αυτό για να παρέχουμε πρόσθετες λεπτομέρειες που δείχνουν πώς καθορίστηκαν εκείνες οι τιμές του `\botmark`, `\topmark` και `\firstmark` καθορίστηκαν—η απόκτηση αυτών των λεπτομερειών απαιτούσε εξερεύνηση του πηγαίου κώδικα μιας μηχανής TeX!

Η διαδικασία ορισμού τιμών για `\botmark`, `\topmark` και `\firstmark` μπορεί να συνοψιστεί σε 3 σύντομα τμήματα ψευδοκώδικα όπως φαίνεται στο ακόλουθο διάγραμμα και στις επόμενες επεξηγήσεις:

1. Προέλεγχος περιεχομένου
2. Βρόχος περιεχομένου
3. Μεταέλεγχος περιεχομένου

Σημείωση:

* Οι δοκιμές στο βήμα 1 «Προέλεγχος περιεχομένου» και στο βήμα 3 «Μεταέλεγχος περιεχομένου» εκτελούνται μία φορά ανά σελίδα.
* Το βήμα 2 «Βρόχος περιεχομένου» περιλαμβάνει τη σάρωση του TeX μέσα από το περιεχόμενο της σελίδας αναζητώντας κόμβους σήμανσης και χρησιμοποιώντας τους για να ορίσει τις τιμές των μεταβλητών σήμανσης όπως φαίνεται.

![Εικόνα που δείχνει εκδοχές ψευδοκώδικα του κώδικα που χρησιμοποιείται για τον ορισμό τιμών για τις τρεις παγκόσμιες μεταβλητές σήμανσης που χρησιμοποιούνται από τις μηχανές TeX](/files/6fa31531d0a1fdffa6f77ce2a38ee581c1c5a883)

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

Σημειώστε ότι:

* πριν επεξεργαστεί η πρώτη σελίδα, και οι τρεις παγκόσμιες μεταβλητές σήμανσης `\botmark`, `\topmark` και `\firstmark` έχουν αρχικοποιηθεί ώστε να είναι κενές (NULL).
* οι τελικές τιμές του `\botmark`, `\topmark` και `\firstmark` που καθορίζονται στο τέλος της *προηγούμενου* σελίδας γίνονται οι (εισαγόμενες) τιμές για την επεξεργασία της *τρέχον* σελίδας—εκείνης που επεξεργάζεται.

Τα ακόλουθα αποσπάσματα κώδικα είναι ***ψευδοκώδικας*** παράγονται (συνοψίζονται) από πραγματικό πηγαίο κώδικα μηχανής TeX. Ο στόχος είναι να παρέχεται μια συνοπτική περίληψη κώδικα που βοηθά να παρουσιαστούν οι βασικές αρχές που εμπλέκονται.

**Βήμα 1: Προέλεγχος περιεχομένου** Πριν το TeX εξετάσει το πραγματικό περιεχόμενο της τρέχουσας σελίδας, ελέγχει αν η τρέχουσα `\botmark` τιμή—δηλαδή, η προερχόμενη από τη *προηγούμενου* σελίδα—είναι κενή (NULL):

```latex
if(\botmark != NULL)
{
   \topmark = \botmark;
   \firstmark= NULL;
}
```

Σε αυτή τη δοκιμή, αν `\botmark` (από τη *προηγούμενου* σελίδα) είναι *όχι* κενή:

* `\topmark` για την *τρέχον* σελίδα ορίζεται στην *προηγούμενου* σελίδας `\botmark` τιμή
* `\firstmark`, για τη *τρέχον* σελίδα (που επεξεργάζεται), ορίζεται ως κενή (NULL): ξεκινήστε αυτή τη σελίδα υποθέτοντας ότι δεν υπάρχουν `\mark` κόμβοι.

Σημειώστε ότι αυτή η δοκιμή εκτελείται *μία φορά* για κάθε σελίδα που επεξεργάζεται.

**Βήμα 2: Βρόχος περιεχομένου** Στη συνέχεια, το TeX διατρέχει το περιεχόμενο της σελίδας· μέρος αυτού του βρόχου περιλαμβάνει την αναζήτηση για `\mark` κόμβους:

```latex
if(type(node)==mark_node)
{
   if(\firstmark==NULL)
   {
      \firstmark=node(text);
   }
   \botmark= node(text);
}
```

Αυτό το τεστ εφαρμόζεται σε κάθε κόμβο mark που βρίσκεται μέσα (περιέχεται στην) τρέχουσα σελίδα. Το προηγούμενο τεστ (Βήμα 1, παραπάνω) θα μπορούσε να έχει θέσει `\firstmark` σε κενό, έτσι ώστε ο πρώτος mark που θα βρεθεί στην τρέχουσα σελίδα να γίνεται η τιμή του `\firstmark` και `\botmark`. Κάθε *επόμενος* `\mark` κόμβος που εντοπίζεται κατά την εκτέλεση αυτού του βρόχου δεν θα αλλάξει την τιμή του `\firstmark`, επειδή δεν είναι πλέον κενό (NULL), αλλά `\botmark` ενημερώνεται—επειδή αυτός είναι ο σκοπός του `\botmark`: να αποθηκεύει τον τελευταίο εμφανισθέντα `\mark` κόμβο για αυτή τη σελίδα.

**Βήμα 3: Έλεγχος μετά το περιεχόμενο** Μόλις διατρέξει το περιεχόμενο της σελίδας, η TeX εφαρμόζει τον ακόλουθο, τελικό έλεγχο, ο οποίος εκτελείται επίσης μία φορά ανά σελίδα:

```latex
if((\topmark != NULL)&&(\firstmark==NULL))
{
	\firstmark= \topmark;
}
```

* Αν `\topmark` δεν είναι κενό (NULL), γνωρίζουμε, από το Βήμα 1, ότι `\botmark` για την προηγούμενη σελίδα δεν ήταν κενό (NULL).
* Αν `\firstmark` παραμένει ακόμη κενό τότε δεν έχουμε δει κανέναν `\mark` κόμβο, επειδή το τεστ στο Βήμα 2 δεν ενεργοποιήθηκε· κατά συνέπεια, `\firstmark` ορίζεται στην τιμή του `\topmark` η οποία είναι επίσης η τιμή του `\botmark` από την προηγούμενη σελίδα.

Μετά τη διαδοχική εφαρμογή αυτών των τριών βημάτων και για τις 6 σελίδες του παραδείγματός μας, οι τιμές του `\botmark`, `\topmark` και `\firstmark` προκύπτουν χρησιμοποιώντας μεταβάσεις που φαίνονται στο παρακάτω διάγραμμα, όπου:

* τα γαλάζια στρογγυλεμένα ορθογώνια είναι οι τελικές τιμές των μεταβλητών mark για κάθε σελίδα
* τα ανοιχτογκρί στρογγυλεμένα τετράγωνα αντιπροσωπεύουν ενδιάμεσες τιμές που προκύπτουν κατά την επεξεργασία
* τα βέλη με ετικέτα αντιπροσωπεύουν αλλαγές στις τιμές των μεταβλητών marker σύμφωνα με τα βήματα 1, 2 ή 3 στο παραπάνω διάγραμμα—ή μια τιμή δεν έχει αλλάξει από κανένα από τα βήματα· με ετικέτα «καμία αλλαγή».

Το παρακάτω διάγραμμα δείχνει πώς τα τρία αποσπάσματα ψευδοκώδικα παράγουν τις τελικές τιμές του `\botmark`, `\topmark` και `\firstmark` που απαριθμούνται στον πίνακα που περιέχεται στη σελίδα 258 του The TeXbook.

![Ένα διάγραμμα μεταβάσεων που συνοδεύει το παράδειγμα από τη σελίδα 258 του The TeXbook, δείχνοντας τις εσωτερικές μεταβάσεις καθώς στις παγκόσμιες μεταβλητές mark εκχωρούνται οι τιμές τους](/files/da23a2907b5d306b173f19684052fd14822c88f9)


---

# 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/23-how-does-latex-typeset-headers-and-footers.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.
