Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Web Analytics
Cookie Policy Terms and Conditions Groff - Wikipedia

Groff

aus Wikipedia, der freien Enzyklopädie

Der korrekte Titel dieses Artikels lautet „groff“. Diese Schreibweise ist aufgrund technischer Einschränkungen nicht möglich.
Wikipedia:Redundanz
Redundanz
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:

  1. Ggfs. Umwandlung von PostScript Schriftart im Apple-Macintosh-Format nach Unix mit t1unmac - t1utils-1.26.
  2. Ggfs. Umwandlung der PostScript Schriftart ins ASCII Format (pfa) mittels pfbtops (Groff) bzw. pfbtopfa (GhostScript).
  3. Generieren einer Adobe Font Metric Datei (AFM) aus der ASCII-Schriftart mittels pfa2afmpfa2bdf.
  4. Umwandlung der Metrikdatei in das Groff-Fontbeschreibungsformat mittels afm2dit (Groff).
  5. Ablegen dieser Beschreibungsdatei mit einem neuen Kurznamen.
  6. 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

Andere Sprachen
Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu