> 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md).

# Το \hbox της Πανδώρας: Χρησιμοποιώντας το LuaTeX για να σηκώσετε το καπάκι των κουτιών του TeX

## Εισαγωγή

Τα κουτιά και η κόλλα είναι δύο βασικές έννοιες που παρέχουν τα θεμέλια για το μοντέλο στοιχειοθεσίας και τις δυνατότητες του TeX. Βασιζόμενοι στο εισαγωγικό υλικό μιας προηγούμενης ανάρτησης, [Κουτιά και Κόλλα: Μια σύντομη, αλλά οπτική, εισαγωγή με χρήση LuaTeX](/latex/el/se-vathos-arthra/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md), αυτό το πλούσια εικονογραφημένο άρθρο εξετάζει τα κουτιά και την κόλλα με περισσότερη λεπτομέρεια. Παρουσιάζουμε επίσης ένα νέο έργο Overleaf βασισμένο στο LuaTeX [του Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) που σας επιτρέπει να εξερευνήσετε τη βαθιά εσωτερική δομή των κουτιών του TeX—παρέχοντας πληροφορίες που θα σας βοηθήσουν να κατανοήσετε πραγματικά τη συμπεριφορά τους. Η δημιουργία του έργου Overleaf διευκολύνθηκε σε μεγάλο βαθμό από το έργο του Patrick Gundlach, οπότε του εκφράζουμε [τις ευχαριστίες μας](#credits-thanks-patrick).

## Γιατί να επιλέξετε το LuaTeX;

Πρώτον, αξίζει να επαναλάβουμε τη διαφορά μεταξύ LuaTeX και LuaLaTeX:

* Το LuaTeX είναι το όνομα ενός εκτελέσιμου μηχανισμού στοιχειοθεσίας βασισμένου στο TeX;
* Το LuaLaTeX αναφέρεται στη χρήση του πακέτου μακροεντολών LaTeX με τον μηχανισμό LuaTeX.

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

Οι αναγνώστες που δεν είναι βέβαιοι για τη διαφορά μεταξύ ενός μηχανισμού TeX και του πακέτου μακροεντολών LaTeX ίσως θέλουν να διαβάσουν ένα από τα προηγουμένως δημοσιευμένα άρθρα μας, [Τι κρύβει ένα όνομα: Ένας οδηγός για τις πολλές εκδοχές του TeX](/latex/el/se-vathos-arthra/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md), το οποίο εξηγεί αυτές τις διαφορές με κάποια λεπτομέρεια. Το ίδιο άρθρο συζητά επίσης το «TeX» ως γλώσσα προγραμματισμού και το ότι οι μηχανισμοί στοιχειοθεσίας βασισμένοι στο TeX (π.χ. pdfTeX, XeTeX και LuaTeX) όχι μόνο διαφέρουν ως προς τα χαρακτηριστικά και τη λειτουργικότητά τους, αλλά έχουν επίσης παραλλαγές στη «γεύση» της γλώσσας TeX που υποστηρίζουν. Αυτό μας φέρνει στην επιλογή μας για το LuaTeX. Εκτός από την υποστήριξη μιας γλώσσας προγραμματισμού βασισμένης στο TeX, το LuaTeX έχει επίσης ενσωματωμένη μέσα του τη γλώσσα σεναρίων Lua—παρέχοντας πρόσβαση σε μια απλή, αλλά πολύ ισχυρή, συμβατική γλώσσα προγραμματισμού. Μέσω της Lua, και της ενσωματωμένης λειτουργικότητας του LuaTeX, μπορείτε να εξερευνήσετε και να ελέγξετε τις εργασίες στοιχειοθεσίας του LuaTeX με τρόπους που κανένας άλλος μηχανισμός TeX δεν παρέχει—και αυτό περιλαμβάνει τη δυνατότητα διερεύνησης των εσωτερικών δομών των κουτιών του TeX· γι’ αυτό το LuaTeX είναι η ιδανική (και μοναδική) επιλογή για αυτό το άρθρο και το συνοδευτικό έργο Overleaf.

### pdfTeX/XeTeX έναντι LuaTeX: σε εικόνες

Τα ακόλουθα *σχεδιαγράμματα* προορίζονται να αναδείξουν μια σημαντική σύγκριση μεταξύ του σχεδιασμού των pdfTeX/XeTeX και του LuaTeX. Και τα pdfTeX και XeTeX επιτρέπουν, φυσικά, στους χρήστες να γράφουν κώδικα TeX που μπορεί να επηρεάσει τη συμπεριφορά της στοιχειοθεσίας· ωστόσο, οι βαθύτερες εσωτερικές δομές που περιέχονται σε αυτούς τους μηχανισμούς TeX, καθώς και τα δεδομένα χαμηλού επιπέδου που κατασκευάζονται κατά τη διαδικασία στοιχειοθεσίας, είναι ως επί το πλείστον απρόσιτα στις εντολές και στις μακροεντολές του χρήστη. Υπό αυτή την έννοια, είναι *σχετικά* κλειστά συστήματα σε σύγκριση με το LuaTeX.

#### pdfTeX/XeTeX

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

#### LuaTeX

Το LuaTeX εισάγει μια νέα πρωταρχική εντολή που ονομάζεται `\directlua{...}` μέσω της οποίας μπορείτε να γράψετε κώδικα που όχι μόνο παρέχει πλήρη πρόσβαση στη γλώσσα Lua, αλλά σας επιτρέπει επίσης να επεκτείνετε τις δυνατότητες του LuaTeX γράφοντας πρόσθετα χρησιμοποιώντας γλώσσες όπως η C και η C++. Στα Windows, τέτοια πρόσθετα ονομάζονται *Βιβλιοθήκες Δυναμικής Σύνδεσης* (.DLL)· στο Linux είναι γνωστά ως *Κοινόχρηστες Βιβλιοθήκες Αντικειμένων* (.so). Ωστόσο, η πραγματική ισχύς του LuaTeX προέρχεται από ένα τεράστιο σύνολο ενσωματωμένων συναρτήσεων Lua που παρέχουν πρόσβαση στα εσωτερικά του LuaTeX—επιτρέποντας εξαιρετικά εξελιγμένο έλεγχο και προγραμματισμό της στοιχειοθεσίας βασισμένης στο TeX. Ένα σύνολο τέτοιων συναρτήσεων είναι γνωστό ως API (Διεπαφή Προγραμματισμού Εφαρμογών) και μέσω του API του LuaTeX χρησιμοποιείτε προγράμματα Lua για να επικοινωνήσετε με τον μηχανισμό στοιχειοθεσίας και τις δομές δεδομένων του βασισμένες στο TeX.

![{{{alt}}}](/files/5d4bee582d352d02e208915b8f642fee929aa278)

Με την `\directlua{...}` εντολή μπορείτε, για παράδειγμα, να αποκτήσετε πρόσβαση σε εσωτερικές δομές δεδομένων χαμηλού επιπέδου του TeX που είναι κρυμμένες από το βλέμμα σε άλλους μηχανισμούς TeX. Επιπλέον, μπορείτε να χρησιμοποιήσετε σενάρια Lua για να εκτελέσετε κάθε είδους υπολογισμούς προγραμματισμού, χειρισμό συμβολοσειρών κ.λπ. και να επιστρέψετε τα αποτελέσματα στο TeX: οι δυνατότητες είναι σχεδόν απεριόριστες. Ωστόσο, αυτό το άρθρο δεν προορίζεται να αποτελέσει λεπτομερή παρουσίαση ή σεμινάριο για το LuaTeX—αν και είναι δελεαστικό να δοθούν παραδείγματα που αποδίδουν την απίστευτη ευελιξία αυτού του εκπληκτικά ισχυρού μηχανισμού TeX.

## Κουτιά και κόλλα: Μια σύντομη υπενθύμιση

Όπως παρουσιάστηκε στο άρθρο [Κουτιά και Κόλλα: Μια σύντομη, αλλά οπτική, εισαγωγή με χρήση LuaTeX](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) τα κουτιά και η κόλλα είναι δύο βασικές έννοιες που στηρίζουν τις δυνατότητες στοιχειοθεσίας του TeX. Το ακόλουθο διάγραμμα προσφέρεται ως ένα πολύ σύντομο βοήθημα μνήμης σχετικά με τη συμπεριφορά των οριζόντιων και κάθετων τύπων κουτιών του TeX. Σημείωση: τα οριζόντια κουτιά μπορούν, φυσικά, να περιέχουν κείμενο στοιχειοθετημένο σε γλώσσες από δεξιά προς τα αριστερά, όπως τα αραβικά ή τα εβραϊκά, πράγμα που σημαίνει ότι η κατεύθυνση αύξησης του κουτιού μπορεί να είναι αντίθετη από αυτή που φαίνεται για το οριζόντιο κουτί στο παρακάτω διάγραμμα.

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

### Πρωταρχικές εντολές του TeX για τη δημιουργία κουτιών

Σήμερα, οι περισσότεροι άνθρωποι προετοιμάζουν τα έγγραφα TeX χρησιμοποιώντας το πακέτο μακροεντολών LaTeX, το οποίο έχει σχεδιαστεί για να παρέχει εντολές που απομονώνουν τους χρήστες από μεγάλο μέρος της γλώσσας χαμηλού επιπέδου του TeX—τις λεγόμενες *πρωταρχικές εντολές*—τις βασικές εντολές που είναι ενσωματωμένες στους μηχανισμούς TeX (βλ. το άρθρο [Τι κρύβει ένα όνομα: Ένας οδηγός για τις πολλές εκδοχές του TeX](/latex/el/se-vathos-arthra/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) για μια συζήτηση των πρωταρχικών εντολών του TeX). Η συλλογή μακροεντολών LaTeX παρέχει μια ποικιλία μακροεντολών για τη δημιουργία και αποθήκευση κουτιών, αλλά αν αφαιρέσετε όλο τον κώδικα μακροεντολών θα διαπιστώσετε ότι υπάρχουν μόνο 4 εντολές πρωταρχικού επιπέδου για τη δημιουργία κουτιών:

Για τη δημιουργία οριζόντιων λιστών:

* \hbox{...}

Για τη δημιουργία και στοίβαξη κατακόρυφων λιστών:

* \vbox{...}
* \vtop{...}
* \vcenter{...}

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

### Κόλλα: ευέλικτη απόσταση

Η κόλλα είναι, στην πράξη, μια μορφή απόστασης που χρησιμοποιείται από το TeX για τη διαμόρφωση/τοποθέτηση αντικειμένων οριζόντια ή κατακόρυφα. Ως χρήστες TeX, μπορούμε να δώσουμε εντολή στο TeX να εισαγάγει κάποια κόλλα σταθερού μεγέθους ή μπορούμε να χρησιμοποιήσουμε κόλλα που είναι ευέλικτη—έχοντας όση ευελιξία χρειαζόμαστε, είτε για να τεντωθεί είτε να συρρικνωθεί ανάλογα με τις απαιτήσεις μας. Μία από τις εντολές του TeX για τη δημιουργία κόλλας για οριζόντια απόσταση ονομάζεται `\hskip` η οποία έχει τη μορφή

`**\hskip** <φυσικό πλάτος> **plus** <ποσότητα επέκτασης> **minus** <ποσότητα συρρίκνωσης>`

`**plus**` και `**minus**` είναι λέξεις-κλειδιά του TeX, αλλά δεν χρειάζεται να τις χρησιμοποιείτε για κάθε κόλλα. Αν τα `**plus**` ή `**minus**` απουσιάζουν τότε το αντίστοιχο `<ποσότητα επέκτασης>` ή `<ποσότητα συρρίκνωσης>` θεωρείται ότι είναι μηδέν. Για παράδειγμα, `\hskip 3pt` εισάγει μια κόλλα σταθερού πλάτους χωρίς συνιστώσα επέκτασης ή συρρίκνωσης.

Προς το παρόν, να σκέφτεστε το `<ποσότητα επέκτασης>` και `<ποσότητα συρρίκνωσης>` ως τις *προτάσεις μας* προς το TeX, επειδή το ακριβές ποσό τάνυσης ή συρρίκνωσης θα υπολογιστεί από το TeX.

Για να βοηθήσει με αυτές τις ιδέες, εδώ είναι ένα διάγραμμα που αναπαριστά την κόλλα ως ελατήριο. Το `<φυσικό πλάτος>` είναι το μήκος του ελατηρίου όταν δεν υπάρχει τάση (τέντωμα) ή συμπίεση (συρρίκνωση). Τα `<ποσότητα επέκτασης>` και `<ποσότητα συρρίκνωσης>` παρουσιάζονται σε σχέση με το φυσικό μήκος του ελατηρίου.

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

#### Ένα παράδειγμα \hbox

Ας υποθέσουμε ότι θέλουμε να δημιουργήσουμε ένα `\hbox{...}` που να περιέχει μόνο τα γράμματα A, B, C και D και χρειαζόμαστε αυτό το κουτί να έχει πλάτος 100pt (100 σημεία TeX). Επιπλέον, είναι ασφαλές να υποθέσουμε ότι το συνολικό πλάτος αυτών των τεσσάρων χαρακτήρων είναι πολύ μικρότερο από 100pt, πράγμα που δείχνει ότι το TeX χρειάζεται κάποιον τρόπο να γεμίσει τον υπόλοιπο χώρο μέσα στο κουτί: θα χρησιμοποιήσουμε λίγη κόλλα γι’ αυτό. Ωστόσο, επειδή δεν γνωρίζουμε το ακριβές ποσό κόλλας που απαιτείται για να γεμίσει το κουτί, είναι σκόπιμο να προσθέσουμε μερικές ευέλικτες κόλλες και να αφήσουμε το TeX να αναλάβει τον υπολογισμό του χώρου που χρειάζεται να καταλάβουν αυτές οι κόλλες. Στο ακόλουθο απόσπασμα κώδικα, σημειώστε τη χρήση του «%» για την καταστολή των κενών μεταξύ λέξεων που προκύπτουν από τους χαρακτήρες τέλους γραμμής.

```
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt B%
\hskip 0pt plus 2fil C%
\hskip 0pt plus 2fill D%
\hskip 0pt plus 3fill}
```

Το αποτέλεσμα είναι ένα κουτί που μοιάζει ως εξής (μεγεθυμένο για λόγους σαφήνειας):

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

Αυτό το `\hbox` επικαλύπτεται με διακεκομμένα κουτιά (σε κόκκινο) για να υποδείξει το πλάτος των χαρακτήρων (όπως τους βλέπει το TeX). Για σκοπούς στοιχειοθεσίας, οι χαρακτήρες θεωρούνται μικρά κουτιά και η ποσότητα κόλλας που απαιτείται για να γεμίσει αυτό το `\hbox`καθορίζεται (υπολογίζεται) λαμβάνοντας υπόψη τα πλάτη κάθε χαρακτήρα.

Αποδεικνύεται ότι το TeX δεν τέντωσε ούτε συρρίκνωσε την κόλλα μεταξύ των A και B (ορισμένη στα 4pt) και δεν υπάρχει κόλλα μεταξύ των B και C (ορισμένη στα 0pt). Ωστόσο, η κόλλα μεταξύ των C και D και η κόλλα μεταξύ του D και του τέλους του κουτιού έχουν και οι δύο τεντωθεί σημαντικά επειδή αυτές οι κόλλες έχουν το πιο ευέλικτο συνιστώσα τάνυσης—στην πράξη, αυτές οι κόλλες απορρόφησαν όλο το απαιτούμενο τέντωμα για να γεμίσει το κουτί.

## Πίσω στο LuaTeX

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

### Πώς αποθηκεύει το TeX τα κουτιά στη μνήμη: μια αναλογία

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

1. Δεδομένα σχετικά με το φυσικό κουτί («μεταδεδομένα»):

* width
* ύψος
* βάθος
* βάρος
* χρώμα
* τύπος (ξύλινο, πλαστικό, χαρτονένιο)

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

Και υπάρχει μια πολύ στενή αναλογία με τον τρόπο που το TeX αποθηκεύει τα κουτιά.

### Πώς αποθηκεύει το TeX τα κουτιά στη μνήμη: hlists και vlists

Εσωτερικά, το TeX δημιουργεί «δοχεία» που ονομάζονται *hlists* (οριζόντιες λίστες) και *vlists* (κατακόρυφες λίστες), οι οποίες αντιπροσωπεύουν αντίστοιχα hboxes και vboxes. Αυτά τα αντικείμενα hlist/vlist παρέχουν μια συλλογή «μεταδεδομένων» σχετικά με το κουτί, καθώς και πρόσβαση στη λίστα των αντικειμένων από τα οποία το κουτί αποτελείται—αυτή η λίστα ονομάζεται *λίστα κόμβων*. Σε αντίθεση με ένα φυσικό κουτί, όπου μπορείτε να τοποθετήσετε αντικείμενα μέσα του με οποιαδήποτε σειρά, για το TeX η σειρά των περιεχομένων του κουτιού είναι εξαιρετικά σημαντική—είναι αντικείμενα προς στοιχειοθεσία. Αν έχετε υπόβαθρο στον προγραμματισμό ή στην επιστήμη υπολογιστών δεν θα εκπλαγείτε μαθαίνοντας ότι τα αντικείμενα μέσα σε ένα κουτί TeX αποθηκεύονται, και η σειρά δημιουργίας τους διατηρείται, χρησιμοποιώντας μια λεγόμενη [διπλά συνδεδεμένη λίστα](https://en.wikipedia.org/wiki/Doubly_linked_list). Δεν θα συζητήσουμε περαιτέρω τις συνδεδεμένες λίστες, επειδή το διαδίκτυο είναι γεμάτο από σεμινάρια, παραδείγματα και εξηγήσεις.

Η έννοια των κόμβων και των λιστών κόμβων είναι θεμελιώδης πτυχή του τρόπου λειτουργίας του TeX, αλλά για τους σκοπούς αυτού του άρθρου θα δώσουμε μόνο μια σύντομη περίληψη. Οι κόμβοι είναι, στην ουσία, ένα είδος «μίνι δοχείου» και (από το LuaTeX 1.04) υπάρχουν περίπου 50 διαφορετικοί τύποι κόμβων: που αντανακλούν τους εσωτερικούς τύπους δεδομένων και τα συστατικά που χρησιμοποιεί το LuaTeX για στοιχειοθεσία. Για παράδειγμα, υπάρχουν κόμβοι που αναπαριστούν: γλύφους (που προκύπτουν από «χαρακτήρες»), κόλλα, οριζόντιους/κατακόρυφους κανόνες, ποινές, «whatsits», kerns και ούτω καθεξής. Όλο το στοιχειοθετημένο υλικό θα γίνει, τελικά, μέρος μιας τεράστιας λίστας κόμβων και το LuaTeX σας δίνει άμεση πρόσβαση σε αυτές τις εσωτερικές δομές δεδομένων. Το LuaTeX σάς επιτρέπει επίσης να προσθέτετε, να επεξεργάζεστε, να τροποποιείτε ή να δημιουργείτε λίστες κόμβων έτσι ώστε, για παράδειγμα, να μπορείτε να δημιουργείτε κουτιά απευθείας μέσα σε κώδικα Lua χωρίς να χρειάζεται να χρησιμοποιήσετε καθόλου κώδικα TeX. Ωστόσο, η συγγραφή γι’ αυτό είναι θέμα για άλλη μέρα.

### Ένα απλό παράδειγμα του \directlua{...} σε δράση

Το ακόλουθο παράδειγμα δημιουργεί ένα `\hbox` και το αποθηκεύει στο μητρώο κουτιών 0. Στη συνέχεια αναφέρουμε το πλάτος του κουτιού χρησιμοποιώντας παραδοσιακό κώδικα TeX και λαμβάνουμε τις ίδιες πληροφορίες χρησιμοποιώντας μια δεύτερη μέθοδο μέσω της `\directlua{}`. Εδώ, εκτελούμε ένα μικρό σενάριο Lua που αποκτά πρόσβαση στην εσωτερική περιοχή αποθήκευσης κουτιών του TeX για να λάβουμε το πλάτος του κουτιού—φυσικά, οι δύο τιμές είναι ταυτόσημες: 2412092sp (sp=scaled point: 65536sp = 1 σημείο TeX). Τελικά, σε αυτό το εξαιρετικά απλό παράδειγμα, ο κώδικας TeX και ο κώδικας Lua εξετάζουν και οι δύο τα ίδια εσωτερικά δεδομένα για να λάβουν το πλάτος του κουτιού, αλλά μέσω της άμεσης οδού πρόσβασης το LuaTeX ανοίγει την πόρτα σε έναν πλούτο πληροφοριών και ελέγχου που δεν είναι διαθέσιμος με άλλους μηχανισμούς.

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

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent Με κώδικα \TeX{}, το κουτί 0 έχει πλάτος \number\wd0\relax \space sp\par
\noindent Μπορούμε επίσης να χρησιμοποιήσουμε Lua και να καλέσουμε μία από τις συναρτήσεις του Lua\TeX για να λάβουμε τις ίδιες
πληροφορίες.\vskip10mm
\noindent Από κώδικα Lua, το κουτί 0 έχει πλάτος
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} το οποίο, φυσικά, είναι ταυτόσημο με την τιμή που λαμβάνεται από τον κώδικα \TeX{}.
\end{document}
```

## Τα βάζουμε όλα μαζί: Ένα έργο Overleaf

Έχουμε σημειώσει ότι, εσωτερικά, το TeX αναπαριστά τα κουτιά ως «δοχεία» που ονομάζονται hlists/vlists, τα οποία αποθηκεύουν «μεταδεδομένα» σχετικά με το κουτί και παρέχουν πρόσβαση στη λίστα των συστατικών από τα οποία το κουτί κατασκευάζεται. Χρησιμοποιώντας το LuaTeX μπορείτε να αποκτήσετε πρόσβαση στα «μεταδεδομένα» του κουτιού και στη λίστα των αντικειμένων που περιέχονται σε ένα κουτί TeX: γλύφους, κόλλα, ποινές, άλλα κουτιά κ.ο.κ. Χρησιμοποιώντας σενάρια Lua, είναι δυνατόν να εξετάσετε ένα κουτί που βρίσκεται στη μνήμη του TeX και να σχεδιάσετε μια λεπτομερή αναπαράσταση του περιεχομένου αυτού του κουτιού. Μια κατάλληλη αναπαράσταση ενός κουτιού TeX και του περιεχομένου του επιτυγχάνεται με τη χρήση *γραφημάτων κόμβων* και έχουμε προετοιμάσει ένα [του Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) το οποίο το κάνει αυτό αξιοποιώντας ένα εξαιρετικό σενάριο Lua γραμμένο από τον Patrick Gundlach (βλ. αναγνωρίσεις). Δεν θα περιγράψουμε τις λεπτομερείς διαδικασίες που απαιτούνται για την εξέταση κουτιών και τη δημιουργία γραφημάτων κόμβων—εκτός από το να σημειώσουμε ότι κάθε πρόγραμμα/σενάριο που επεξεργάζεται κουτιά TeX πρέπει να είναι *αναδρομικής* επειδή τα κουτιά μπορούν να είναι ένθετα: δηλαδή, μπορείτε να έχετε hboxes μέσα σε vboxes, μέσα σε hboxes… συνδυάζοντας όλους τους τύπους κουτιών σε πολύ βαθύ επίπεδο ένθεσης.

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

### Τι παρέχει το έργο;

Υλοποιεί μόνο 1 εντολή που ονομάζεται `\dobox{εντολή κουτιού}`, για παράδειγμα:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

Η `\dobox{...}` εντολή εκτελεί μια σειρά από εργασίες:

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

Τα γραφήματα κόμβων μπορούν πολύ γρήγορα να γίνουν εξαιρετικά μεγάλα λόγω της τεράστιας ποσότητας δεδομένων που χρειάζεται να αποθηκεύσει το LuaTeX προκειμένου να αναπαραστήσει σύνθετα κουτιά TeX—όπως η σελίδα που κατασκευάζεται αυτή τη στιγμή ή τα μαθηματικά στοιχειοθεσίας. Για μεγαλύτερες λίστες κόμβων, το εισαγόμενο γραφικό PDF μπορεί να αποκοπεί από το όριο σελίδας του εγγράφου σας—αν θέλετε να δείτε ένα μεγάλο γράφημα κόμβων, μπορείτε να κατεβάσετε ένα αρχείο ZIP του έργου και να εξαγάγετε το σχετικό γραφικό PDF. Όταν κατεβάζετε το αρχείο ZIP του έργου, βεβαιωθείτε ότι έχετε επιλέξει «Input and Output Files» από την αναπτυσσόμενη λίστα επιλογών:

![{{{alt}}}](/files/57878490cd136bc7adb42aa5f43614cc496d6854)

### Γραφικά από το έργο Overleaf: Μια σύντομη περιγραφή

Πριν δείξουμε μερικά παραδείγματα, αξίζει να κάνουμε μερικές παρατηρήσεις σχετικά με τα γραφικά που παράγονται από το έργο Overleaf—θα χρησιμοποιήσουμε το ίδιο `\hbox` παράδειγμα που αναφέρθηκε νωρίτερα στο άρθρο. Εδώ είναι τυλιγμένο μέσα στο `\dobox{...}` εντολή:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

Εδώ είναι το `\hbox` που παράγεται από το TeX—για λόγους σαφήνειας, το κουτί έχει μεγεθυνθεί αλλά το περίγραμμα περιλαμβάνεται στα γραφικά που παράγονται από το έργο Overleaf.

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

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

[![{{{alt}}}](/files/48d6976bc40049aff210cbb93b12e1fa523c0c16)](https://www.filepicker.io/api/file/ZSwIylUR66eFYPMo0suX)

Αν κοιτάξετε την ενότητα «μεταδεδομένα» ίσως παρατηρήσετε μερικές άγνωστες παραμέτρους:

* `glue_set`
* `glue_sign`
* `glue_order`

Αυτές οι παράμετροι είναι οι ρυθμίσεις που χρησιμοποιεί το TeX για να υπολογίσει πόσο πρέπει να τεντωθεί ή να συρρικνωθεί η κόλλα μέσα σε αυτό το κουτί και αποτελούν μόνο ένα παράδειγμα δεδομένων που μπορείτε εύκολα να αποκτήσετε μέσω του LuaTeX αλλά όχι με άλλους μηχανισμούς TeX. Σημειώστε ότι οι κόμβοι κόλλας που περιέχονται στα συστατικά του κουτιού *διατηρούν* τις αρχικές τιμές της κόλλας που πληκτρολογήσαμε για να δημιουργήσουμε το κουτί. Αυτό είναι ουσιώδες επειδή το TeX παρέχει τις εντολές `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` οι οποίες «ξεκουτιάζουν» το περιεχόμενο του κουτιού και το απελευθερώνουν ξανά στη ροή εισόδου για να λάβουν και πάλι μέρος στις εργασίες στοιχειοθεσίας. Μόνο όταν το TeX τελικά εξάγει (ship out) το κουτί σε αρχείο PDF ή DVI `glue_set`, `glue_sign` και `glue_order` εφαρμόζονται σε οποιεσδήποτε κόλλες περιέχονται στο κουτί—ώστε να υπολογιστεί η πραγματική ποσότητα τάνυσης ή συρρίκνωσης που απαιτείται για την τοποθέτηση των συστατικών μέσα στο κουτί και στη συνέχεια να παραχθούν τα κατάλληλα δεδομένα PDF ή οι εντολές DVI.

Μια άλλη παράμετρος που παρατίθεται στα «μεταδεδομένα» είναι `shift`: αυτή είναι η τιμή της μετατόπισης του κουτιού που προκύπτει από την εφαρμογή των εντολών TeX:

* `\raise`, `\lower` (εφαρμοσμένη σε ένα `\hbox`);
* `\moveleft`, `\moveright` (εφαρμοσμένη σε ένα `\vbox`).

Στο παράδειγμά μας, `shift` είναι 0pt επειδή δεν μετατοπίσαμε το `\hbox` από τη φυσική του θέση.

Η [του Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) παράγει επίσης διαγράμματα γραφημάτων κόμβων σε μορφή PDF: εδώ είναι ένας σύνδεσμος για να κατεβάσετε μια [PDF έκδοση](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) του παραπάνω γραφήματος κόμβων.

### Πώς δημιουργεί το έργο Overleaf αυτά τα γραφικά;

Το έργο Overleaf αξιοποιεί τη δυνατότητα εκτέλεσης εργαλείων λογισμικού και βοηθητικών προγραμμάτων εγκατεστημένων στους διακομιστές του Overleaf—βλ. [αυτή την ανάρτηση ιστολογίου](/latex/el/se-vathos-arthra/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) για περισσότερες λεπτομέρειες και ένα δείγμα έργου. Για να παραχθεί ένα γραφικό SVG που αναπαριστά ένα κουτί TeX, ο κώδικας TeX του κουτιού γράφεται σε ένα μικρό αρχείο, το οποίο στη συνέχεια στοιχειοθετείται με το pdfTeX για να δημιουργηθεί ένα αρχείο DVI—σημειώστε ότι το πρόγραμμα pdfTeX εκτελείται από το LuaTeX μέσω μερικών γραμμών Lua script. Αυτό το αρχείο DVI μετατρέπεται επί τόπου σε SVG χρησιμοποιώντας το `dvisvgm` βοηθητικό πρόγραμμα—το οποίο συνοδεύεται με τη διανομή TeX Live που είναι εγκατεστημένη στους διακομιστές του Overleaf. `dvisvgm` εκτελείται με επιλογή γραμμής εντολών `-n` για να διασφαλιστεί ότι οποιοδήποτε στοιχειοθετημένο κείμενο μετατρέπεται σε γραμμές/καμπύλες, έτσι ώστε η σωστή απόδοση του αρχείου SVG να μην εξαρτάται από το αν οι γραμματοσειρές TeX είναι εγκατεστημένες.

Για να δημιουργήσουμε τα γραφήματα κόμβων χρησιμοποιούμε ένα σενάριο Lua που ονομάζεται `hiviznodelist.lua` το οποίο βασίζεται σε εργασία του Patrick Gundlach. Αυτό το σενάριο γράφει ένα λεγόμενο `.gv` (Graphviz) αρχείο που είναι ένα αρχείο κειμένου το οποίο περιέχει ένα γράφημα κόμβων περιγραμμένο στη γλώσσα `dot` . Το `.gv` αρχείο επεξεργάζεται από ένα βοηθητικό πρόγραμμα που ονομάζεται `dot` το οποίο παράγει ένα διάγραμμα κόμβων τόσο σε μορφή αρχείου PDF όσο και σε μορφή SVG.

### Παραδείγματα έργου

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

#### \vbox to 25pt{A}

Αυτό το παράδειγμα δείχνει το αποτέλεσμα της τοποθέτησης κειμένου απευθείας μέσα σε ένα `\vbox`: σημειώστε ότι η δομή των κόμβων είναι αρκετά σύνθετη, ακόμη και για ένα τόσο απλό κουτί. Ο λόγος για αυτή την πολυπλοκότητα είναι ότι το κείμενο που τοποθετείται απευθείας μέσα σε ένα `\vbox` αναγκάζει το TeX να εκτελέσει διαχωρισμό γραμμών. Μπορείτε να δείτε ότι το `\vbox` έχει πλάτος 345pt: η τιμή του `\hsize` τη στιγμή που δημιουργήθηκε αυτό το κουτί. Σημειώστε επίσης ότι ο χαρακτήρας «A» περιέχεται μέσα σε ένα `hlist` που έχει επίσης πλάτος 345 σημεία, και παρατηρήστε τη μεγάλη ποινή (10000) μαζί με τα `\parfillskip` και `\rightskip` κόλλες στο τέλος των περιεχομένων του κουτιού. Αυτή η ποινή και τα δύο στοιχεία κόλλας εισάγονται από τις εργασίες διαχωρισμού γραμμών του TeX. Αν κοιτάξετε την `glue_set` τιμή για τη γραμμή της παραγράφου (`hlist`) που περιέχει το γράμμα «A» θα δείτε ότι είναι εξαιρετικά μεγάλη (322.500000): γιατί συμβαίνει αυτό; Είναι επειδή η γραμμή της παραγράφου έχει πλάτος 345pt αλλά περιέχει μόνο μια `\parindent` και το γράμμα «A»: ο υπόλοιπος χώρος πρέπει να γεμίσει από την `\parfillskip` κόλλα, η οποία πρέπει να τεντωθεί σε σημαντική απόσταση για να γεμίσει ο υπόλοιπος χώρος στη γραμμή.

![{{{alt}}}](/files/5483fb0c09cb5468eecdee68cfdd7a64d408b353)

[![{{{alt}}}](/files/7fd7d26f5506d09469a8cb0caaceff4fed464891)](https://www.filepicker.io/api/file/pVtHsNGSQ4m09vBZuOpQ)

[Λήψη αρχείου PDF](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

#### \vbox to 25pt{\hbox{A}}

Είναι πολύ διδακτικό να συγκρίνουμε αυτό το παράδειγμα με το προηγούμενο. Εδώ, όχι μόνο το γράφημα κόμβων είναι σημαντικά μικρότερο, αλλά το πλάτος του `\vbox` είναι μόλις 7.50002pt: το ίδιο πλάτος με τον χαρακτήρα «A». Ο λόγος είναι ότι το «A» έχει περικλειστεί μέσα σε ένα `\hbox` που εμποδίζει το `\vbox` να ενεργοποιήσει το TeX ώστε να εκτελέσει διαχωρισμό γραμμών—ένα σημαντικό χαρακτηριστικό των κουτιών που δημιουργούνται με `\vbox`.

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

[![{{{alt}}}](/files/914f440337aebcdf3d9ae12ac81d7fe8d08df444)](https://www.filepicker.io/api/file/LHepknjnRGOVEdghW4qH)

[Λήψη αρχείου PDF](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Απλά μαθηματικά: \hbox{$$\displaystyle \int f(x) dx$$}, σύνθετο κουτί!

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

![{{{alt}}}](/files/02c751fbcacf0393dad9feeb30d1ba213166e72e)

[![{{{alt}}}](/files/df9d6ce3f86e1022256b2c2ee54bc528caeea34e)](https://www.filepicker.io/api/file/oVFNNvCqT0eZP0qS2odk)

[Λήψη αρχείου PDF](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## Ευχαριστίες: ευχαριστούμε Patrick!

Οι ευχαριστίες μας στον [Patrick Gundlach](https://twitter.com/patrickgundlach) που έχει δώσει στο Overleaf άδεια να χρησιμοποιεί και να διανέμει μια τροποποιημένη έκδοση του Lua script του, `viznodelist.lua`, το οποίο επεξεργάζεται κουτιά TeX και εξάγει ένα αρχείο (στη γλώσσα `dot` ) που μπορεί να επεξεργαστεί ώστε να σχεδιαστεί ένα γράφημα κόμβων. Το έργο Overleaf περιέχει ένα σενάριο Lua που ονομάζεται `hiviznodelist.lua`—μια μετονομασμένη και τροποποιημένη έκδοση του αρχικού κώδικα του Patrick, η οποία είναι διαθέσιμη στο [Github](http://gist.github.com/556247). Ο Patrick έχει δημιουργήσει ένα σύστημα στοιχειοθεσίας βασισμένο στο LuaTeX και ανοικτού κώδικα που ονομάζεται [speedata Publisher](https://speedata.github.io/publisher/index.html) το οποίο μπορείτε να κατεβάσετε και να χρησιμοποιήσετε δωρεάν—διατίθενται επίσης επιλογές εμπορικής υποστήριξης.


---

# 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.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.
