Textsatz in Groff mit Pdfmom

  Nick   Lesezeit: 4 Minuten  🗪 5 Kommentare Auf Mastodon ansehen

Zum Textsatz mit Typst wurde hier neulich ein Template vorgestellt. Es gibt unter der gleichen Quelle ebenfalls ein Template für "Groff", insbesondere mit dem Makropaket "mom".

textsatz in groff mit pdfmom

Was ist denn nun „Groff“ schon wieder?

Groff ist die GNU-Version von troff, einem „Textsatzsystem“ von AT&T für Unix. Troff wiederum hat seinen Ursprung in einem Textverarbeitungsprogramm namens „RUNOFF“ von ca. 1965, man kann sich also vorstellen, auf was für „Gerätschaften“ das seinerzeit lief, bis es dann unter Unixoiden zum Einsatz kam.

Tatsächlich wirken die Dinge oberflächlich betrachtet etwas „antiquiert“, aber irgendwie doch auch elegant. Die Dokumentation liest sich ebenfalls etwas „spröde“, aber womöglich kann hier der Einstieg etwas erleichtert werden.

Der vorliegende Beitrag ist ein „Nebenprodukt“ meiner bisherigen Bemühungen. Anfangs hatte ich mich an einem QR-Code abgearbeitet, der sich als PDF einfach nicht einbinden ließ. Gelegen hatte es dann an der „BoundingBox“. Mit

qrencode ... | ps2pdf -dEPSCrop ...

und dem, was hinten rauskommt, klappt es problemlos.

Meine Ausführungen beschränken sich auf die PDF-Erzeugung mit den mom-Makros über das Werkzeug „pdfmom“ (Anm.: Analog wären das wohl im „LaTeX“-Kontext Tex, LaTeX oder pdflatex).

Die benötigten Werkzeuge dürften auf (fast) allen Systemen vorhanden sein. In den meisten Fällen muss exakt gar nichts zusätzlich installiert werden. Im Nachlauf zu meinem letzten Beitrag hatte sich jemand über zu umfangreiche LaTeX-Installationen beklagt, und u. a. ist auch die „Klammersetzung“ mit Groff recht „übersichtlich“.

Auch mit Groff/mom gibt es eine „Präambel“

Die „Präambel“ – sofern es denn eine gibt – endet mit dem Befehl .START, also an demjenigen Punkt, an dem es mit dem eigentlichen Dokument losgeht. Makros beginnen stets mit einer neuen Zeile und einem Punkt vor dem jeweiligen Makro in Großbuchstaben.

PRINTSTYLE TYPESET legt fest, dass der Text nicht „typewritten“ erscheinen soll, und die Angabe muss vor allen anderen Angaben gesetzt werden, also gleich hinter dem Titel.

Die Präambel ist weitgehend selbsterklärend

Befehle können mit \# auskommentiert werden, und Argumente, die hinter ihren jeweiligen Makros in derselben Zeile stehen müss(t)en, können bedarfsweise mit \ umgebrochen werden. Es gibt ferner einige andere Befehle, die ggf. –zwingend– vor dem START-Makro stehen müssen, aber eben nicht ganz so weit oben wie PRINTSTYLE TYPESET.

Als Bilder eingebundene PDF-Dateien werden im Beispiel automatisch nummeriert (AUTOLABEL_IMAGES). Eine Besonderheit wäre, dass die Abbildungs-, Literatur- und sonstigen Verzeichnisse ganz am Schluss kommen, also etwa so (Gleichungs- und Tabellenverzeichnis hier auskommentiert):

.TOC
.LIST_OF_FIGURES TITLE_STRING "Verzeichnis der Abbildungen" START_PAGENUM 1
\#.LIST_OF_EQUATIONS TITLE_STRING "Verzeichnis der Gleichungen"
\#.LIST_OF_TABLES TITLE_STRING "Tabellenverzeichnis"

Hier gilt: Wenn man dies nun – wie gewohnt – am Anfang hinter dem Titelblatt haben will, so muss das in der Präambel kenntlich gemacht werden, und zwar mit .AUTO_RELOCATE_TOC AFTER_COVER, womit alle der (aktiven) Verzeichnisse gemeint sind.

Wer seinen Text nicht in zwei Spalten haben will (wie hier im Artikelbild), der kommentiert das ggf. in der Präambel aus, oder spezifiziert es erst gar nicht. Eine Übersicht zu den „mom“ Makros findet sich unter www.schaffter.ca/mom/momdoc/toc.html.

