💾 Archived View for magaz.hellug.gr › 09 › 03_groff › index.gmi captured on 2024-08-25 at 00:27:39. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-02-05)
-=-=-=-=-=-=-
Γιώργος Κεραμίδας(mailto:keramida@ceid.upatras.gr) Νοε 1998
Ένας από τους αρχικούς λόγους ανάπτυξης του UNIX ήταν η ανάπτυξη ενός συστήματος για την στοιχειοθεσία των κειμένων που γραφόντουσαν στα Bell Labs της AT& T. Αυτό το σύστημα ονομάστηκε αρχικά roff από την φράση run off, μετά ονομάστηκε nroff όταν προσαρμόστηκε να βγάζει έξοδο για πολλά τερματικά, και τέλος troff όταν προσαρμόστηκε ξανά για να τυπώνει typesetter. Όλα τα manual pages του UNIX γράφονται σύμφωνα με μια πολύ παλιά παράδοση σε troff, και η Free Software Foundation δεν μπορούσε να αφήσει τους χρήστες του Free Software παραπονεμένους! Έτσι φτιάχθηκε το groff, το οποίο μπορεί κάλλιστα να χρησιμοποιηθεί για να γραφτούν ελληνικά κείμενα. Ας δούμε όμως πως...
1. ΕΙΣΑΓΩΓΗ
2. ΓΡΑΦΟΝΤΑΣ ΑΠΛΑ ΚΕΙΜΕΝΑ ΣΤΟ GROFF
3. ΕΛΛΗΝΙΚΟΙ ΧΑΡΑΚΤΗΡΕΣ
4. ΟΙ ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ ΤΟΥ GROFF
5. ΟΙ ΑΛΛΑΓΕΣ ΠΟΥ ΧΡΕΙΑΖΟΝΤΑΙ
6. ΚΑΝΟΥΜΕ ΤΙΣ ΑΛΛΑΓΕΣ
7. ΔΟΚΙΜΑΖΟΥΜΕ ΤΑ ΕΛΛΗΝΙΚΑ
8. ΒΙΒΛΙΟΓΡΑΦΙΑ
Όταν το UNIX ήταν ακόμα σε πειραματικό στάδιο, φτιάχθηκε από τον J. F. Ossana σε assembly για PDP/11! Η αρχική έκδοση ξαναγράφτηκε αργότερα σε C από τον Brian W. Kernighan (ναι, τον ΕΝΑ και ΜΟΝΑΔΙΚΟ Kernighan εννοώ, που έφτιαξε μαζί με τον ΑΦΘΑΣΤΟ Dennis M. Ritchie την ΤΕΛΕΙΑ γλώσσα, την C) για να τρέχει στο "καινούριο" λειτουργικό σύστημα που τότε εμφανιζόταν δειλά δειλά, το UNIX. Υπάρχει μάλιστα κι ένα ανέκδοτο(;) που λέει πως όταν κάποτε η AT& T σκεφτόταν να σταματήσει το project του UNIX, η τότε πρώτη μορφή του troff, που άκουγε στο όνομα roff, ήταν ο μοναδικός λόγος που δεν έσβησε το UNIX από προσώπου γης!
Κάποιος manager του project είδε το troff, και την έξοδο που τότε έβγαζε στον θρυλικό CA/T typesetter, και ξετρελλάθηκε. Κράτησε το project του UNIX μόνο και μόνο για να συνεχίσει να αναπτύσσεται μαζί με το UNIX και το troff, τόσο πολύ του άρεσε. Ίσως από 'κει να ξεκίνησε κι η παράδοση τα manuals του UNIX να γράφονται σε troff. Όπως και νά 'χει πάντως το πράγμα, η αλήθεια είναι ότι η παράδοση να γράφονται τα εγχειρίδια του UNIX σε troff είναι τόσο παλιά που κανείς πια δεν πρέπει να θυμάται πως ξεκίνησε.
Η Free Software Foundation, με σαφή προτίμηση προς τις πιο εξελιγμένες δυνατότητες του TeX, έφτιαξε το δικό της format, με το όνομα Texinfo. Παρόλ' αυτά, ένα από τα καλύτερα προγράμματα της FSF είναι ο groff, που δεν είναι τίποτα άλλο από μια καινούρια έκδοση του troff με πιο πολλά (και καλύτερα πολλές φορές) macro sets, κτλ.
Με την γνωστή πια επεκτασιμότητα που χαρακτηρίζει τα προγράμματα της GNU, ο groff υποστηρίζει όλους τους 8-bit χαρακτήρες. Αλλά οι απλές εγκαταστάσεις του δεν έχουν υποστήριξη 8-bit χαρακτήρων για λόγους μεταφερσιμότητας.
Ένα από τα formats εξόδου του groff είναι και το απλό ASCII κείμενο. Εδώ θα περιγράψουμε τι μπορείτε να κάνετε σε μια απλή εγκατάσταση του groff, για να κάνετε τον groff να "καταλαβαίνει" ελληνικά (κι άλλες γλώσσες), τουλάχιστον για την έξοδο απλού κειμένου.
Το να γράψει κανείς ένα κείμενο στο groff δεν είναι πολύ δύσκολο. Απλά δημιουργεί ένα αρχείο με το κείμενό του, και τρέχει το groff όταν θέλει να μορφοποιήσει το κείμενο για να το τυπώσει ή να το δει στην οθόνη του.
Για παράδειγμα, μπορείτε να γράψετε σε ένα αρχείο το κείμενο
Αυτό είναι ένα μικρό κείμενο γραμμένο σε ένα επίσης μικρό αρχείο.
Αν σώσετε αυτό το κείμενο σε ένα αρχείο με το όνομα small.tr και τρέξετε το groff με την εντολή
groff -Tascii small.tr
μπορείτε να δείτε μια όμορφα στοιχισμένη μορφή του αρχικού κειμένου. Αν για κάποιο λόγο το κείμενο δεν χωράει στην οθόνη σας, και οι πρώτες γραμμές χάνονται, γράψτε:
groff -Tascii small.tr | less -r
Το -Tascii είναι μια παράμετρος που λέει στο groff να μην βγάλει PostScript έξοδο που είναι το προκαθορισμένο, αλλά έξοδο απλού κειμένου. Αυτό είναι ένα μικρό μόνο δείγμα του τι μπορεί να κάνει το groff. Για περισσότερες πληροφορίες για το groff, βλ. το τέλος αυτού του κειμένου στο τμήμα ΒΙΒΛΙΟΓΡΑΦΙΑ.
Αν το groff σας δεν υποστηρίζει σε ascii output όλους τους 8-bit χαρακτήρες η παραπάνω εντολή θα αποτύχει βγάζοντας πολλά μηνύματα του τύπου:
groff:small.tr:1: illegal character ` 384'
που σημαίνει ότι το groff συνάντησε στο αρχείο εισόδου του (που αυτή τη στιγμή είναι το small.tr) στην γραμμή 1, κάποιο χαρακτήρα που δεν μπορεί να τον ``αναγνωρίσει''.
Το groff όπως έρχεται από την FSF σε μορφή πηγαίου κώδικα είναι ένα πρόγραμμα που μπορεί να δεχτεί 8-bit χαρακτήρες στην είσοδό του. Διαβάζουμε στο manual του groff_font:
Groff supports eight bit characters; however some utilities has difficulties with eight bit charac ters.
δηλαδή
Το groff υποστηρίζει 8-bit χαρακτήρες! Όμως κάποια προγράμματα έχουν δυσκολίες με τους 8-bit χαρακτήρες...
Αυτός είναι κι ο λόγος που οι προκαθορισμένες γραμματοσειρές του groff δεν περιλαμβάνουν τους χαρακτήρες που βρίσκονται πάνω από τον ASCII-127 (DEL). Οι ελληνικοί χαρακτήρες όμως βρίσκονται ακριβώς σε αυτή την περιοχή, και το groff δεν τους αναγνωρίζει. Γι' αυτό και βγάζει τα μηνύματα `invalid character...' που είδαμε πιο πάνω.
Οι ελληνικοί χαρακτήρες βρίσκονται στην υψηλή περιοχή του extended ASCII σετ χαρακτήρων, πάνω από τον χαρακτήρα ASCII 127 (DEL). Μάλιστα το σετ χαρακτήρων του MS-DOS ξεκινάει ακριβώς πάνω από το 127, στον χαρακτήρα 128, που αντιστοιχεί το ελληνικό κεφαλαίο 'Α'.
Όταν είστε σε κατάσταση κειμένου στην κονσόλα του Linux σας, το παρακάτω μικρό πρόγραμμα θα σας δείξει την γραμματοσειρά που εκείνη τη στιγμή χρησιμοποιείται αν το τρέξετε.
/* ascii.c - εκτύπωση του ascii character set στην κονσόλα * ενός linux μηχανήματος * * Ειδική μεταχείριση γίνεται στους μη εκτυπώσιμους * χαρακτήρες και στον escape χαρακτήρα (128+27) που * χρησιμοποιεί ο console driver του Linux. */ #include <stdio.h> int main (void) { int i; for (i = 0; i < 256; i++) { if ((i & 15) == 0) printf("0x%02x: ", i); printf((isprint(i) || i > 127 && i != (128+27)) ? " %c %c" : "%03o%c", i, ((i % 16) == 15) ? '0 : ' '); } return 0; }
Μεταγλωττίστε το πρόγραμμα αυτό με μια εντολή όπως
gcc ascii.c
και τρέξτε το με την εντολή a.out
Θα δείτε τους ελληνικούς χαρακτήρες στις θέσεις πάνω από 0x80, που είναι το extended σετ χαρακτήρων ASCII.
Το groff κρατάει τις γραμματοσειρές του στον κατάλογο /usr/share/groff/font (και τα macros του στον κατάλογο /usr/share/groff/tmac).
Στον κατάλογο /usr/share/groff/font υπάρχουν υποκατάλογοι για κάθε μορφή εξόδου που υποστηρίζει το groff. Οι διάφορες μορφές εξόδου, όπως PostScript, ascii, laser jet-4, κτλ. στον groff λέγονται και συσκευές εξόδου, όπως και στον troff. Γι' αυτό και στον κατάλογο /usr/share/groff/font οι υποκατάλογοι των συσκευών αρχίζουν με το string dev. Για παράδειγμα, ο υποκατάλογος με τις γραμματοσειρές για ascii output λέγεται devascii, ο υποκατάλογος με τις γραμματοσειρές για PostScript output λέγεται devps, κτλ.
Στον υποκατάλογο devascii που μας ενδιαφέρει για το ascii output, υπάρχουν τα εξής αρχεία:
Καθένα από τα αρχεία που καθορίζουν το σετ χαρακτήρων μιας γραμματοσειράς έχουν μια συγκεκριμένη μορφή, που περιγράφεται λεπτομερώς στο manual page του groff_font.
Στο τέλος κάθε αρχείου υπάρχει ένας πίνακας που κάθε γραμμή του αρχείου αποτελεί μια καταχώριση στον πίνακα. Οι γραμμές έχουν την μορφή
όνομα μετρικές τύπος κωδικός σχόλιο
και περιγράφουν ένα χαρακτήρα του σετ η κάθε μια.
Διαβάζοντας το manual του groff_font βλέπουμε πως το όνομα ενός χαρακτήρα μπορεί να είναι είτε ο ίδιος ο χαρακτήρας, είτε το string "charXXX" όπου XXX ο αριθμός του χαρακτήρα στο extended ASCII σετ χαρακτήρων.
Οι μετρικές είναι για όλους τους χαρακτήρες ίδιες σε έξοδο απλού κειμένου (ο αριθμός 24 είναι το πλάτος του χαρακτήρα σε device units, την μικρότερη μονάδα μέτρησης που υποστηρίζει το groff).
Ο τύπος είναι επίσης ο ίδιος για όλους τους χαρακτήρες σε έξοδο απλού κειμένου. Από τους πρώτους χαρακτήρες του σετ χαρακτήρων βλέπουμε ότι η τιμή του είναι 0 για όλες τις γραμματοσειρές του devascii.
Ο κωδικός του χαρακτήρα είναι ο αριθμός του χαρακτήρα που θα βγάζει στην έξοδό του το groff όταν δει στην είσοδο τον χαρακτήρα με το συγκεκριμένο όνομα. Αυτό συνήθως είναι το ίδιο με το όνομα, και μπορεί να γραφτεί είτε σαν δεκαδικός αριθμός, είτε σαν οκταδικός η δεκαεξαδικός.
Μετά από τις προηγούμενες παραγράφους, είναι φανερό πως αν στις γραμματοσειρές του groff προσθέσουμε τις γραμμές που χρειάζονται για τους 8-bit χαρακτήρες, θα μπορούμε να δουλέψουμε στο groff, χρησιμοποιώντας τουλάχιστον το ascii output device.
Αλλά πως είναι αυτές οι γραμμές; Στην προηγούμενη παράγραφο (Οι Γραμματοσειρές του GROFF) είδαμε ότι μπορούν να είναι της μορφής:
charXXX 24 0 YYY
όπου το XXX είναι ο δεκαδικός αριθμός του χαρακτήρα στο ASCII, και YYY είτε ο ίδιος ο χαρακτήρας, είτε ο αριθμός του σε οκταδικό, δεκαεξαδικό, κτλ.
Αυτή η γραμμή πρέπει να γραφτεί για όλους τους αριθμούς χαρακτήρα, από 128 έως και 255 (που είναι το υψηλό μέρος του ASCII σετ χαρακτήρων).
Με το μικρό Perl script που βλέπουμε παρακάτω, μπορείτε να κάνετε αυτή ακριβώς τη δουλειά, χωρίς να τρελλαθείτε στο γράψιμο και μετά να μην είστε και σίγουροι ότι όλα δουλεύουν.
#! /usr/bin/perl -w ## greek.pl -- ελληνικοί χαρακτήρες για το ## devascii device του groff foreach $i (128 .. 255) { printf "char%d2400%03o0, $i, $i; }
το οποίο αν το τρέξετε γράφει στην έξοδό του:
char128 24 0 0200 char129 24 0 0201 char130 24 0 0202 ... πολλές γραμμές ακόμα ... char254 24 0 0376 char255 24 0 0377
Οι γραμμές που δημιουργεί αυτό το script πρέπει να προστεθούν σε όλα τα αρχεία που ορίζουν το σετ χαρακτήρων του ascii device. Ας δούμε όμως πως μπορεί να γίνει αυτό.
Οι αλλαγές που χρειάζεται να γίνουν στα αρχεία του καταλόγου /usr/share/groff/font/devascii είναι απλές, αλλά καλό είναι να κρατήσετε πρώτα ένα backup των αρχείων.
Κάντε login σαν root και τρέξτε τις εντολές:
cd /usr/share/groff/font tar cvf - devascii | gzip -9c -> devascii.tar.gz
Τώρα υπάρχει ένα αρχείο με το πολύ περιγραφικό όνομα στον κατάλογο `/usr/share/groff/font'. Αυτό περιέχει τις αρχικές γραμματοσειρές του groff, έτσι ώστε σε περίπτωση που κάτι πάει στραβά να μπορείτε να επαναφέρετε την εγκατάσταση του groff σας σε μια κατάσταση που δουλεύει!
Αντιγράψτε τον κώδικα του greek.pl που φαίνεται παραπάνω σε ένα αρχείο μέσα στον κατάλογο `/usr/share/groff/font/devascii'.
Τρέξτε δοκιμαστικά το script με την εντολή
perl greek.pl
Αν το πρόγραμμα βγάλει την αναμενόμενη έξοδο (δείτε παραπάνω) τότε μπορείτε να εκτελέσετε τις εντολές:
perl greek.pl >> R perl greek.pl >> I perl greek.pl >> B perl greek.pl >> BI
ΠΡΟΣΕΞΤΕ ΤΟ ΔΙΠΛΟ ">>" ΣΤΙΣ ΕΝΤΟΛΕΣ ΠΑΡΑΠΑΝΩ!
Η έξοδος του greek.pl πρέπει να γραφτεί στο τέλος των γραμματοσειρών, κι όχι να τις κάνει overwrite!
Για να δοκιμάσετε τα ελληνικά στο groff σας μετά από όλα αυτά, μπορείτε να γράψετε το παράδειγμα που είδαμε στην παράγραφο 2 (ΓΡΑΦΟΝΤΑΣ ΑΠΛΑ ΚΕΙΜΕΝΑ ΣΤΟ GROFF), ή να γράψετε οποιοδήποτε άλλο απλό κείμενο σε ελληνικά, περνώντας το ύστερα από το groff με μια εντολή όπως:
groff -Tascii αρχείο_εισόδου | less -r
για να δείτε αν τα ελληνικά εμφανίζονται σωστά.
Εννοείται πως αν η κονσόλα σας δεν δείχνει σωστά τα ελληνικά γιατί δεν έχετε κατάλληλη γραμματοσειρά, δεν φταίει το groff, σωστά; Αλλά μην ανησυχείτε, μπορείτε να στήσετε το greek-console και όχι μόνο να δείτε αλλά τα ελληνικά σας κείμενα, αλλά να γράψετε και καινούρια.
[1] Writing Papers with GROFF using -me, Eric P. Allman, Modified for GROFF by James Clark. [2] Typing Documents on the UNIX System: Using the -ms Macros with Troff and Nroff. M. E. Lesk, November 3, 1978. [3] Troff User's Manual. Joseph F. Ossanna, Brian W. Kernighan. <tt/AT& T/ Bell Labs, Murray Hill, NJ 07974. Revised edition, November 1992. [4] A Troff Tutorial. Brian W. Kernighan. August 1978.