Groff
aus Wikipedia, der freien Enzyklopädie
Der korrekte Titel dieses Artikels lautet „groff“. Diese Schreibweise ist aufgrund technischer Einschränkungen nicht möglich. |
Die Artikel Groff und Troff überschneiden sich thematisch. Hilf mit, die Artikel besser voneinander abzugrenzen oder zu vereinigen. Die Diskussion über diese Überschneidungen findet hier statt. Bitte äußere dich dort, bevor du den Baustein entfernst. Dsdvado 14:44, 15. Feb. 2007 (CET) |
Inhaltsverzeichnis |
[Bearbeiten] Begriffserklärung
Groff ist die Implementation von troff, was für text runoff steht. Troff ist eine Markupsprache wie z. B. HTML und wurde Ende der 70er Jahre für Fotobelichter entwickelt. Daher ist der Befehlssatz dieser Sprache auch eng an die damals recht limitierte Hardware angelehnt. Ein Vorteil dadurch ist, dass selbst umfangreiche Dokumente auch auf einer längst nicht mehr aktuellen Hardware in übersichtlichen Zeiträumen übersetzt werden können, um z. B. PDF als präzise Vorschaumöglichkeit zu nutzen.
Groff und TeX sind insofern miteinander verwandt, als beide das Ziel verfolgen, qualitativ hochwertigen Textsatz zu ermöglichen. Allerdings sind die Ansätze sehr verschieden, nicht nur in der Syntax, sondern auch in der Handhabung der Programmpakete und Schriftarten.
Der Begriff troff wird in diesem Artikel als Bezeichnung für das Eingabeformat als auch für das eigentliche Übersetzungsprogramm verwendet. Groff ist das komplette Programmpaket. Sowohl troff als auch groff werden normalerweise klein geschrieben, in Anlehnung an den englischen Ursprung.
[Bearbeiten] Historie
Fotobelichter funktionierten damals mit Schablonen der einzelnen Zeichen. Eine Lichtquelle hat durch eine zweckmäßige Anordnung von Linsen und der Zeichenschablone einen Film belichtet, Buchstabe für Buchstabe, Zeile für Zeile. Eine andere Schriftart bedeutete das halbautomatische Austauschen der Zeichenschablonen, das Ändern des Schriftschnittes ein internes Rotieren derselben, da ein Schablonensatz immer aus einem Font mit verschiedenen Schriftschnitten bestand. Selbst heute findet sich dieses Fontmanagement noch in troff.
Troff war zu dieser Zeit eine Applikation, die innerhalb der Documenter's Workbench nur für Unix verfügbar war und darüber professionellen und qualitativ hochwertigen Textsatz erlaubte, samt Merkmalen wie automatischer Silbentrennung, Fußnoten und Inhaltsverzeichnis, um nur einige zu nennen.
[Bearbeiten] Interner Aufbau
Troff kann als Filter verstanden werden. Mit einem Editor wird ein Textdokument erstellt, welches mittels troff in ein anderes Format übersetzt wird, unter Beachtung der Anweisungen, die im Dokumententext eingebettet sind.
Die Documenter's Workbench bestand nicht nur aus troff, sondern auch aus Hilfsprogrammen, die vor dem eigentlichen troff-Aufruf als zusätzliche Filter fungierten. Diese Filterprogramme haben ihre eigene Syntax und erkennen ihren Kode im troff-Dokument anhand bestimmter Schlüsselwörter (die normalerweise genau eine Zeile umfassen) und übersetzen den Kode dazwischen in troff-Steuerbefehle (Requests).
Präprozessor | Funktion |
---|---|
tbl | Tabellensatz |
eqn | Formeln und mathematische Ausdrücke |
pic | Einfache Illustrationen und Flussdiagramme |
refer | Bibliografische Verweise |
soelim | Externe Textdateien laden, die von einem Präprozessor bearbeitet werden müssen |
Früher wurde mit dem troff-Ausgabekode direkt der Fotobelichter angesteuert. Mit dem Aufkommen anderer hochauflösender Druckmethoden (z. B. Laserdrucker) wurde troff derart umgeschrieben, dass eine Art Metakode generiert wurde, sogenanntes device independent troff, kurz ditroff. Weitere Filterprogramme generierten dann aus diesem Zwischenformat den endgültigen, gerätespezifischen Kode zur Ansteuerung.
Da die troff-Steuerbefehle teilweise komplex sind und innerhalb eines Dokumentes mehrfach vorkommen können, wurde von Anfang an die Möglichkeit der Makroerstellung vorgesehen. So können verschiedene troff-Befehle, z. B. zum Verkleinern des Fontgröße bei gleichzeitigem Ändern des linken und rechten Einzuges zu einem Makro zusammengefasst werden. Das erhöht die Übersichtlichkeit im Dokument enorm und ermöglicht ähnlich wie CSS bei HTML oder Stilvorlagen in den bekannten grafischen Textverarbeitungen eine zentralisierte Formatstruktur, die bei Anpassungen einmal geändert werden muss und so Änderungen überall im Dokument vermeidet.
Parallel zu troff gibt es noch nroff, welches den reinen Text mit rudimentären Formatierungen zum Anzeigen auf zeichenorientierten Geräten wie Terminals, Typenraddruckern, Matrixdruckern (ohne Grafikmöglichkeiten) u. Ä. ausgeben kann. In der groff-Implementation ist nroff dasselbe wie troff, d. h., es wird das gleiche Zwischenformat ausgegeben, jedoch ein spezieller Treiber (grotty) für die Textausgabe benutzt.
[Bearbeiten] GNU troff: groff
In Anlehnung an troff und die Documenter’s Workbench wurde innerhalb des GNU-Projektes troff von James Clark neu geschrieben, sodass keine Copyrightprobleme mit dem alten, proprietären Code zu erwarten sind. Groff wird kontinuierlich weiterentwickelt.
Das Ditroff-Zwischenformat wurde beibehalten, allerdings mit einigen Erweiterungen. Es stehen unter Anderem Treiber für PostScript, PCL und DVI zu Verfügung; ebenso kann man direkt HTML erzeugen als auch formatierte Textdateien.
Da die meisten troff-Befehle ähnlich wie bei TeX äußerst primitiv sind, liegen groff einige sogenannte Makropakete bei, die dem Benutzer Alltagsaufgaben erleichtern sollen. So gibt es z. B. die Pakete Mom, Me, Mm und Ms für Dokumente, Doc und Man für Manpages. Diese werden beim Aufruf von groff auf der Kommandozeile entsprechend mitgeladen und ermöglichen so dem Benutzer, mit nur einer vergleichsweise kurzen Lernphase typografisch gut gestaltete Dokumente zu schreiben.
[Bearbeiten] Groff und (eigene) Fonts
Für jedes Ausgabegerät von Groff gibt es in (üblicherweise) ein Verzeichnis in /usr/share/groff/<version>/font, benannt nach dem Muster devgerät (z. B. devps, devlj4, …). Anders als bei TeX werden bei Groff keine Schriftarten für das jeweilige Ausgabegerät optimiert in Pixeldaten umgewandelt.
Im Beispiel devps liegen Beschreibungsdateien mit dem Kurznamen der Schriftarten, in welchen die geometrischen Daten der referenzierten Schriftart (Zeichenbreiten, Kerningpaare, Ligaturen, Zeichenzuordnungen) usw. aufgeführt werden. Üblicherweise liegen hier Standardschriftarten vor, die jedes PostScript fähige Ausgabegerät schon eingebaut hat. Es besteht aber die Möglichkeit, eigene PostScriptTyp 1 Schriftarten einzubinden:
- Ggfs. Umwandlung von PostScript Schriftart im Apple-Macintosh-Format nach Unix mit t1unmac - t1utils-1.26.
- Ggfs. Umwandlung der PostScript Schriftart ins ASCII Format (pfa) mittels pfbtops (Groff) bzw. pfbtopfa (GhostScript).
- Generieren einer Adobe Font Metric Datei (AFM) aus der ASCII-Schriftart mittels pfa2afm – pfa2bdf.
- Umwandlung der Metrikdatei in das Groff-Fontbeschreibungsformat mittels afm2dit (Groff).
- Ablegen dieser Beschreibungsdatei mit einem neuen Kurznamen.
- Eintragen des Schriftartnamens in der Datei download, damit das Ausgabegerät auch die tatsächlichen Fontdaten erhält. (Die ASCII Schriftart enthält eine Zeile, „internalname“, dieser Name muss in der Datei vermerkt werden.
Jetzt kann der Font mit den üblichen Befehlen geladen und referenziert werden.
[Bearbeiten] troff heute
Die Möglichkeit, reinen Plaintext auszugeben und diesen trotzdem schön zu formatieren, ist heutzutage die wohl wichtigste Funktion von groff: Das Anzeigen einer Manpage auf einem modernen Unix-System startet im Hintergrund einen nroff-Prozess, welcher die im troff-Format vorliegenden Manpages formatiert und diese an ein Textbetrachtungsprogramm (z. B. Less) weiterreicht.
Im Laufe der Zeit ist Groff – vielleicht auch in Anbetracht der gewöhnungsbedürftigen Syntax – in Vergessenheit geraten. Wenn man aber mal den sauber formatierten Output einer in PostScript übersetzten Manpage sieht, könnte das vielleicht doch ein Ansporn sein, sich ein wenig mit Groff zu beschäftigen.
Ein Beispiel: Mit dem Aufruf
man -t rmdir > rmdir.ps
erzeugt man eine PostScript-Version der Manpage für den Befehl rmdir, die man entweder mittels ps2pdf aus dem GhostScript-Paket in eine PDF-Datei konvertieren oder direkt auf einem PostScript-Drucker ausgeben kann. Da groff standardmäßig nur sogenannte Level 2-Befehle von PostScript benützt (und mit einer Kommandozeilenoption sogar nur Level 1-Befehle ausgibt), können auch ältere Drucker angesteuert werden.
[Bearbeiten] Beispiel
Hier eine typische Groff-Datei für das Me-Makropaket, die eine kurze und knappe Befehlsübersicht für den Editor vim darstellt. Zeilen, die nur aus einem Punkt in der ersten Spalte bestehen, werden ignoriert. Leere Zeilen dagegen fügen normalerweise auch in der Ausgabe eine Leerzeile ein.
.\" 9 Punkt Textgröße (Register pp) .nr pp 9 .\" 130% der Textgröße als Zeilenabstand .nr $v 130 .\" 10 Punkt Überschriftengröße (Register sp) .nr sp 10 .\" 16cm lange Zeilen, linker Rand ist default 1" (2.54cm) .ll 16c . .\" Fonts vorbereiten .fp 1 PR \" Palatino Regular .fp 2 PI \" Palatino Italic .fp 3 PB \" Palatino Bold .fp 4 PBI \" Palatino Bold Italic .fp 5 C \" Courier .fp 6 CI \" Courier Italic .fp 7 CB \" Courier Bold .fp 8 CBI \" Courier Bold Italic . .\" Kapitelüberschriften .nr sf 3 \" verwende Font 3 . .\" Kopf- und Fußleiste .nr tf 2 \" verwende Font 2 .nr tp \n(pp \" verwende Schriftgröße aus Register pp .fo ||%|| \" Fußleiste enthält zentriert die Seitenzahl . .\" Silbentrennung schön gestalten .hy 14 . . . .\" Kapitel 1 .sh 1 "Vi" .lp \" Absatz . \f2vi\f1 besitzt zwei Modi, einen Kommando- und einen Editmodus. Es gibt mehrere Möglichkeiten, vom Kommando- in den Editmodus zu gelangen, aber nur ein beherzter (mehrfachen) Druck auf die \f2esc\f1-Taste bringt einen wieder zurück in den Kommandomodus. .br \" Zeilenumbruch Wenn man überhaupt nicht mehr weiter weiß, kann \f2vi\f1 durch die Tastenkombination \f7:q!\f1 verlassen werden (ohne abzuspeichern). Manchmal ist das der sicherste Weg, bevor irgendwas strubbelig wird. .lp . .sz -1 \" reduziere Schriftgröße .nf \" schalte Formatierung ab .ta 1.75c \" setze Tabulator .\" Achtung: Es müssen echte Tabs zum Trennen der Felder benutzt werden! \f5dd\f1 Zeile löschen \f5cw\f1 Wort ändern \f5dw\f1 Wort löschen \f5x\f1 Zeichen löschen \f5\&.\f1 Letzten Befehl wiederholen \f5d$\f1 Bis Zeilenende löschen \f5c$\f1 Bis Zeilenende überschreiben \f5u\f1 Undo \f5^r\f1 Redo \f5yy\f1 Ganze Zeile kopieren \f5gg\f1 An den Dateianfang springen \f5G\f1 Zum Dateiende springen . .sp 0.5 \" Füge vertikalen Zwischenraum ein \f5o\f1 Neue Zeile unter Cursor und Insertmode \f5O\f1 Neue Zeile über Cursor und Insertmode \f5r\f1 Replacemode \f5esc\f1 Insertmode verlassen \f5:w\f1 Schreiben \f5:q!\f1 Ohne Sichern beenden \f5:x\f1 Mit Sichern beenden \f5:wq\f1 Mit Sichern beenden \f5:n\f1 Zur nächsten angegebenen Datei springen\** .(f \" starte Fußnote \** Wenn \f2vi\f1 mit mehreren Dateinamen aufgerufen wurde. .)f \" beende Fußnote \f5:N\f1 Zur vorherigen angegebenen Datei springen\** .(f \** Dieser und der vorherige Befehl können analog zu \f2q\f1 mit \f2w\f1 und \f2!\f1 kombiniert werden, damit die veränderte Datei z.\ B. vor dem Wechsel geschrieben wird. .)f \f5:%s///\f1 Regulären Ausdruck wie bei sed über ganze Datei anwenden (%) \f5:%!cmd\f1 Markierung an Shell übergeben \f5:help\f1 Hilfe einblenden \f5:hardcopy\f1 Als PostScript an \f5$PRINTER\f1 schicken . .sp 0.5 \f5v\f1 Wahlfrei zeilenweise markieren \f5V\f1 Ganze Zeile markieren \f5^v\f1 Blockweise markieren \f5y\f1 Markierung kopieren \f5x\f1 Markierung ausschneiden \f5gq\f1 Markierung neu umbrechen (falls Textbreite > 0) \f5p\f1 Einfügen (auch letzte dd-Zeile) .fi \" schalte Formatierung wieder ein .sz \" schalte zurück zur vorigen Schriftgröße .lp . Den meisten Befehlen kann eine Nummer vorangestellt werden, um anzugeben, \f2wie oft\f1 der Befehl wiederholt werden soll. Die Zahl wird beim Tippen nicht angezeigt! .br Eine Zeile am oberen Ende einer Datei, die mit einem beliebigen (Kommentar) Zeichen beginnt, danach den String \(Fcvi:\(Fo und dann Parameter, wird von \f2vi\f1 entsprechend beim Öffnen der Datei interpretiert: .(l \" starte Liste \f5# vi: textwidth=78\f1 .)l \" beende Liste setzt die Textbreite für den automatischen Umbruch auf 78 Zeichen. . .\" Ende
Diesen Text sollte man sich via Zwischenablage auf die lokale Festplatte laden und – bei installiertem Groff und GhostScript – in eine PDF-Datei übersetzen:
groff -me -ma4 vi.me | ps2pdf - vi.pdf
Zu beachten ist, dass groff standardmäßig Eingabe in der Latin-1-Kodierung erwartet. Wird obiger Kode z. B. in UTF-8 abgespeichert, muss man ihn vor dem Aufruff von groff entsprechend mit iconv oder einem ähnlichen Programm konvertieren:
iconv -f utf8 -t latin1 < Eingabedatei > Ausgabedatei
Wenn man sich parallel PDF-Datei und den Quellcode anschaut, bekommt man schnell einen ersten Eindruck von troff und der Benutzung der Me-Makros.
[Bearbeiten] Leistung
Beispiel: 773 KBytes Fließtext von groff mit dem Makropaket Me nach PDF auf typischer Hardware.
System | Zeitbedarf |
---|---|
PIV/3GHz | 5s |
Dual PIII/800 | 10s |
PI/200 | 62s |
486DX33 | 570s |
Kürzere Texte sind natürlich dementsprechend schneller übersetzt; das Beispiel ist absichtlich recht umfangreich, um einen aussagekräftigen Vergleich zu erhalten.
[Bearbeiten] Referenzen
- Groff Homepage (englisch)
- Groff Manpage: groff(1) (englisch)
- Troff Dokumentationen, auch für die einzelnen Filter wie Eqn, Tbl und Pic (englisch)
- Ausführliche Übersicht über Historie und Werdegang von Troff (englisch)
- Ein Buch zu Troff, Unix Text Processing (englisch)
- Obiges Buch in Absprache mit dem Verlag neu erfasst – als Troff-Quelltext (englisch)