Text, Bilder, Querverweise und Co.

Eine umfassende Darstellung der „Makros“ im Praxiseinsatz kann hier natürlich nicht geleistet werden. Es sollte aber klar geworden sein, dass „links am Zeilenrand“ die Makros eingeleitet werden, und der Text selbst dann gewissermaßen „noch linksbündiger als ohnehin“ ist, was man ganz gut an der Eingabe der Fußnoten in den Fließtext sieht.

Links der Quelltext und rechts das gerenderte PDF:

Die Erzeugung des PDF als Endergebnis

Es gibt bestimmte „Präprozessoren“ (unten im Skript -R, -t oder -e), die für die Erzeugung hinzugeschaltet werden können oder gar müssen, und man kann den ganzen Kram natürlich auch in ein Skript einbauen. Die jeweilige Bedeutung der „Präprozessoren“ steht im Kommentar, hier also Literaturangaben, Gleichungen und Tabellen:

Der Aufruf von „pdfmom“, hier als Schleife:

Auch Briefe können erzeugt werden:

Schlussbetrachtung

Bis letzte Woche kannte ich Groff selbst quasi nur vom Hörensagen. Als „Allzweckwaffe“ werde ich es vermutlich nicht verwenden. Solange man aber weiß, wofür, stellt es auch heute noch eine ernsthafte Alternative dar, und es wird auch weiterhin gepflegt.

Alternativlos gegenüber den anderen „Alternativen“, die einem – neben Markdown/Pandoc, Typst, LaTeX usw. – einfallen mögen, ist es natürlich nicht. Mit geeigneten Vorlagen kann aus Markdown fast alles werden.

Quellen:

Tags

Textsatz, Groff, Pdfmom, Markdown, Typst

tux0r
Geschrieben von tux0r am 5. Februar 2026 um 11:55

groff ist meiner Meinung nach das deutlich weniger nervige LaTeX (unter anderem, weil es selbst mit allen Abhängigkeiten auf zwei Disketten passt und nicht - wie LaTeX - mehrere GB vollmachen kann). Vor einer Weile habe ich mit groffstudio da auch ein (rudimentäres) GUI veröffentlicht. Vielleicht braucht das ja wer.

ubu
Geschrieben von ubu am 5. Februar 2026 um 12:30

Kleine Anmerkung,

die Linux Manpages sind in groff geschrieben, die roff Dateien liegen mit gzip komprimiert unter /usr/share/man/SPRACHE/SECTION/

der man Befehl kann mit man -Tpdf BEFEHL > BEFEHL.pdf eine PDF Datei erzeugen, HTML ist natürlich ebenso möglich (Die MacOS Version von man unterstützt dies noch nicht)

fr
Geschrieben von fr am 6. Februar 2026 um 11:06

> der man Befehl kann mit man -Tpdf BEFEHL > BEFEHL.pdf eine PDF Datei erzeugen ...

Bei mir funktioniert das nur über den PostScript-Umweg und "ps2pdf ". Ich hatte mir dazu mal eine Alias-Funktion erstellt (Bspl.: manp cat), mit der auch gleich die Pdf-Datei mit dem gewünschten Pdf-Viewer (in meinem Fall "Papers") geöffnet wird. Die temporär erzeugte Pdf-Datei wird nach dem Schließen des Viewers dann wieder gelöscht:

manp(){
  pdfviewer=papers;
  tmpdir="/home/BENUTZERNAME/pfad/zum/tempverzeichnis/man-to-pdf/";
  tmpfile="$tmpdir/tmp.pdf";

  if [ ! -d "$tmpdir" ]; then mkdir "$tmpdir"; fi;
  man -Tps "$1" | ps2pdf - - > "$tmpfile" && "$pdfviewer" "$tmpfile" && rm "$tmpfile";
}
Naja
Geschrieben von Naja am 6. Februar 2026 um 19:02

Kleiner Tipp, deine beiden Zeilen für das tmpfile kannst du dir mit 'mktemp' einfacher machen, siehe dessen manpage.

In Linux gibt es für fast alles schon ein kleines Tool. :-)

kaligule
Geschrieben von kaligule am 8. Februar 2026 um 03:14

Wirklich gut, vielen Dank. Ich hatte von groff gehört, dachte aber das es bestimmt sehr kompliziert sei und habe es nie ausprobiert.