Formeln setzen mit groff ======================== Immer wieder kommt es vor, dass man mathematische Formeln in Webseiten einbetten muss. MathML wäre hierfür eigentlich die ideale Beschreibungssprache, wenn – und hier liegt wie immer das große Problem – alle Browser MathML-Formeln auch rendern könnten. Der Internet Explorer braucht hierfür ein Plugin und auf Gecko basierende Browser wie zum Beispiel Firefox müssen erst eine spezielle Schriftart installieren. Also muss eine andere Lösung gefunden werden. Bilder kann (fast) jeder Browser anzeigen und sie sehen, was bei mathematischen Formeln wichtig sein kann, überall gleich aus. Aber wie bekommt man eine Formel in ein Bild? TeX ist die eine Möglichkeit, aber ich möchte hier eine andere vorstellen: ``groff``. Genauer gesagt GNU ``troff`` und dessen Filter ``eqn``. Beide sind normalerweise auf jedem Linux-System installiert, denn ``groff`` ist auch verantwortlich für das Formatieren der sogenannten „man-pages“. Da ``groff`` auf direktem Wege keine Bilder erstellen kann, ist außerdem ein Programm nötig, das Postscript-Daten interpretieren und rendern kann. Ich benutze das freie „Ghostscript“ dafür. Wie setzt man nun Formeln mit ``groff``? Zunächst einmal braucht man eine Formel, wie zum Beispiel E = mc\ `2`:sup:. Die Syntax [#]_ von ``eqn`` ist in diesem Beispiel recht einfach: .. code-block:: groff .EQ E = mc sup 2 .EN ``.EQ`` und ``.EN`` sind Makrobefehle, die ``groff`` dazu veranlassen den Inhalt dazwischen an das Filterprogramm ``eqn`` weiterzureichen. Diesen Text kann man nun, zum Beispiel via Pipe (``|``), an ``groff`` übergeben, wie das folgende Shell-Skript demonstriert: .. code-block:: sh form=" .EQ E = mc sup 2 .EN " echo "$form" | groff -e -T ps Der Parameter ``-e`` veranlasst ``groff`` dazu ``eqn`` als Filter zu benutzen. ``-T ps`` schaltet auf Postscript-Ausgabe um. Dieser Parameter kann aber auch entfallen, da ``groffs`` Standardausgabeformat bereits Postscript ist. Die Formel ist nun gesetzt und wird als Postscript-Dokument auf der Standardausgabe erscheinen. Um daraus eine Bilddatei, zum Beispiel eine PNG-Grafik, zu machen, muss man ``groffs`` Ausgabe an ``gs`` weiterleiten: .. code-block:: sh echo "$form" | groff -e -T ps | gs -r120 -dSAFER -sDEVICE=pnggray \ -dTextAlphaBits=4 -sOutputFile="ausgabe.png" - ``-r`` setzt die Anzahl der Bildpunkte pro Inch (DPI), was die Größe des Bildes beeinflusst. ``-sDEVICE=pnggray`` ändert den Ausgabetyp auf „PNG-Bild, Graustufen“ und ``-dTextAlphaBits=4`` die Qualität des gerenderten Textes, wobei hier immer der Maximalwert „4“ eingetragen werden sollte. Das ``-`` am Ende der Zeile ist wichtig, da es ``gs`` mitteilt, dass es seine Daten von der Standardeingabe (also über die Pipe) beziehen soll. ``ausgabe.png`` enthält nun eine PNG-Grafik mit der Größe einer A4-Seite. „ImageMagick“ kann das Ausschneiden der Formel übernehmen: .. code-block:: sh convert -trim "ausgabe.png" "ausgabe2.png" Fertig: |E_mc2| .. |E_mc2| image:: ../../media/00/18/e_mc2.png :alt: E = mc sup 2 .. [#] Eine Übersicht über die Syntax bietet `„Typesetting Mathematics – User’s Guide“`__ (Postscript-Dokument) __ http://www.kohala.com/start/troff/v7man/eqn/eqn2e.ps