> 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/47-tex-tables-how-tex-calculates-spanned-column-widths.md).

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

## Ο στόχος αυτού του άρθρου

Σε αυτό το άρθρο εξερευνούμε πώς $$\mathrm\TeX$$ υπολογίζει τα πλάτη των στηλών ενός πίνακα όταν οι πίνακες περιέχουν καταχωρίσεις (π.χ. επικεφαλίδες πινάκων) που εκτείνονται σε πολλές στήλες (π.χ. χρησιμοποιώντας το $$\mathrm\TeX$$ πρωταρχικές εντολές `\omit` και `\span`). Χρησιμοποιώντας έναν βασικό [«πίνακα αναφοράς»](#reference-table) ως αφετηρία, δημιουργούμε ένα σύνολο παραδειγμάτων—παραγόμενων από εκείνον τον πίνακα αναφοράς—τροποποιώντας διάφορες καταχωρίσεις ώστε να δημιουργήσουμε εκτεινόμενες στήλες. Εξετάζοντας το αποτέλεσμα αυτών των αλλαγών μπορούμε να αρχίσουμε να αναπτύσσουμε μια κατανόηση του υποκείμενου αλγορίθμου που $$\mathrm\TeX$$ χρησιμοποιεί για να υπολογίζει το πλάτος των εκτεινόμενων στηλών.

### Χρησιμοποιώντας $$\mathrm\TeX$$ όχι $$\mathrm\LaTeX$$

Για να εξετάσουμε και να εξηγήσουμε *πώς* $$\mathrm\TeX$$ καθορίζει τα πλάτη των εκτεινόμενων στηλών είναι απαραίτητο να αποφύγουμε οποιοδήποτε από τα θαυμαστά $$\mathrm\LaTeX$$ πακέτα πινάκων και να επιστρέψουμε σε θεμελιώδεις, χαμηλού επιπέδου (primitive), εντολές δημιουργίας πινάκων: συγκεκριμένα, `\halign{...}`, `\span` και `\omit`. [Τα υπάρχοντα $$\mathrm\TeX$$/$$\mathrm\LaTeX$$ πακέτα πινάκων](https://ctan.org/topic/table) είναι φυσικά απαραίτητα εργαλεία παραγωγικότητας και παρέχουν πληθώρα εξαιρετικά χρήσιμων λειτουργιών που επιτρέπουν στους χρήστες να παράγουν γρήγορα ένα τεράστιο εύρος πινακοποιημένου υλικού χρησιμοποιώντας $$\mathrm\LaTeX$$. Αυτά τα πακέτα παρέχουν απαραίτητη «μακρο-υποδομή» χτισμένη γύρω από $$\mathrm\TeX$$τη χαμηλού επιπέδου συμπεριφορά του και οι δημιουργοί τους παρέχουν πολύ καλοδεχούμενες αφαιρέσεις και στρώματα μόνωσης που φροντίζουν για τις υποκείμενες πολυπλοκότητες. Πολλά από αυτά τα πακέτα είναι πραγματικά απίστευτα επιτεύγματα σύνθετου $$\mathrm\TeX$$ προγραμματισμού: όλοι θα πρέπει να είμαστε ευγνώμονες που υπάρχουν για να μας προστατεύουν από το να χρειάζεται να χρησιμοποιούμε ακατέργαστο $$\mathrm\TeX$$!

Ο πραγματικός αλγόριθμος που $$\mathrm\TeX$$ χρησιμοποιεί για να υπολογίζει τα πλάτη των εκτεινόμενων στηλών εξηγείται στη σελίδα 245 του [$$\mathrm\TeX\text{book}$$](https://www.amazon.co.uk/TeXbook-Donald-E-Knuth/dp/0201134489) και, με περισσότερες λεπτομέρειες, στην Ενότητα 801 (σελίδα 336) του έντυπου βιβλίου που περιέχει $$\mathrm\TeX$$τον πηγαίο κώδικα του [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373). Ωστόσο, για πολλούς ανθρώπους (και για μένα συμπεριλαμβανομένου) οι εξηγήσεις του Knuth είναι, κατά περίπτωση, αρκετά συμπαγείς και σύντομες και, μερικές φορές, μπορεί να είναι δύσκολο να τις παρακολουθήσει κανείς σε λεπτομέρεια: τα επεξηγηματικά παραδείγματα είναι πάντα πολύ χρήσιμα.

### Ναι, οι πίνακες είναι σύνθετοι

Στην ενότητα 768 (σελίδα 322) του βιβλίου [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373), ο Knuth κάνει ένα ενδιαφέρον σχόλιο:

> «Είναι κάπως θαύμα κάθε φορά που `\halign` και `\valign` λειτουργούν, επειδή διαπερνούν τόσες πολλές από τις δομές ελέγχου του $$\mathrm\TeX$$.»

Επιπλέον, ο Τόμος IV της τετράτομης σειράς βιβλίων [$$\mathrm\TeX\text{ in Practice}$$](https://www.amazon.co.uk/Tex-Practice-Set-Stephan-Bechtolsheim/dp/038797296X/ref=sr_1_11?s=books\&ie=UTF8\&qid=1504256043\&sr=1-11\&keywords=TeX+in+Practice) αφιερώνει όχι λιγότερες από 180 σελίδες (σσ. 199–379) στη δημιουργία πινάκων στο $$\mathrm\TeX$$ μέσω `\halign` και `\valign`.

Άρα, είναι ασφαλές να παρατηρήσουμε ότι $$\mathrm\TeX$$ οι πίνακες είναι πράγματι «αρκετά δύσκολοι».

### Εκτεινόμενες στήλες: \omit, \span και \multispan

Όπως σημειώθηκε, για να εξερευνήσουμε $$\mathrm\TeX$$τους υπολογισμούς πλάτους στηλών του χρειάζεται να χρησιμοποιήσουμε «ακατέργαστο» $$\mathrm\TeX$$; αυτό σημαίνει έναν συνδυασμό primitive εντολών και μιας $$\text{Plain }\mathrm\TeX$$ μακροεντολής που ονομάζεται `\multispan`. Αν και δεν θα χρησιμοποιήσουμε αυτές τις εντολές για να εικονογραφήσουμε άμεσα τους πίνακες παραδειγμάτων μας (δηλ. εξηγώντας πλήρως όλο τον $$\mathrm\TeX$$ κώδικα), αξίζει να συμπεριλάβουμε μια σύντομη σημείωση που να τις εξηγεί:

* `\halign`: Μία από τις δύο $$\mathrm\TeX$$ primitive (εντολές) για τη δημιουργία πινάκων. Η άλλη είναι `\valign` αλλά δεν χρησιμοποιείται τόσο ευρέως και δεν θα συζητηθεί σε αυτό το άρθρο.
* `\omit`: Μια $$\mathrm\TeX$$ primitive (εντολή) που δίνει εντολή στο $$\mathrm\TeX$$ να αγνοήσει το πρότυπο προοιμίου μιας καταχώρισης πίνακα.
* `\span`: Μια $$\mathrm\TeX$$ primitive (εντολή) που χρησιμοποιείται για να συνδυάσει δύο γειτονικές καταχωρίσεις πίνακα.
* `\multispan{n}`: Μια απλή $$\mathrm\TeX$$ μακροεντολή για να εκτείνει `n` στήλες.

Ουσιαστικά, για να $$\mathrm\TeX$$ εκτείνουν στήλες, `\multispan{n}` αγνοεί τον κατάλληλο αριθμό προτύπων προοιμίου πίνακα και συνδυάζει τον απαιτούμενο αριθμό καταχωρίσεων πίνακα σε μία μόνο καταχώριση. `\omit` και `\span` tokens που χρειάζονται για να εκτείνονται `n` στήλες. Για παράδειγμα, `\multispan{3}` αναπτύσσεται σε `\omit\span\omit\span\omit`.

## Παρουσιάζοντας τον «πίνακα αναφοράς» μας

Ορίστε ο πίνακας αναφοράς μας ακολουθούμενος από μια σχολιασμένη εκδοχή που εξηγεί τα στοιχεία που χρησιμοποιήθηκαν στην κατασκευή του:

![{{{alt}}}](/files/34e4b6a22854ff6aee06d71704d182c2814a3c74)

Τροποποιώντας τον πίνακα αναφοράς μας θα παρατηρήσουμε τι συμβαίνει στο πλάτος του πίνακα και στο πλάτος των επιμέρους στηλών, καθώς προσθέτουμε καταχωρίσεις που εκτείνονται σε διάφορες στήλες. Αυτός ο πίνακας αναφοράς δημιουργήθηκε σε ακατέργαστο $$\mathrm\TeX$$ χρησιμοποιώντας το `\halign{...}` primitive μαζί με έναν αριθμό προσαρμοσμένων μακροεντολών που απαιτούνται για τη στοιχειοθεσία των πινάκων—δεν θα συζητήσουμε αυτές τις μακροεντολές επειδή δεν είναι απαραίτητες για την κατανόηση των παραδειγμάτων και των εξηγήσεων.

Ορίστε μια σχολιασμένη εκδοχή του πίνακα αναφοράς μας για να εξηγήσει τα χαρακτηριστικά του:

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

Το πρώτο μας σύνολο πινάκων παραδειγμάτων, και ο αρχικός πίνακας αναφοράς, έχουν όλα ορισμένο `\tabskip=0pt` ώστε $$\mathrm\TeX$$ να μην προστίθεται κανένα κενό μεταξύ των στηλών μας: στην πράξη, όλες αγγίζουν η μία την άλλη. Ο λόγος που το κάνουμε αυτό είναι για να απλοποιήσουμε την αρχική συζήτηση και τους επακόλουθους υπολογισμούς—αργότερα στο άρθρο επαναφέρουμε μη μηδενικό `\tabskip` glue για να εξετάσουμε την επίδρασή του στον υπολογισμό των πλάτων των εκτεινόμενων στηλών.

Όπως σημειώνεται στις σημειώσεις, έχουμε προσθέσει μια μικρή ποσότητα λευκού χώρου (5pt) στην αρχή όλων των μη εκτεινόμενων καταχωρίσεων του πίνακα (εκτός από την πρώτη σειρά). Αυτός ο λευκός χώρος των 5pt αποτελεί μέρος του συνολικού πλάτους όλων των μη εκτεινόμενων καταχωρίσεων (εκτός από την πρώτη σειρά) και προστέθηκε απλώς για να φαίνεται ο πίνακας λίγο λιγότερο φορτωμένος.

### Μια σύντομη σημείωση για τα πλάτη των πινάκων

Η `\halign{...}` εντολή έχει τρεις μορφές:

* `\halign{...}`: ορίστε τον πίνακα σε οποιοδήποτε πλάτος $$\mathrm\TeX$$ υπολογίζει, με βάση το μέγεθος των καταχωρίσεων (και `\tabskip` glue);
* `\halign to *width* {...}`: δίνει εντολή στο $$\mathrm\TeX$$ να στοιχειοθετήσει τον πίνακα σε ένα καθορισμένο `*width*`;
* `\halign spread *amount*{...}`: προσαρμόστε το υπολογισμένο πλάτος κατά `*amount*`.

Όταν $$\mathrm\TeX$$ στοιχειοθετεί έναν πίνακα χρησιμοποιώντας `\halign{...}` πρέπει να διαβάσει ολόκληρο τον πίνακα στη μνήμη για να εκτελέσει τους διάφορους υπολογισμούς που απαιτούνται για τη στοιχειοθεσία του. Συνεπώς, εκτός αν έχετε ορίσει το πλάτος χρησιμοποιώντας `\halign to *width* {...}` δεν μπορείτε να γνωρίζετε το τελικό πλάτος μέχρι να $$\mathrm\TeX$$ να έχει ολοκληρώσει την επεξεργασία (στοιχειοθεσία) του. Ένας τρόπος να λάβετε το πλάτος ενός πίνακα που παράγεται από το `\halign{...}` είναι να στοιχειοθετήσετε πρώτα τον πίνακα μέσα σε ένα `\vbox{...}` (π.χ., `\setbox0=\vbox{\halign{...}}`) και στη συνέχεια, για παράδειγμα, χρησιμοποιήστε `\the\wd0` για να λάβετε το πλάτος.

### Χωρίς αυτόματο διαχωρισμό γραμμών στις καταχωρίσεις πίνακα

Είναι σημαντικό να σημειωθεί ότι όταν $$\mathrm\TeX$$ στοιχειοθετεί έναν πίνακα που δημιουργήθηκε με το `\halign{...}` οποιοδήποτε κείμενο μέσα στις καταχωρίσεις πίνακα δεν υπόκειται αυτόματα σε διαχωρισμό γραμμών: οι καταχωρίσεις πίνακα στοιχειοθετούνται σε *περιορισμένη οριζόντια λειτουργία*—όπως ακριβώς ένα `\hbox`. Για να ενεργοποιηθεί ο διαχωρισμός γραμμών, το κείμενο μιας καταχώρισης πίνακα πρέπει να περικλείεται μέσα σε ένα `\vbox{...}` μαζί με τη χρήση μιας κατάλληλης τιμής για το `\hsize` μέσα σε εκείνο το `\vbox{...}`. Σημειώστε, ωστόσο, ότι το κείμενο μέσα σε ένα `\noalign{...}` εντολή (μια $$\mathrm\TeX$$ primitive) που χρησιμοποιείται σε μια `\halign{...}` υπόκειται σε $$\mathrm\TeX$$τον διαχωρισμό γραμμών του. Στην πράξη, και όπως υποδηλώνει το όνομά της, `\noalign{...}` επιτρέπει στο $$\mathrm\TeX$$ να «διαφύγει» από τη `\halign{...}` και να τοποθετήσει υλικό μεταξύ των σειρών του πίνακα—συνήθως για να δημιουργήσει οριζόντιες γραμμές μεταξύ των σειρών του πίνακα.

### Δεν επιτρέπεται: \halign{...} μέσα σε \hbox{...}

Δεν μπορείτε να *άμεσα* στοιχειοθετήσετε ένα `\halign{...}` μέσα σε ένα `\hbox{...}`. Η προσπάθεια χρήσης του `\hbox{\halign{...}}` θα προκαλέσει ένα αρκετά μπερδεμένο σφάλμα:

```latex
! Εισήχθη το } που λείπει.
<εισαχθέν κείμενο>
                }
<θα διαβαστεί ξανά>
                   \halign
l.1 \hbox{\halign
```

#### Εξήγηση αυτού του σφάλματος

Λόγω του περικλείοντος `\hbox{...}` $$\mathrm\TeX$$ βρίσκεται σε *περιορισμένη οριζόντια λειτουργία*; στη συνέχεια ανιχνεύει `\halign{...}` που είναι μια *κατακόρυφη λειτουργία* εντολή. Για παράδειγμα, αν χρησιμοποιήσετε το `\halign{...}` μέσα σε μια παράγραφο, $$\mathrm\TeX$$ θα τερματίσει την παράγραφο, θα επεξεργαστεί το `\halign{...}` και στη συνέχεια θα συνεχίσει με το υπόλοιπο της παραγράφου.

Όταν χρησιμοποιείται μέσα σε ένα `\hbox{...}`, η `\halign{...}` πυροδοτεί το $$\mathrm\TeX$$ να προσπαθήσει να επιστρέψει στην κατακόρυφη λειτουργία επιχειρώντας να επιβάλει το κλείσιμο της τρέχουσας ομάδας: $$\mathrm\TeX$$ αναφέρει ένα «`! Το } λείπει`» και εμφανίζει σφάλμα επειδή θεωρεί ότι κάνατε λάθος στη χρήση της ομαδοποίησης. Αν και ένα δεξί άγκιστρο (`}`) μπορεί να μην λείπει από το $$\mathrm\TeX$$ κώδικά σας, το μήνυμα σφάλματος είναι σύμπτωμα του `\hbox{...}` «παρεμβαίνει» και $$\mathrm\TeX$$ κάνει την «καλύτερη εικασία» για την κατάλληλη ενέργεια ώστε να επιλυθεί το πρόβλημα.

## Παραδείγματα πινάκων με εκτεινόμενες στήλες

Η ακόλουθη σειρά γραφικών πινάκων παρέχει ένα σύνολο παραδειγμάτων για να καταδείξει την επίδραση της έκτασης σε στήλες πίνακα: δείχνοντας ότι οι εκτενείς καταχωρίσεις πίνακα μπορούν να έχουν απροσδόκητα αποτελέσματα στο πλάτος ορισμένων στηλών—και, κατά συνέπεια, στο ίδιο το πλάτος του πίνακα. Το ερώτημα που πρόκειται να αντιμετωπίσουμε είναι τι κάνει το $$\mathrm\TeX$$ όταν μια συγκεκριμένη καταχώριση πίνακα εκτείνεται σε έναν αριθμό στηλών αλλά είναι «πολύ φαρδιά για να χωρέσει». Όπως σημειώθηκε παραπάνω, $$\mathrm\TeX$$ όντως εφαρμόζει έναν συγκεκριμένο αλγόριθμο σε αυτό το πρόβλημα υπολογισμού των πλατών των στηλών: τα ακόλουθα παραδείγματα έχουν σχεδιαστεί για να βοηθήσουν στην ανάπτυξη μιας «αίσθησης» του τρόπου λειτουργίας αυτού του αλγορίθμου.

### Πίνακας παράδειγμα 1

Σε αυτό το παράδειγμα χρησιμοποιούμε το `\multispan{2}` για να εκτείνουμε τις στήλες 1 και 2 με μια καταχώριση της οποίας το κείμενο είναι **Μια επικεφαλίδα πίνακα**:

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

#### Παρατηρήσεις

* Το πλάτος αυτού του πίνακα είναι το ίδιο με του [πίνακα αναφοράς](#reference-table): $$327.71722\text{pt}$$.
* Το πλάτος της καταχώρισης που εκτείνεται στις στήλες 1 και 2 είναι $$81.04953\text{pt}$$ το οποίο είναι μικρότερο από το συνολικό πλάτος των καταχωρίσεων στις στήλες που καλύπτει: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$

## Πίνακας παράδειγμα 2

Όπως και στο [Πίνακας παράδειγμα 1](#example-table-1), αυτό το παράδειγμα χρησιμοποιεί επίσης `\multispan{2}` για να εκτείνει τις στήλες 1 και 2, αλλά εδώ χρησιμοποιούμε μια μεγαλύτερη καταχώριση της οποίας το κείμενο είναι **Μια ελαφρώς μεγαλύτερη επικεφαλίδα πίνακα**.

![{{{alt}}}](/files/8de7f95ae5b799a09e56c5ef61d37556d6fdd2fb)

#### Παρατηρήσεις

Αν συγκρίνετε αυτό το παράδειγμα με τον [πίνακα αναφοράς](#reference-table) μπορούμε να δούμε τα ακόλουθα:

* Το πλάτος αυτού του πίνακα έχει αυξηθεί από $$327.71722\text{pt}$$ σε $$374.37032\text{pt}$$: συνολικά κατά $$46.6531\text{pt}$$.
* Το πλάτος της καταχώρισης που εκτείνεται στις στήλες 1 και 2 ($$156.28664\text{pt}$$) είναι μεγαλύτερο από το συνολικό πλάτος των καταχωρίσεων στις στήλες που καλύπτει: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$. Αυτή η διαφορά είναι $$156.28664\text{pt}-109.63355\text{pt} = 46.6531\text{pt}$$ το ίδιο ποσό κατά το οποίο έχει αυξηθεί το πλάτος του πίνακα.
* $$\mathrm\TeX$$ έχει προσαρμόσει το πλάτος της στήλης 2 ώστε να παρέχει τον πρόσθετο απαιτούμενο χώρο. Αργότερα θα δούμε πώς $$\mathrm\TeX$$ υπολογίζει το ποσό κατά το οποίο πρέπει να αυξηθεί η στήλη 2.
* Η στήλη 1 δεν επηρεάζεται: το πλάτος της δεν έχει επηρεαστεί από την καταχώριση που εκτείνεται στις στήλες 1 και 2.

### Πίνακας παράδειγμα 3

Σε αυτό το παράδειγμα χρησιμοποιούμε το `\multispan{3}` για να εκτείνουμε τις στήλες 1 έως 3 με μια καταχώριση της οποίας το κείμενο είναι το ίδιο με του [Πίνακας παράδειγμα 2](#example-table-2): **Μια ελαφρώς μεγαλύτερη επικεφαλίδα πίνακα**.

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

#### Παρατηρήσεις

* Το πλάτος αυτού του πίνακα είναι το ίδιο με του [πίνακα αναφοράς](#reference-table): $$327.71722\text{pt}$$.
* Το πλάτος της καταχώρισης που εκτείνεται στις στήλες 1 έως 3 ($$156.28664\text{pt}$$) είναι μικρότερο από το συνολικό πλάτος των καταχωρίσεων στις τρεις στήλες που καλύπτει: $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Κανένα από τα πλάτη των στηλών δεν έχει επηρεαστεί από την καταχώριση που εκτείνεται στις στήλες 1 έως 3.

Αρχίζετε να βλέπετε ένα μοτίβο να αναδύεται;

### Πίνακας παράδειγμα 4

Όπως και με το [Πίνακας παράδειγμα 3](#example-table-3), εδώ χρησιμοποιούμε το `\multispan{3}` για να εκτείνουμε τις στήλες 1 έως 3, αλλά αυτή τη φορά με μια καταχώριση της οποίας το κείμενο είναι σημαντικά μεγαλύτερο: **Μια πολύ μεγαλύτερη επικεφαλίδα πίνακα που εκτείνεται πολύ**.

![{{{alt}}}](/files/462aea3acc1f62cd631e7f533d487908126f90ce)

#### Παρατηρήσεις

* Σε σύγκριση με τον [πίνακα αναφοράς](#reference-table), το πλάτος αυτού του πίνακα έχει αυξηθεί από $$327.71722\text{pt}$$ σε $$465.95685\text{pt}$$: αύξηση κατά $$138.23963\text{pt}$$.
* Το πλάτος της καταχώρισης που εκτείνεται στις στήλες 1 έως 3 είναι $$306.91216\text{pt}$$.
* Το συνολικό πλάτος των καταχωρίσεων στις τρεις εκτεινόμενες στήλες είναι $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Η διαφορά στο πλάτος μεταξύ της μακράς εκτεινόμενης καταχώρισης και των καταχωρίσεων στις στήλες 1 έως 3 είναι $$306.91216\text{pt}-168.67254\text{pt}=138.23962\text{pt}$$. Το ίδιο ποσό (στα 4 δεκαδικά ψηφία!) κατά το οποίο έχει αυξηθεί το πλάτος του πίνακα.
* Μόνο η στήλη 3 έχει αυξήσει το πλάτος της: ούτε η στήλη 1 ούτε η στήλη 2 επηρεάζονται.

#### Αναδύεται ένα μοτίβο

Αν κοιτάξουμε τα [Πίνακας παράδειγμα 2](#example-table-2) και [Πίνακας παράδειγμα 4](#example-table-4) μπορούμε να δούμε ότι και στις δύο περιπτώσεις είναι η **τελευταία στήλη στην έκταση** της οποίας το πλάτος αυξήθηκε για να δημιουργηθεί χώρος για τη μακριά καταχώριση που εκτεινόταν στις στήλες:

* Στο [Πίνακας παράδειγμα 2](#example-table-2): Η μακριά καταχώριση εκτεινόταν στις στήλες 1 και 2. Η στήλη 2 «τεντώθηκε».
* Στο [Πίνακας παράδειγμα 4](#example-table-4): Η μακριά καταχώριση εκτεινόταν στις στήλες 1 έως 3. Η στήλη 3 «τεντώθηκε».

#### Το πλάτος της στήλης 3: Αναδύεται ένας αλγόριθμος;

Οι ακόλουθοι υπολογισμοί δίνουν μια πιο καθαρή ένδειξη του τι $$\mathrm\TeX$$ κάνει. Να τι γνωρίζουμε:

* Το πλάτος της μακριάς καταχώρισης που εκτείνεται στις στήλες 1 έως 3 είναι $$306.91216\text{pt}$$.
* Το συνολικό πλάτος των καταχωρίσεων στις στήλες 1 και 2 είναι $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$.

Ποια είναι η διαφορά μεταξύ αυτών των τιμών; Είναι $$306.91216\text{pt}-109.63355\text{pt} = 197.2786\text{pt}$$ και αυτό είναι το πλάτος που χρησιμοποιείται για τη στήλη 3: προκύπτει άμεσα από τον αλγόριθμο που χρησιμοποιεί το $$\mathrm\TeX$$.

### Πίνακας παράδειγμα 5

Πριν περάσουμε σε ένα πιο περίπλοκο παράδειγμα, εδώ είναι ένα ακόμη «απλό» παράδειγμα. Αυτός ο πίνακας περιέχει την ίδια εκτενή καταχώριση όπως στο [Πίνακας παράδειγμα 4](#example-table-4): **Μια πολύ μεγαλύτερη επικεφαλίδα πίνακα που εκτείνεται πολύ**; ωστόσο, αυτή τη φορά χρησιμοποιούμε το `\multispan{6}` το οποίο επιτρέπει σε αυτήν την καταχώριση να εκτείνεται σε ολόκληρο τον πίνακα. Όπως βλέπετε, ο παραγόμενος πίνακας εξακολουθεί να έχει το ίδιο πλάτος με τον [πίνακα αναφοράς](#reference-table) ($$327.71722\text{pt}$$) που σημαίνει ότι καμία στήλη δεν έχει επηρεαστεί από αυτήν την πολύ μεγάλη καταχώριση. Προφανώς, αυτό συμβαίνει επειδή το πλάτος της καταχώρισης ($$306.91216\text{pt}$$) είναι μικρότερο από το συνολικό πλάτος όλων των καταχωρίσεων που καλύπτει: $$327.71722\text{pt}$$; δηλαδή, το πλάτος του πίνακα.

![{{{alt}}}](/files/46bb93644fdeb34b1c021093f8afab77e4a44458)

### Πίνακας παράδειγμα 6: Λίγο πιο περίπλοκο

Εδώ, εξετάζουμε μια σειρά από τρεις πίνακες παραδειγμάτων (6(a)–6(c)) για να δείξουμε την επίδραση δύο διαφορετικών καταχωρίσεων που και οι δύο εκτείνονται μέχρι τη στήλη 5. [Πίνακας παράδειγμα 6(a)](#example-table-6a) και [Πίνακας παράδειγμα 6(b)](#example-table-6b) δείχνουν έναν πίνακα που περιέχει μία μόνο καταχώριση η οποία εκτείνεται σε αρκετές στήλες έως τη στήλη 5. [Πίνακας παράδειγμα 6(c)](#example-table-6c) συνδυάζει και τις δύο εκτεινόμενες καταχωρίσεις σε έναν μόνο πίνακα και θέτει το ερώτημα: ποια καταχώριση καθορίζει πραγματικά το πλάτος της στήλης 5 και γιατί; Η απάντηση μας οδηγεί στην ουσία του αλγορίθμου που χρησιμοποιεί το $$\mathrm\TeX$$.

#### Πίνακας παράδειγμα 6(a)

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

**Παρατηρήσεις**

* Σε σύγκριση με τον [πίνακα αναφοράς](#reference-table), το πλάτος αυτού του πίνακα έχει αυξηθεί από $$327.71722\text{pt}$$ σε $$371.11153\text{pt}$$: αύξηση κατά $$43.39431\text{pt}$$.
* Το πλάτος της καταχώρισης που εκτείνεται στις στήλες 3 έως 5 είναι $$215.06683\text{pt}$$.
* Το συνολικό πλάτος των καταχωρίσεων στις στήλες 3 έως 5 είναι $$59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 171.67253\text{pt}$$.
* Η διαφορά στο πλάτος μεταξύ των καταχωρίσεων που καλύπτονται στις στήλες 3 έως 5 και του πλάτους της εκτεινόμενης καταχώρισης είναι $$215.06683\text{pt}-171.67253\text{pt}=43.3943\text{pt}$$: το ακριβές ποσό (στα 4 δεκαδικά ψηφία!) κατά το οποίο έχει αυξηθεί το πλάτος του πίνακα .

#### Πίνακας παράδειγμα 6(b)

![{{{alt}}}](/files/4f584cd1c7cb4406ea03850ae0f56cc2e42eff56)

**Παρατηρήσεις**

* Σε σύγκριση με τον [πίνακα αναφοράς](#reference-table), το πλάτος αυτού του πίνακα έχει αυξηθεί από $$327.71722\text{pt}$$ σε $$353.3233\text{pt}$$: αύξηση κατά $$25.60608\text{pt}$$.
* Το πλάτος της καταχώρισης που εκτείνεται στις στήλες 1 έως 5 είναι $$306.91216\text{pt}$$.
* Το συνολικό πλάτος των καταχωρίσεων στις στήλες 1 έως 5 είναι $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 281.30608\text{pt}$$.
* Η διαφορά στο πλάτος μεταξύ των καταχωρίσεων που καλύπτονται στις στήλες 1 έως 5 και του πλάτους της εκτεινόμενης καταχώρισης είναι $$306.91216\text{pt}-281.30608\text{pt}=25.60608\text{pt}$$: **note** αυτό είναι *λιγότερο* από την τιμή που υπολογίστηκε για το [Παράδειγμα 6(a)](#example-table-6a), η οποία ήταν $$43.3943\text{pt}$$.

#### Πίνακας παράδειγμα 6(c)

Εδώ, συνδυάζουμε τις καταχωρίσεις στους πίνακες παραδειγμάτων [6(a)](#example-table-6a) και [6(b)](#example-table-6b) σε έναν μόνο πίνακα: τι συμβαίνει;

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

**Παρατήρηση**

* Σε σύγκριση με τον [πίνακα αναφοράς](#reference-table), το πλάτος αυτού του πίνακα έχει αυξηθεί από $$327.71722\text{pt}$$ σε $$371.11153\text{pt}$$: αύξηση κατά $$43.39431\text{pt}$$. Σημειώνουμε ότι αυτό είναι ακριβώς το ίδιο με το [Πίνακας παράδειγμα 6(a)](#example-table-6a).

#### Τι κάνει το $$\mathrm\TeX$$ να κάνει;

Για να κατανοήσουμε τα αποτελέσματα του $$\mathrm\TeX$$αλγορίθμου και των διαδικασιών λήψης αποφάσεων του, σημειώνουμε ότι αυτή η καταχώριση

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

εκτείνεται πέρα από τις καταχωρίσεις που καλύπτονται από το $$25.60608\text{pt}$$; ωστόσο, αυτή η καταχώριση

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

εκτείνεται ακόμη περισσότερο πέρα από τις καταχωρίσεις που καλύπτονται: κατά $$43.3943\text{pt}$$. Άρα, εκείνη η καταχώριση «κερδίζει την κούρσα» και το πλάτος της στήλης 5 αυξάνεται κατά το **μέγιστο** από αυτές τις δύο τιμές ($$43.3943\text{pt}$$). Το πλάτος της στήλης 5 τώρα γίνεται $$59.6501\text{pt} + 43.3943\text{pt} = 103.0444\text{pt}$$ ώστε να χωρέσει η καταχώριση που εκτείνεται στις στήλες 3 έως 5. Η περιγραφή μας της ακριβούς «αλληλουχίας γεγονότων» είναι λίγο απλοποιημένη, αλλά το αποτέλεσμα είναι όπως το περιγράψαμε.

## Επαναφέροντας λίγη πολυπλοκότητα

Για να ελαχιστοποιήσουμε την πολυπλοκότητα των συζητήσεών μας (μέχρι τώρα) χρησιμοποιήσαμε σχετικά απλά παραδείγματα για να δείξουμε τις αρχές του $$\mathrm\TeX$$αλγορίθμου του· συγκεκριμένα, ορίσαμε `\tabskip=0pt`. Στην πράξη, οι «πραγματικοί» πίνακες είναι πιθανό να έχουν πολλές καταχωρίσεις που εκτείνονται σε ένα εύρος στηλών και, φυσικά, θα έχουν μη μηδενικές τιμές για το `\tabskip` glue—ένα θέμα στο οποίο θα επανέλθουμε τώρα.

### \tabskip glue και πλάτη εκτεινόμενων στηλών

Ο σχεδιασμός πινάκων συχνά απαιτεί την προσθήκη λευκού χώρου μεταξύ στηλών και, φυσικά, $$\mathrm\TeX$$ το διαθέτει αυτό μέσω μιας primitive εντολής που ονομάζεται `\tabskip`. Αυτή η εντολή μπορεί να χρησιμοποιηθεί για να τοποθετήσει σταθερό ή ευέλικτο glue (απόσταση):

* πριν από έναν πίνακα (δηλ. αριστερά από τη στήλη 1);
* μεταξύ μίας ή περισσότερων στηλών;
* μετά τον πίνακα (δηλ. δεξιά από την τελευταία στήλη).

Ορίστε ένα παράδειγμα για να το θυμηθούμε:

![{{{alt}}}](/files/32af18c3db6f78c5ea3ddbc366dda3e88b2b7119)

### Πώς επηρεάζει το glue \tabskip τα πλάτη των εκτεινόμενων στηλών;

Η παρουσία μη μηδενικού `\tabskip` glue μεταξύ στηλών παρέχει πρόσθετο χώρο τον οποίο οι εκτεινόμενες καταχωρίσεις μπορούν να «απορροφήσουν» προτού $$\mathrm\TeX$$ χρειαστεί να σκεφτεί την αύξηση του πλάτους της τελευταίας στήλης σε μια έκταση.

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

* Το πρώτο παράδειγμα χρησιμοποιεί τον αρχικό μας «πίνακα αναφοράς» ο οποίος, αν θυμάστε, έχει ορίσει `\tabskip=0pt`.
* Το δεύτερο παράδειγμα χρησιμοποιεί μια τροποποιημένη εκδοχή του [πίνακα αναφοράς](#reference-table) \tabskip=10pt `\tabskip=10pt` πριν και μετά τον πίνακα, αλλά πιο σημαντικό είναι ότι έχει ορίσει `\tabskip=20pt` μεταξύ των στηλών.

Μέσα στον *τροποποιημένο* πίνακα αναφοράς οι δύο εκτεινόμενες στήλες δεν έχουν καμία επίδραση στα πλάτη των στηλών (και στο πλάτος του πίνακα), αλλά επηρεάζουν το πλάτος της στήλης 2 (και του πίνακα) στον *αρχικό* [πίνακα αναφοράς](#reference-table).

### Αρχικός πίνακας αναφοράς: \tabskip=0pt

Εδώ, δείχνουμε τον αρχικό μας [πίνακα αναφοράς](#reference-table) μαζί με έναν δεύτερο πίνακα (παραγόμενο από τον αρχικό μας [πίνακα αναφοράς](#reference-table)) ο οποίος έχει μια καταχώριση «**Δοκιμή μιας μεγαλύτερης επικεφαλίδας πίνακα**» που εκτείνεται στις στήλες 1 και 2. Είναι απολύτως σαφές ότι η στήλη 2 (του δεύτερου πίνακα στο διάγραμμα) και συνεπώς ολόκληρος ο πίνακας, επηρεάζονται και οι δύο από τις εκτεινόμενες στήλες.

![{{{alt}}}](/files/748b8d50bbabf08951aa2f28994807d2afc1fec2)

### Τροποποιημένος πίνακας αναφοράς: \tabskip=20pt

Εδώ, δείχνουμε τον τροποποιημένο πίνακα αναφοράς μας μαζί με έναν δεύτερο πίνακα (παραγόμενο από τον τροποποιημένο πίνακα αναφοράς μας) ο οποίος επίσης έχει μια καταχώριση «**Δοκιμή μιας μεγαλύτερης επικεφαλίδας πίνακα**» που εκτείνεται στις στήλες 1 και 2. Είναι απολύτως σαφές ότι, μέσα στον δεύτερο πίνακα στο διάγραμμα, ούτε το πλάτος της στήλης 2 ούτε του πίνακα επηρεάζεται από τις εκτεινόμενες στήλες. Σε αυτή την περίπτωση, η παρουσία του `\tabskip` glue (`20pt`\tabskip=20pt

![{{{alt}}}](/files/74fb0c3af745bf03053d2143643668743f236d64)

## Η ουσία του $$\mathrm\TeX$$αλγορίθμου του

Ελπίζουμε ότι το εύρος των παραδειγμάτων που δόθηκαν παραπάνω βοήθησε να αναπτυχθεί μια «αίσθηση» του τι $$\mathrm\TeX$$ κάνει για να χωρέσει εκτεινόμενες καταχωρίσεις και πώς $$\mathrm\TeX$$ θα προσαρμόσει, αν χρειαστεί, το πλάτος της **τελευταίας** στήλης μέσα σε κάθε εύρος εκτεινόμενων στηλών. Εκτός από το πλάτος των καταχωρίσεων μέσα στις μεμονωμένες στήλες που εκτείνονται, η παρουσία μη μηδενικού `\tabskip` glue είναι ένας σημαντικός παράγοντας που $$\mathrm\TeX$$ λαμβάνει υπόψη όταν αποφασίζει αν χρειάζεται να προσαρμόσει οποιαδήποτε πλάτη στηλών. Το βασικό σημείο που πρέπει να θυμόμαστε είναι ότι $$\mathrm\TeX$$στόχος του είναι να υπολογίσει ένα κατάλληλο πλάτος για το **τελευταία στήλη** μέσα σε κάθε εύρος εκτεινόμενων στηλών.

### Τελικό παράδειγμα πίνακα: τελευταίες στήλες σε ένα εκτεινόμενο εύρος

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

Οι δύο πίνακες έχουν ευθυγραμμιστεί προσεκτικά ώστε να δείξουν ότι, στον επάνω πίνακα, καμία στήλη πριν από τη στήλη 5 δεν έχει επηρεαστεί από τις εκτεινόμενες στήλες. Η πιο σκούρα πράσινη περιοχή στα αριστερά του διαγράμματος δείχνει ότι οι στήλες 1 έως 4 και των δύο πινάκων εξακολουθούν να ευθυγραμμίζονται τέλεια. Στα δεξιά υπάρχει μια ανοιχτότερη πράσινη σκιασμένη περιοχή που δείχνει ότι μόνο οι στήλες 5 και 6 έχουν επηρεαστεί από τις εκτεινόμενες καταχωρίσεις.

Στον επάνω πίνακα, τα εκτεινόμενα τμήματα είναι τα εξής:

* στήλες 1 έως 5: καλύπτονται από έναν $$400\text{pt}$$ κανόνα;
* στήλες 3 έως 5: καλύπτονται από έναν $$200\text{pt}$$ κανόνα;
* στήλες 4 έως 6: καλύπτονται από έναν $$250\text{pt}$$ κανόνα.

![{{{alt}}}](/files/9184f04071e00087c351308aac6d41e18c14b589)

Για άλλη μια φορά, η εξήγηση είναι ότι μέσα σε μια σειρά εκτεινόμενων στηλών, μόνο το πλάτος της τελευταίας στήλης προσαρμόζεται (αν χρειάζεται): οι ενδιάμεσες στήλες δεν επηρεάζονται και εδώ αυτό σημαίνει τις στήλες 1 έως 4 — αν και, φυσικά, το πλάτος των στηλών 1 έως 4 (και της ενδιάμεσης `\tabskip` κόλλας) λαμβάνεται υπόψη κατά τον υπολογισμό των προσαρμοσμένων πλατών των στηλών 5 και 6.

### Μια αναλυτική παρουσίαση του $$\mathrm\TeX$$αλγορίθμου του

Θα ολοκληρώσουμε με μια *απλοποιημένη* αναλυτική παρουσίαση των «$$\mathrm\TeX$$νοητικών διεργασιών» του καθώς υπολογίζει τα πλάτη των στηλών σε εκτεινόμενες εγγραφές. Η περιγραφή $$\mathrm\TeX$$των αλγορίθμων του δεν είναι πάντα απλή, οπότε θα υιοθετήσουμε κάποια «καλλιτεχνική άδεια απλοποίησης» για να δώσουμε μια επισκόπηση του τι συμβαίνει. Οι αναγνώστες που ενδιαφέρονται για όλες τις μπερδεμένες λεπτομέρειες παραπέμπονται στην Ενότητα 801 (σελίδα 336) του έντυπου βιβλίου που περιέχει $$\mathrm\TeX$$τον πηγαίο κώδικα του [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373).

Οι πραγματικοί πίνακες συχνά δημιουργούνται με πολλές χρήσεις του `\span` πρωτογενούς (π.χ. μέσα σε $$\mathrm\LaTeX$$ πακέτα) για την κατασκευή πολλαπλών περιπτώσεων εκτεινόμενων στηλών μέσα στον πίνακα. Για να διαχειριστεί αυτό, οι δομές δεδομένων (βαθιά μέσα στο $$\mathrm\TeX$$) διατηρούν πληροφορίες (τις λεγόμενες *κόμβοι έκτασης*) οι οποίες λένε $$\mathrm\TeX$$ για τις συνδέσεις (εκτάσεις) μεταξύ καταχωρίσεων/στηλών του πίνακα. Προφανώς, $$\mathrm\TeX$$ πρέπει να εφαρμόσει τους αλγορίθμους του με συστηματικό τρόπο και θα χρειαστεί να επεξεργαστεί ολόκληρο τον πίνακα για να κάνει τους τελικούς υπολογισμούς του — για να προσδιορίσει όλα τα πλάτη στηλών, το συνολικό πλάτος του πίνακα και, αν απαιτείται, το ποσό κατά το οποίο οι εύκαμπτες κόλλες που χρησιμοποιούνται στον πίνακα πρέπει να τεντωθούν ή να συρρικνωθούν. Δεν είναι πραγματικά έκπληξη ότι $$\mathrm\TeX$$ δεν μπορεί να σας πει το τελικό πλάτος του πίνακα μέχρι να έχει επεξεργαστεί πλήρως την `\halign{...}` εντολή — έχει πραγματικά πολλή δουλειά να κάνει!

Το σημείο εκκίνησης για τους υπολογισμούς του πλάτους των στηλών είναι η στήλη 1 επειδή, φυσικά, τίποτα δεν μπορεί να εκτείνεται από τα αριστερά της (και *διαμέσου/μέσα στη*) στήλης 1. $$\mathrm\TeX$$ ξεκινά καθορίζοντας το πλάτος της στήλης 1, προσδιορίζοντας ποια εγγραφή που έχει το μέγιστο *φυσικό πλάτος*. Ας ονομάσουμε αυτό το μέγιστο πλάτος $$w\_1$$και αν υπάρχουν καταχωρίσεις που εκτείνονται από τη στήλη 1 στη στήλη 2 ας ονομάσουμε το πλάτος αυτής της καταχώρισης $$w\_{12}$$ (πλάτος από 1 έως 2). Επιπλέον, θα συμβολίσουμε την `\tabskip` κόλλα μεταξύ των στηλών 1 και 2 ως $$t\_{1}$$—σημειώστε ότι εξετάζουμε μόνο το *φυσικό πλάτος* της συγκεκριμένης `\tabskip` κόλλας και, προς το παρόν, αγνοούμε τυχόν συνιστώσες τεντώματος ή συρρίκνωσης που μπορεί να διαθέτει. Επίσης, ας είναι το μέγιστο φυσικό πλάτος όλων των μη εκτεινόμενων καταχωρίσεων στη στήλη 2 $$w\_2$$.

Το βασικό σημείο που πρέπει να σημειωθεί είναι ότι $$\mathrm\TeX$$ προσπαθεί να υπολογίσει το πλάτος της στήλης 2 εξετάζοντας μόνο εκείνες τις καταχωρίσεις όπου η έκταση *ξεκινά* με τη στήλη 1 και *τελειώνει* στη στήλη 2. Η βασική παράμετρος για το $$\mathrm\TeX$$ είναι η δοκιμή $$\max(w\_{2}, w\_{12} - (w\_1+ t\_1))$$—μπορεί να υπάρχουν πολλές καταχωρίσεις που εκτείνονται στις στήλες 1 και 2: κάποιες μπορεί να είναι στενές (μικρό $$w\_{12}$$), άλλες πολύ φαρδιές (μεγάλο $$w\_{12}$$) οπότε το $$\mathrm\TeX$$ αναζητά εκείνη που έχει τη μεγαλύτερη επίδραση (εξ ου και το $$\max(\text{...})$$). Εδώ, η τιμή του $$w\_{12} -(w\_1+ t\_1)$$ είναι το ποσό κατά το οποίο μια καταχώριση που εκτείνεται στις στήλες 1 και 2 «ξεχειλίζει» από τη στήλη 1 στη στήλη 2: σημειώστε ότι το $$\mathrm\TeX$$ χρησιμοποιεί το πλάτος της στήλης 1 **και** το `\tabskip` glue ($$t\_{1}$$) μεταξύ των στηλών 1 και 2. Μόλις το $$\mathrm\TeX$$ έχει προσδιορίσει αν τυχόν εκτάσεις από τη στήλη 1 στη 2 επηρεάζουν το πλάτος της στήλης 2, θέτει το πλάτος της στήλης 2 στη μέγιστη τιμή που έχει προσδιορίσει (χρησιμοποιώντας τη δοκιμή που περιγράφηκε). $$\mathrm\TeX$$ συνεχίζει να περνά από όλες τις άλλες στήλες, πραγματοποιώντας παρόμοιες δοκιμές.

Και τέλος, απλώς για πληρότητα, παραθέτουμε εδώ την ουσία του $$\mathrm\TeX$$αλγορίθμου του για τον υπολογισμό των πλατών στηλών (ληφθέν από την τεκμηρίωση του πηγαίου κώδικα του Knuth για το $$\mathrm\TeX$$):

Έστω $$w\_{ij}$$ το μέγιστο από τα φυσικά πλάτη όλων των καταχωρίσεων που εκτείνονται στις στήλες $$i$$ έως $$j$$, συμπεριλαμβανομένων. Τα τελικά πλάτη των στηλών ορίζονται από τον τύπο

$$\begin{equation\*} w\_j=\max\_{1\leq i\leq j}\biggl(w\_{ij}-\sum\_{i\leq k< j}(t\_k+w\_k)\biggr) \end{equation\*}$$

όπου $$t\_k$$ είναι το φυσικό πλάτος της κόλλας tabskip μεταξύ των στηλών $$k$$ και $$k+1$$.

## Κολοφώνας: Χρήση του Overleaf για την παραγωγή πινάκων ως γραφικών SVG

Όλοι οι $$\mathrm\TeX$$ πίνακες που παρουσιάζονται σε αυτό το άρθρο είναι αρχεία Scalable Vector Graphics (SVG) που παράχθηκαν στην πλατφόρμα Overleaf. Οι σημειώσεις (βέλη και πράσινα πλαίσια) προστέθηκαν ανοίγοντας το γραφικό SVG στο Inkscape — σημειώστε, ωστόσο, ότι το κείμενο των σημειώσεων στοιχειοθετήθηκε στο $$\mathrm\TeX$$ ως πρόσθετο κείμενο που συνοδεύει τον πίνακα: μόνο τα βέλη και τα πράσινα φόντα προστέθηκαν στο Inkscape. Αν ενδιαφέρεστε να μάθετε πώς επιτεύχθηκε αυτό, συνεχίστε να διαβάζετε.

Οι διακομιστές του Overleaf χρησιμοποιούν τη $$\mathrm\TeX \text{ Live}$$ διανομή η οποία, εκτός από $$\mathrm\TeX$$-βασισμένες μηχανές στοιχειοθεσίας, παρέχει έναν πλούτο από πολύ χρήσιμα $$\mathrm\TeX$$-σχετικά εργαλεία λογισμικού και βοηθητικά προγράμματα. Μεταξύ αυτών υπάρχει ένα που ονομάζεται [`dvisvgm`](https://dvisvgm.de) το οποίο, όπως υποδηλώνει το όνομά του, μετατρέπει $$\mathrm\TeX$$του (**D**e**V**ice **I**ndependent) μορφότυπο αρχείου εξόδου σε SVG. Μεταξύ των πολλών [επιλογών γραμμής εντολών](https://dvisvgm.de/Manpage/) `dvisvgm` παρέχει μια επιλογή (`-n` ή `--no-fonts`) η οποία θα το διατάξει να μετατρέψει όλο το κείμενο σε *διαδρομές* που σημαίνει ότι το κείμενο στα γραφικά SVG σχεδιάζεται χρησιμοποιώντας γραμμές και καμπύλες αντί για πραγματικές γραμματοσειρές και γλυφές. Αυτό μπορεί να αυξήσει το μέγεθος του αρχείου του παραγόμενου γραφικού SVG, αλλά εξασφαλίζει ότι τα γραφικά SVG είναι εξαιρετικά φορητά και σχεδόν βέβαιο ότι θα λειτουργούν καλά σε οποιαδήποτε συσκευή.

### Λοιπόν... πώς έγινε;

Σε ένα [προηγούμενο άρθρο](https://www.overleaf.com/blog/510-using-luatex-to-run-tools-and-utilities-installed-on-overleafs-servers) συζήτησα πώς μπορείτε να χρησιμοποιήσετε το $$\text{Lua}\mathrm\TeX$$ για να εκτελείτε τα διάφορα εργαλεία λογισμικού και τα βοηθητικά προγράμματα που είναι εγκατεστημένα στους διακομιστές του Overleaf — είναι μια εξαιρετικά εύκολη και βολική τεχνική. Αυτή η τεχνική χρησιμοποιήθηκε για τη δημιουργία γραφικών SVG στοιχειοθετημένων $$\mathrm\TeX$$ πινάκων, ως εξής. Από μέσα στο κύριο $$\mathrm\TeX$$ αρχείο εγγράφου, ο κώδικας για τη στοιχειοθεσία κάθε πίνακα (δημιουργημένος χρησιμοποιώντας το `\halign`) γράφτηκε σε ένα `.tex` αρχείο. Αυτό επιτεύχθηκε περικλείοντας τον κώδικα του πίνακα μέσα σε ένα ζεύγος εντολών τις οποίες ονόμασα `\beginscoop` και `\endscoop`. Πιθανότατα υπάρχουν πολλοί άλλοι τρόποι για να επιτευχθεί το επιθυμητό αποτέλεσμα, αλλά εδώ είναι οι ορισμοί μακροεντολών που χρησιμοποίησα:

```latex
\def\cc{\catcode`\#=12\relax}
\long\def\scoop#1\endscoop{\global\fulltoks={#1}\egroup}
\def\beginscoop{\global\advance\numfigs by1\relax\bgroup\cc\scoop}
```

Τους χρησιμοποιείτε έτσι:

```latex
\beginscoop
\halign{...}
\endscoop
```

Σημειώστε ότι το `\endscoop` token χρησιμεύει απλώς για να οριοθετήσει την παράμετρο του `\scoop` μακροεντολής: $$\mathrm\TeX$$ ουσιαστικά απορρίπτει το `\endscoop` token, οπότε στην πραγματικότητα δεν χρειάζεται να το ορίσουμε (π.χ., με το `\def\endscoop{...}`).

Η $$\mathrm\TeX$$ ο κώδικας που περιέχεται στο `\halign{...}` αποθηκεύεται σε ένα `toks` καταχωρητή με το όνομα `\fulltoks`. Ένα δύσκολο σημείο που συνάντησα (με το $$\text{Lua}\mathrm\TeX$$) ήταν η ανάγκη να αποτρέψω τα `#` χαρακτήρων μέσα στο `\halign{...}` προοίμιο από το να «διπλασιάζονται» σε `##` όταν γράφονται σε ένα `.tex` αρχείο. Για να το αποφύγω αυτό, έπρεπε να θέσω προσωρινά τα `\catcode`του `#` χαρακτήρες στο 12 πριν αποθηκεύσω τον $$\mathrm\TeX$$ κώδικα (tokens) στον `\fulltoks` καταχωρητή tokens.

Το επόμενο βήμα είναι να γράψουμε τα tokens που περιέχονται στο `\fulltoks` ως ένα $$\mathrm\TeX$$ αρχείο — επειδή χρησιμοποιούσα το $$\text{Lua}\mathrm\TeX$$ αυτό αποδείχθηκε *εξαιρετικά* εύκολο χάρη στο $$\text{Lua}\mathrm\TeX$$θαυμάσιο Lua API του. `\writefile{...}` το οποίο παίρνει ως παράμετρο το όνομα ενός καταχωρητή tokens του οποίου τα tokens θέλετε να γράψετε σε ένα αρχείο (π.χ., `\writefile{fulltoks}`). Μέσα στη `\writefile{...}` μακροεντολή χρησιμοποίησα το Lua API για να πάρω μια κειμενική αναπαράσταση του `\fulltoks` καταχωρητή tokens:

```latex
\def\writefile#1{%
\directlua{
...
...
 local p=tex.toks["#1"]
...
...
}}
```

Ορίστε ένα στιγμιότυπο οθόνης που δείχνει λίγο περισσότερα από το `\writefile{...}` εντολή:

[![{{{alt}}}](/files/395472b066866a60f84a91fe137dfeee477f4c85)](https://www.filepicker.io/api/file/ngeDmgRStGWvG044RE1A)

Η γλώσσα Lua και το Lua API που παρέχεται από το $$\text{Lua}\mathrm\TeX$$ μπορούν συχνά να απλοποιήσουν $$\mathrm\TeX$$ προγραμματιστικά καθήκοντα και είναι εξαιτίας αυτών των χρήσιμων και ισχυρών χαρακτηριστικών που έχω χρησιμοποιήσει το $$\text{Lua}\mathrm\TeX$$ από το \~2009 — και παραμένω μεγάλος θαυμαστής αυτής της πραγματικά υπέροχης $$\mathrm\TeX$$ μηχανής. Εντάξει, η $$\text{Lua}\mathrm\TeX$$ διαφήμιση τώρα ολοκληρώνεται.

Αφού αποκτήσαμε τόσο εύκολα τον $$\mathrm\TeX$$ κώδικα που είναι αποθηκευμένος στο `\fulltoks` γράφεται σε ένα αρχείο μαζί με κάποιο πρόσθετο κώδικα ώστε να μετατραπεί σε ένα σωστά διαμορφωμένο $$\mathrm\LaTeX$$ αρχείο. Τα επόμενα βήματα είναι:

1. Επεξεργαστείτε το `.tex` αρχείο που περιέχει τον πίνακά μας με το $$\text{pdf}\mathrm\LaTeX$$ (σε λειτουργία DVI) ώστε να στοιχειοθετήσει τον πίνακα και να δημιουργήσει ένα `.dvi` αρχείο για να το επεξεργαστεί το `dvisvgm` . Ναι, μπορείτε να χρησιμοποιήσετε το $$\text{Lua}\mathrm\TeX$$ για να εκτελέσετε το $$\text{pdf}\mathrm\LaTeX$$—για μία ακόμη φορά χρησιμοποίησα τη μέθοδο που συζητήθηκε σε ένα [προηγούμενο άρθρο](/latex/el/se-vathos-arthra/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md).
2. Και τέλος, εκτελέστε το `dvisvgm` για να επεξεργαστεί το `.dvi` αρχείο και να δημιουργήσει ένα γραφικό SVG του στοιχειοθετημένου $$\mathrm\TeX$$ πίνακα.
3. Για να αποκτήσετε τα πραγματικά γραφικά SVG μπορείτε να κατεβάσετε ένα αρχείο ZIP από το Overleaf — φροντίζοντας να επιλέξετε τα **Αρχεία εισόδου και εξόδου** επιλογή.


---

# 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/47-tex-tables-how-tex-calculates-spanned-column-widths.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.
