> 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.md).

# Μια εισαγωγή στο \endlinechar: Πώς το TeX διαβάζει γραμμές από αρχεία κειμένου

Ως άνθρωποι, προτιμούμε να προβάλλουμε και να επεξεργαζόμαστε αρχεία κειμένου γραμμή προς γραμμή. Μόλις νομίζουμε ότι μια γραμμή κειμένου είναι αρκετά μεγάλη, πατάμε «return» (στον επεξεργαστή κειμένου) για να δηλώσουμε το τέλος αυτής της γραμμής. Στο παρασκήνιο, ο επεξεργαστής κειμένου σας θα το ερμηνεύσει ως οδηγία για να προσθέσει ένα [χαρακτήρα νέας γραμμής](https://en.wikipedia.org/wiki/Newline) στο σημείο όπου αποφασίζετε να σπάσετε μια γραμμή.

Ωστόσο, μακάρι να ήταν τόσο απλό: το πρόβλημα είναι ότι τα διαφορετικά λειτουργικά συστήματα έχουν διαφορετικές αντιλήψεις για το τι συνιστά χαρακτήρα νέας γραμμής. Για να γίνουν τα πράγματα χειρότερα, τα Windows θα χειριστούν τους χαρακτήρες νέας γραμμής διαφορετικά ανάλογα με το αν ένα αρχείο ανοίγεται σε αυτό που αποκαλείται [*δυαδική λειτουργία* ή *λειτουργία κειμένου*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). Το αποτέλεσμα είναι ότι, ανάλογα με το λειτουργικό σύστημα του υπολογιστή-φιλοξενίας, οι γραμμές σε ένα αρχείο κειμένου μπορούν να τερματίζονται από διάφορους συνδυασμούς χαρακτήρων που ονομάζονται *επιστροφή κεφαλαίου* (χαρακτήρας ASCII/Unicode 13) και *τροφοδότηση γραμμής* (χαρακτήρας ASCII/Unicode 10): συμβολίζεται με `\\r` και `\n` αντίστοιχα.

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

### η ρυθμιστική μνήμη εισόδου του TeX

Ίσως να σας εκπλήξει ή όχι το ότι οι μηχανές TeX (συμπεριλαμβανομένων των LuaTeX και XeTeX) διαβάζουν τα αρχεία εισόδου μία γραμμή τη φορά: δεν διαβάζουν ολόκληρο το αρχείο κειμένου στη μνήμη. Παρόλο που τα περισσότερα αρχεία κειμένου που επεξεργάζονται οι μηχανές TeX είναι ελάχιστα σε σύγκριση με τη διαθέσιμη μνήμη στις σύγχρονες συσκευές, κάθε γραμμή του αρχείου διαβάζεται και αποθηκεύεται ξεχωριστά σε μια μικρή εσωτερική ρυθμιστική μνήμη. Αλλά, φυσικά, η διαδικασία του TeX να διαβάζει και να αποθηκεύει μια γραμμή έχει και μερικές πρόσθετες ιδιαιτερότητες.

## «Θα το κάνω με τον δικό μου τρόπο» — η εντολή \endlinechar του TeX

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

* αφαιρεί τυχόν χαρακτήρες τερματισμού νέας γραμμής (\r ή \n) που βρίσκονται στο τέλος της γραμμής — δηλαδή, αφαιρεί όλες τις καταλήξεις γραμμής που προστέθηκαν όταν το αρχείο κειμένου αποθηκεύτηκε αρχικά στον δίσκο;
* αφαιρεί επίσης όλους τους τελικούς χαρακτήρες κενού που βρίσκονται στο τέλος της γραμμής.

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

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

Το TeX θα χρησιμοποιήσει την τιμή που είναι αποθηκευμένη στο `\endlinechar` για να προσθέσει τον δικό του τερματιστή τέλους γραμμής, αν και μόνο αν, `\endlinechar` είναι ορισμένη κατάλληλα — στο TeX του Knuth αυτό σημαίνει ότι πρέπει να έχει τιμή >-1 και < 256. Συνήθως, `\endlinechar` της αποδίδεται η τιμή 13: ο χαρακτήρας επιστροφής κεφαλαίου — συνήθως συμβολίζεται με `\\r` στη βιβλιογραφία προγραμματισμού.

Αλλά αν γράψετε `\endlinechar=-1` κάπου μέσα στην είσοδό σας, τότε το *την επόμενη φορά που* το TeX διαβάσει μια γραμμή κειμένου από ένα αρχείο, θα *όχι* προσθέσει οποιονδήποτε πρόσθετο τερματιστή στο τέλος μιας γραμμής. Κατά συνέπεια, η είσοδός σας θα αντιμετωπίζεται ως μία μακριά συνεχής συμβολοσειρά κειμένου μέχρι να επαναφέρετε `\endlinechar` σε μια κατάλληλη τιμή — συνήθως 13 (`\\r`):

```latex
\endlinechar=13
```

Ένας από τους 16 κωδικούς κατηγορίας του TeX (τιμή 5) είναι δεσμευμένος για να αναγνωρίζει τον χαρακτήρα «τέλους γραμμής», ο οποίος συνήθως είναι ο χαρακτήρας που `\endlinechar` εισάγει — ο οποίος εισάγεται αν (και μόνο αν) η τιμή του `\endlinechar` έχει οριστεί σε κατάλληλη τιμή.

## Σύνοψη της επεξεργασίας τέλους γραμμής

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

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

* Το TeX αφαιρεί επίσης τυχόν τελικούς χαρακτήρες κενού από το τέλος της γραμμής;
* TeX *δεν* αφαιρεί τους τελικούς χαρακτήρες tab (κωδικός χαρακτήρα ASCII 9).

**Παρένθεση**: Ένα από τα αρχεία πηγαίου κώδικα του LuaTeX, αυτό που περιέχει τον κώδικα για να πραγματοποιεί αυτή την αφαίρεση των κενών, περιέχει την ακόλουθη σημείωση:

> (Παρατίθεται στο αρχείο `luatex.c`) «Ο David Fuchs αναφέρει ότι αυτή η αφαίρεση \[των κενών] έγινε για να διασφαλιστεί η φορητότητα των εγγράφων TeX, δεδομένης της συμπλήρωσης με κενά σε “γραμμές” σταθερού μήκους σε ορισμένα συστήματα της εποχής, π.χ. IBM VM/CMS και OS/360.»

3. Μετά το βήμα (1), το TeX προσθέτει (εισάγει) έναν επιπλέον χαρακτήρα του οποίου η τιμή είναι αποθηκευμένη στο \endlinechar (υπό την προϋπόθεση ότι είναι κατάλληλα ορισμένο: >-1 και < 256)
4. \endlinechar συνήθως ορίζεται στην τιμή 13 (`\\r`), πράγμα που σημαίνει ότι ο χαρακτήρας που προστίθεται στο βήμα (2) είναι συνήθως ο χαρακτήρας 13 (`\\r`) — αλλά, φυσικά, μπορείτε να ορίσετε το \endlinechar σε άλλη τιμή για να επιτύχετε ειδικά εφέ μέσω προγραμματισμού μακροεντολών.
5. Όταν οι ρουτίνες σάρωσης εισόδου του ανιχνεύσουν τον χαρακτήρα `\\r` (κωδικός χαρακτήρα 13) στο τέλος της εσωτερικής του ρυθμιστικής μνήμης, το TeX θα ελέγξει, όπως συνήθως, τον κωδικό κατηγορίας του για να αποφασίσει τι θα κάνει με αυτόν.
6. Ο χαρακτήρας 13 *συνήθως* έχει τιμή κωδικού κατηγορίας 5 («τέλος γραμμής»), εκτός αν φυσικά ο κωδικός κατηγορίας του έχει αλλάξει — ορισμένες μακροεντολές κάνουν τον χαρακτήρα τέλους γραμμής ενεργό για να κάνουν πιο σύνθετη επεξεργασία.
7. Ανάλογα με την εσωτερική κατάσταση του TeX (ουσιαστικά, με το τι κάνει), το TeX μπορεί να αλλάξει τον χαρακτήρα τέλους γραμμής (συνήθως `\\r`, κωδικός κατηγορίας 5) σε χαρακτήρα κενού — έτσι οι χαρακτήρες τέλους γραμμής γίνονται κενά.
8. Σημειώστε επίσης ότι το TeX χρησιμοποιεί χαρακτήρες με κωδικό κατηγορίας 5 για να ανιχνεύει πότε έχει διαβάσει μια κενή γραμμή και χρειάζεται να δημιουργήσει ένα `\par` σύμβολο.

Το παρακάτω γραφικό δίνει μια οπτική σύνοψη των βημάτων (1) και (2): αφαίρεση των χαρακτήρων νέας γραμμής και των τελικών χαρακτήρων κενού και εισαγωγή `\endlinechar` έτοιμο για την εργασία της σάρωσης της εισόδου.

![Πώς χρησιμοποιεί το TeX το \endlinechar](/files/07172a1cf63c4f52d7da67833a9f117df7cc05ba)


---

# 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.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.
