Viele Benutzer des leistungsfähigen Textformatierungsprogramms TeX von Donald Knuth sind bei aller Begeisterung enttäuscht von den schwachen Möglichkeiten, Grafiken zu erzeugen. Etwas Erleichterung schafft da das LaTeX-Makropaket für TeX von Leslie Lamport, das einige Befehle für die Erstellung einfacher Grafiken zur Verfügung stellt. Leider können nur einfache Kreise, Ovale und Linien mit bestimmten Winkel gezeichnet werden. Für kleinere Darstellungen reichen diese Befehle zwar aus, verlangen aber ein gutes Vorstellungsvermögen oder Millimeterpapier für eine Entwurfsskizze.
Für dieses Problem soll das folgende Programm Abhilfe schaffen. Das in TURBO-C geschriebene Programm wandelt ein ATARI-Screenfile [direkte Kopie des Bildschirmspeichers (32 kB, Extension PIC oder DOO)] in eine LaTeX-Befehlsfolge um, die dann direkt in jedes LaTeX-Dokument übernommen werden kann.
Es können Bilder aus jedem beliebigen Grafikprogramm, das die entworfene Darstellung im ATARI-Screenformat abspeichern kann, genutzt werden. Bildschirmkopien aus anderen Programmen mit Diagrammen, Meßwerten, Funktionsverläufen und vielem mehr können leicht in jede Dokumentation eingebunden werden.
Die Idee zu diesem Programm entstand bei einem Streit mit einem Bekannten. Es drehte sich mal wieder um das Thema Computer - speziell um das bessere Textverarbeitungssystem. Als TeX-Begeisterter war für mich die Sache klar. TeX stellt für fast alle möglichen Anwendungen aus dem Bereich der Textverarbeitung eine optimale Lösung dar: besonders für hochwertige naturwissenschaftliche Dokumentationen. Deshalb war es ein Leichtes, Argumenten wie schlechter Lesbarkeit des Sourcetextes, langer Einarbeitungszeit, zusätzlichem Übersetzen des Textes ... mit den Vorteilen der hervorragenden Druckqualität, dem automatischen Formelsatz, der freien Wahl umfangreicher Zeichensätze in allen Größen, der Rechnerunabhängigkeit, der automatischen Verwaltung von Inhaltsverzeichnis, Literaturverweisen und. und... entgegenzutreten. Jedoch ist die eingeschränkte Grafikfähigkeit ein wirkliches Manko.
Unter Verwendung des LaTeX-Makropakets steilen nur folgende Beleihe zur Verfügung:
\put(x,y){obj}
zeichnet das Objekt obj an die durch x und y definierte Stelle
\line(dx,dy){l}]
zeichnet eine Linie der Länge 1 mit der durch das Neigungspaar dx und dy definierten Steigung
\circle{d}
zeichnet einen Kreis mit dem Durchmesser d
\oval(b,h)
zeichnet ein Oval der Breite b und Höhe h
\linethickness{s}
definiert die Strichstärke für horizontale und vertikale Linien
Unter diesen Bedingungen wird der Entwurf von Diagrammen und anderen grafischen Darstellungen zur Qual. Als Gegenargument fiel mir nur ein: Da kann man doch ein Programm für schreiben!
Das Programm sollte möglichst kompakt die Bildinformation eines Screenfiles in eine Folge von LaTeX-Befehlen Umsetzern Der Umsetzungsalgorithmus ist deshalb im wesentlichen von den bereits vorhandenen Befehlen abhängig. Die nutzbaren Befehle beschränken sich auf den \line- und \linethickness-Befehl, da Strukturen wie Kreise \circle oder sogar Ovale \oval nicht in einer vertretbaren Zeit durch einfache Algorithmen zu entdecken sind.
Das Bild muß demnach in Linien unterschiedlicher Breite, also verschieden großen Rechtecken, zerlegt werden. Das Ziel ist es, eine möglichst kleine Anzahl von Rechtecken bzw. LaTeX-Befehlen zu finden, die das Gesamtbild repräsentieren. Die einfachste Art. dies zu erreichen, ist ein Algorithmus, der das Bild in Rechtecke maximalen Flächeninhalts zerlegt.
Nachdem das Programm das Bild eingeladen hat, sucht es, von links unten anfangend, schwarze Rechtecke mit maximalem Flächeninhalt. Das jeweils gefundene Rechteck wird in eine Liste eingetragen und aus dem Bild gelöscht. So wird das gesamte Bild langsam in eine Anzahl von Rechtecken unterschiedlicher Größe aufgeteilt bis die Darstellung völlig ausgelöscht ist. Die gesamte Bildinformation ist jetzt in eine andere Form, eine Liste von Rechtecken, umgewandelt worden. Die erzeugte Rechteckliste ist als binärer Baum angelegt, in dem die Rechtecke ihrer Breite entsprechend einsortiert sind. Dies wird sich bei der Ausgabe als Vorteil erweisen.
% end of picture file
Datenfile:picname.TED
\unitlength0.252874mm \begin{picture}(435,153) \put(0,0){\dashbox{11.863637}(435,153){\scriptsize\rm\picname}} \end{picture}
% end of picture definition file
</div>
**Bild 1: Die Information des Bildes wird in eine Befehlsfolge umgewandelt**.
<div class="textkasten" markdown=1>
\documentstyle[german,titlepage,texpic]{article} . . \begin{figure}[hbt] \begin{center} \framebox{\picinput{E:/PICTURE/AMPEL}} \caption{Darstellung der Ampelschaltung.}\label{Ampel} \end{center} \end{figure}
</div>
**Bild 2: So wird das Bild eingefügt.**
<figure>
<img src="/stc1989/images/tex-bild.png">
<figcaption>Bild 3: Darstellung einer Ampelschaltung</figcaption>
</figure>
# Aus dem Bild wird ein Text
Die in eine Datei ausgegebenen LaTeX-Befehle sollen später einfach in den normalen Text eingefügt werden. Die Ausgabe beginnt deshalb mit den Grafikbefehlen die nötig sind um eine ausreichende _picture_-Umgebung zu erzeugt. Dabei kann die Größe des Bildes im späteren Dokument vom Benutzer in Zentimetern vorgegeben werden. Aus der Größe der Abbildung im Screenfile in Pixeln und der Größenvorgabe in Zentimetern kann mit Hilfe des \unitlength-Befehls die Größenumsetzung realisiert werden. Die Parameter innerhalb der picture-Umgebung beziehen sich dann auf diese Einheit. Im Beispiel entspricht ein Grafikpixel einem Quadrat mit 0.252874 mm Kantenlänge, die gesamte Bildfläche ist dann 110 mal 39 mm groß (siehe Bild 1).
Für die Darstellung der einzelnen Rechtecke wird ein Makro _\drect_ definiert, dem die Parameter X- und Y-Koordinate und Höhe des Rechtecks übergeben werden. Die Breite des Rechtecks wird über den Befehl \linethickness jeweils vorher bestimmt.
Da die Rechtecke nach Breite sortiert sind, ist es nicht nötig, vor jedem _\drect_-Befehl eine neue Breite festzulegen, sondern nur, wenn sich die Breite gegenüber dem vorhergehenden Rechteck geändert hat (siehe Bild 1). Hier macht sich vorhergehende Sortierung der Rechtecke nach Größe in Form von Platz und Geschwindigkeit bezahlt.
Das Programm schreibt die LaTeX-Befehle in ein Textfile mit der Endung TEP. dieses kann dann mit \picinput von jedem Dokument aus aufgerufen werden und enthält die nötigen Befehle um das gesamte Bild zu erzeugen. Zusätzlich wird noch ein zweites Datenfile mit der Endung TED erzeugt. Es enthält nur die Definition der _picture_-Umgebung und reserviert den Platz für das Bild. Ein beschriftetes. gestricheltes Feld kennzeichnet im späteren Dokument den Bildbereich.
# Ein Bild entsteht neu
In Bild 2 ist zu sehen, wie die Befehlsdatei in ein Dokument eingebunden werden kann. Durch den Befehl \picinput {AMPEL} aus dem Stylefile TEXPIC.STY (Bild 4) wird die Befehlsdatei einer vorher zerlegten Darstellung, im Beispiel eine Ampelschaltung, eingelesen. Der Name Ampel wird vom Makrobefehl \picinput automatisch mit der richtigen Endung (hier TEP) versehen. Das Resultat ist in Bild 3 zu sehen.
Leider gibt es hier noch ein kleines Handikap. Die Anzahl der von TeX verwaltbaren Objekte pro Seite ist nicht besonders groß. Die Folge ist, daß es bereits bei Bilder aus wenigen Rechtecken zum Speicherinfarkt kommt. Bei TOOLs TeX für den ATARI ST ist diese Grenze bereits bei etwa 500 Rechtecken erreicht. Auch die Geschwindigkeit bei der Übersetzung ist doch recht langsam. Die einzulesenden Files sind schnell länger als 10 kB und enthalten dabei 400 bis 600 Zeilen zu übersetzende LaTeX-Befehle. Bei vielen Bildern in einem Text nimmt die Übersetzung der Bilddaten schon wesentlich mehr Zeit in Anspruch als der Text selbst.
Das Platzproblem ist eine internes TeX-Problem. Reduzieren kann man die Anzahl der Rechtecke und damit den Speicherbedarf, indem möglichst viele gerade Linien und Balken, und wenig Schrift, Kreise ... beim Entwurf verwendet werden.
Das Geschwindigkeitsproblem ist bereits bei der Erzeugung der Befehlsdateien berücksichtigt worden. Es wurden zwei Dateien erzeugt. TEP enthält die gesamte Bildinformation und TED nur die Größendefinfition. Um das Dokument zu setzen, genügt bei den Probeläufen nämlich das Wissen über das Format der Darstellung. Es wird also nur die vierzeilige Größendefinition TED eingelesen und damit nur ein Feld für das spätere Bild freigehalten. Bei der endgültigen und abschließenden Übersetzung des Dokuments wird dann das TED-File geladen und an der entsprechenden Stelle das Bild eingefügt. Der Geschwindigkeitsvorteil ist offensichtlich (4 statt 400 bis 600 Zeilen).
Um TeX mit zuteilen, daß man nur einen Probelauf durchführen möchte, ist in Stylefile TEXPIC.STY ein Befehl _\nopictures_ definiert, der dafür sorgt, daß nur die TED-Dateien geladen werden. Wird der Befehl nicht aufge- oder durch den Befehl _\nonopictures_ widerrufen, werden nur bzw. wieder die TEP-Dateien geladen.
# Das Programm
Um ein möglichst kompaktes und schnelles Programm zu bekommen, entschied ich mich für die Programmiersprache C. Dies ermöglicht Benutzern anderer Rechner (PC oder andere) eine einfachere Anpassung an ihr System vorzunehmen. Es müssen dazu nur die für die Grafik typischen Speicherzugriffe und Datenformate berücksichtigt werden.
Der große Vorteil dieser Lösung, Grafiken einzubinden, ist die weiterhin gewährleistete Rechnerunabhängigkeit der entstanden TeX-Dateien und des DVI-Files. Die erzeugten Textfiles und das DVI-File sind auf jeden Fall und immer kompatibel zu jedem TeX-System. auf dem auch LaTeX vorhanden ist.
% TEXPIC.STY, Ralf Klaassen, Bremen 6/89
\def\inhibitpic{0}
\def\nopicture{\def\inhibitpic{1}}
\def\nonopicture{\def\inhibitpic{0}}
\def\picinput#l{\ifnum\inhibitpic=l
{\def\picname{#1}\input{#1.TED}}
\else
{\input{#1.TEP}}\fi}
\end{verbatim}
}
Bild 4: Stylefile TEXPIC.STY/TEX/DOC
Literatur:
Lesie Lamport,
LaTeX - A Document Preparation System, Addison-Wesley Co., Inc.. Reading,
MA. 1985
Donald E. Knuth,
Computers and Typesetting Yol. A-E. Addison-Wesley Co.. Inc., Reading. MA,
1984—1986
Norbert Schwarz,
Einführung in TeX, 2. Auflage, Addison-Wesley (Deutschland) GmbH,
Bonn, 1988
Hubert Parti u.a.,
LaTeX-Kurzbeschreibung,
EDV-Zentrum der TU Wien,
Handbuchnummer H30, 1987
Helmut Kopka,
LaTeX Eine Einführung,
2. Auflage Addison-Wesley (Deutschland) GmbH, Bonn, 1988