302 γραμμές
22 KiB
Markdown
302 γραμμές
22 KiB
Markdown
|
+++
|
|||
|
title = 'Γράφοντας Ελληνικά στο GROFF'
|
|||
|
date = '1998-11-01T00:00:00Z'
|
|||
|
description = ''
|
|||
|
author = 'Γιώργος Κεραμίδας(mailto:keramida@ceid.upatras.gr)'
|
|||
|
issue = ['Magaz 09']
|
|||
|
issue_weight = 3
|
|||
|
+++
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
*Ένας από τους αρχικούς λόγους ανάπτυξης του 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. ΒΙΒΛΙΟΓΡΑΦΙΑ**
|
|||
|
-------------------------------------------
|
|||
|
|
|||
|
|
|||
|
### [1. ΕΙΣΑΓΩΓΗ]{#s1}
|
|||
|
|
|||
|
Όταν το 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 να \"καταλαβαίνει\" ελληνικά (κι άλλες γλώσσες), τουλάχιστον για την έξοδο απλού κειμένου.
|
|||
|
|
|||
|
|
|||
|
### [2. ΓΡΑΦΟΝΤΑΣ ΑΠΛΑ ΚΕΙΜΕΝΑ ΣΤΟ GROFF]{#s2}
|
|||
|
|
|||
|
Το να γράψει κανείς ένα κείμενο στο 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\...\'
|
|||
|
που είδαμε πιο πάνω.
|
|||
|
|
|||
|
|
|||
|
### [3. ΕΛΛΗΝΙΚΟΙ ΧΑΡΑΚΤΗΡΕΣ]{#s3}
|
|||
|
|
|||
|
Οι ελληνικοί χαρακτήρες βρίσκονται στην υψηλή περιοχή του 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.
|
|||
|
|
|||
|
|
|||
|
### [4. ΟΙ ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ ΤΟΥ GROFF]{#s4}
|
|||
|
|
|||
|
Το 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, υπάρχουν τα εξής αρχεία:
|
|||
|
|
|||
|
- DESC αρχείο με περιγραφή του συγκεκριμένου output device
|
|||
|
- R το σετ χαρακτήρων της Roman γραμματοσειράς
|
|||
|
- I το σετ χαρακτήρων της Italic γραμματοσειράς
|
|||
|
- B το σετ χαρακτήρων της Bold γραμματοσειράς
|
|||
|
- BI το σετ χαρακτήρων της Bold-Italic γραμματοσειράς
|
|||
|
|
|||
|
Καθένα από τα αρχεία που καθορίζουν το σετ χαρακτήρων μιας γραμματοσειράς έχουν μια συγκεκριμένη μορφή, που περιγράφεται λεπτομερώς στο manual page του
|
|||
|
groff\_font.
|
|||
|
|
|||
|
Στο τέλος κάθε αρχείου υπάρχει ένας πίνακας που κάθε γραμμή του αρχείου αποτελεί μια καταχώριση στον πίνακα. Οι γραμμές έχουν την μορφή
|
|||
|
|
|||
|
όνομα μετρικές τύπος κωδικός σχόλιο
|
|||
|
|
|||
|
και περιγράφουν ένα χαρακτήρα του σετ η κάθε μια.
|
|||
|
|
|||
|
Διαβάζοντας το manual του groff\_font βλέπουμε πως το όνομα ενός χαρακτήρα μπορεί να είναι είτε ο ίδιος ο χαρακτήρας, είτε το string \"charXXX\" όπου XXX ο
|
|||
|
αριθμός του χαρακτήρα στο extended ASCII σετ χαρακτήρων.
|
|||
|
|
|||
|
Οι μετρικές είναι για όλους τους χαρακτήρες ίδιες σε έξοδο απλού κειμένου (ο αριθμός 24 είναι το πλάτος του χαρακτήρα σε device units, την μικρότερη μονάδα
|
|||
|
μέτρησης που υποστηρίζει το groff).
|
|||
|
|
|||
|
Ο τύπος είναι επίσης ο ίδιος για όλους τους χαρακτήρες σε έξοδο απλού κειμένου. Από τους πρώτους χαρακτήρες του σετ χαρακτήρων βλέπουμε ότι η τιμή του είναι 0
|
|||
|
για όλες τις γραμματοσειρές του devascii.
|
|||
|
|
|||
|
Ο κωδικός του χαρακτήρα είναι ο αριθμός του χαρακτήρα που θα βγάζει στην έξοδό του το groff όταν δει στην είσοδο τον χαρακτήρα με το συγκεκριμένο όνομα. Αυτό
|
|||
|
συνήθως είναι το ίδιο με το όνομα, και μπορεί να γραφτεί είτε σαν δεκαδικός αριθμός, είτε σαν οκταδικός η δεκαεξαδικός.
|
|||
|
|
|||
|
|
|||
|
### [5. ΟΙ ΑΛΛΑΓΕΣ ΠΟΥ ΧΡΕΙΑΖΟΝΤΑΙ]{#s5}
|
|||
|
|
|||
|
Μετά από τις προηγούμενες παραγράφους, είναι φανερό πως αν στις γραμματοσειρές του 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. Ας δούμε όμως πως μπορεί να γίνει
|
|||
|
αυτό.
|
|||
|
|
|||
|
|
|||
|
### [6. ΚΑΝΟΥΜΕ ΤΙΣ ΑΛΛΑΓΕΣ]{#s6}
|
|||
|
|
|||
|
Οι αλλαγές που χρειάζεται να γίνουν στα αρχεία του καταλόγου /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!
|
|||
|
|
|||
|
|
|||
|
### [7. ΔΟΚΙΜΑΖΟΥΜΕ ΤΑ ΕΛΛΗΝΙΚΑ]{#s7}
|
|||
|
|
|||
|
Για να δοκιμάσετε τα ελληνικά στο groff σας μετά από όλα αυτά, μπορείτε να γράψετε το παράδειγμα που είδαμε στην παράγραφο 2 (ΓΡΑΦΟΝΤΑΣ ΑΠΛΑ ΚΕΙΜΕΝΑ ΣΤΟ GROFF),
|
|||
|
ή να γράψετε οποιοδήποτε άλλο απλό κείμενο σε ελληνικά, περνώντας το ύστερα από το groff με μια εντολή όπως:
|
|||
|
|
|||
|
groff -Tascii αρχείο_εισόδου | less -r
|
|||
|
|
|||
|
για να δείτε αν τα ελληνικά εμφανίζονται σωστά.
|
|||
|
|
|||
|
Εννοείται πως αν η κονσόλα σας δεν δείχνει σωστά τα ελληνικά γιατί δεν έχετε κατάλληλη γραμματοσειρά, δεν φταίει το groff, σωστά; Αλλά μην ανησυχείτε, μπορείτε
|
|||
|
να στήσετε το greek-console και όχι μόνο να δείτε αλλά τα ελληνικά σας κείμενα, αλλά να γράψετε και καινούρια.
|
|||
|
|
|||
|
|
|||
|
### [8. ΒΙΒΛΙΟΓΡΑΦΙΑ]{#s8}
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
[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.
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|