TeX mit SISISI-Silbentrennung ============================= Technische Dokumentation fuer Fortgeschrittene ============================================== (Hinweis: Dieses File enthaelt nur technische Information. Wenn Sie nur SiTeX installieren wollen, ohne sich fuer die Probleme und Hintergruende zu interessieren, brauchen Sie dieses File nicht zu lesen. Wenn allerdings bei der normalen Installation etwas schiefgehen sollte, kann Ihnen die in diesem File enthaltene Information vielleicht weiterhelfen.) 0) Grundsaetzliches. -------------------- Die SISISI Silbentrennung ist ein WEB-Changefile (sitex3.ch), das gewoehnlich in tex.web hineingetangle'd wird. Fuer die UNIX-Version von TeX wurde allerdings ein web2c Konverter geschrieben, der das von tangle erzeugte tex.p in C-Code konvertieren soll. Dieser Konverter kann mit den in sitex3.ch verwendeten Standard-Pascal Befehlen nicht umgehen, z.B. koennen keine statisch geschachtelten Prozeduren verarbeitet werden. Es war also notwendig, sitex3.ch so zu aendern, dass es von dem web2c Konverter verarbeitet werden kann. Ausserdem hat der web2c Konverter einige Eigenheiten (sprich Fehler :-), die es notwendig machen, den entstehenden C-Code einer Nachbearbeitung (sprich Korrektur) zu unterwerfen. Diese Aufgaben wurden im Rahmen eines Informatikpraktikums von den Studenten Hans-Juergen Szoldatics und Florian Zwerina geloest. 1) Einbinden von SISISI in TeX. ------------------------------- Das erste Problem entsteht dadurch, dass tangle nur ein einzelnes Changefile in ein .web Masterfile einbinden kann. In der C/UNIX Version ist es allerdings notwendig, zuerst sitex3.ch in tex.web einzubinden, und dann zusaetzlich noch ctex.ch. Diese Aufgabe kann mit tangle alleine nicht geloest werden. Es gibt allerdings ein Programm namens TIE, das dazu verwendet werden kann, mehrere Changefiles in ein Masterfile einzubinden, und das in einer C Version auf ftp.th-darmstadt.de [130.83.55.75] directory pub/programming/literate-programming/Tools file tie-.tar.Z zur Verfuegung steht. (Ich bin Klaus Guntermann fuer diese Information zu grossem Dank verpflichtet). Um Ihnen das Leben zu erleichtern, finden Sie tie-2.4.tar.Z gemeinsam mit den anderen SISISI-Files in diesem Verzeichnis. Um Ihnen das Leben noch leichter zu machen, finden Sie auch ein sitex.web, das nichts anderes ist als tex.web (Version 3.14) mit sitex3.ch hineingetie'd. Falls Sie allerdings vorhaben sollten, eine andere (neuere oder aeltere) Version von TeX zu verwenden, muessen Sie zuerst tie.c uebersetzen und das ebenfalls in diesem Verzeichnis vorhandene sitex3.ch in Ihr tex.web hineintie-en, um ein neues sitex.web zu erhalten. (Wenn Sie das `install' Skript verwenden wollen, muessen Sie nachher sitex.web compress-en, oder das `install' Skript entsprechend aendern.) 2) Die Konversion von TeX (mit SISISI) nach C. ---------------------------------------------- Sobald Sie Ihr original tex.web durch sitex.web ersetzt haben (wobei Sie sitex.web in tex.web umbenennen muessen), koennen Sie ein `make' starten, genau wie bei der normalen Installation von TeX. Allerdings sind noch einige kleine Vorarbeiten notwendig, die Ihnen das `install' Skript abnimmt, die Sie aber bei haendischer Installation selbst tun muessen. Zunaechst einmal sind die internen Tabellen von tangle und web2c zu klein fuer SiTeX, und muessen vergroessert werden. Dazu gibt es neue Versionen von tangle.ch und web2c.c und web2c.h, die in ihre entsprechenden Verzeichnisse kopiert werden muessen (naemlich nach TEXSRC/web und TEXSRC/web2c). Ausserdem muessen einige Definitionen in ctex.ch geaendert werden, und deshalb wird auch dieses File mitgeliefert. Ausserdem gibt es noch neue Versionen der Makefiles, da 1) zwei neue Format-Files erzeugt werden muessen und 2) nicht mehr nur tex[0-8].c ensteht, sondern auch tex9.c. 3) Jetzt beginnt der Aerger. ---------------------------- tex.web wird von tangle in tex.p konvertiert (mit ctex.ch als Changefile), und tex.p dann von einem Skript namens `convert' unter Verwendung von web2c in mehrere .c und .h Files umgewandelt. Dann versucht sich der C-Compiler an dem Resultat, und damit beginnen die Schwierigkeiten. Aus irgendwelchen unerfindlichen Gruenden wird '] ] )' von web2c in ') ] ]' umgewandelt, was natuerlich den obligaten Syntaxfehler erzeugt. Ausserdem wird ein Array, das in Pascal als Wertparameter an eine Prozedur uebergeben wird, automatisch zu einem Var-Parameter, da der Arrayname in C ja eigentlich nur ein Zeiger auf das erste Element des Arrays ist. In Pascal wird - wie es sich fuer einen Wertparameter gehoert - eine Kopie des gesamten Arrays erzeugt und diese dann an die Prozedur uebergeben. In C wird eine Kopie des Zeigers erzeugt und diese dann uebergeben. Was passiert, wenn dann das Array innerhalb der Prozedur modifiziert wird, kann man sich denken (in Pascal ist nur die lokale Kopie betroffen, in C ...). Aus diesem Grund muss explizit ein temporaeres Array in der Prozedur definiert werden, das den Wert des Parameters speichert und beim Verlassen der Prozedur wieder herstellt. Natuerlich muss die Zuweisung, die in Pascal ja auch fuer Arrays funktioniert, in C durch ein `memcpy' ersetzt werden. Ein weiterer Fehler wird durch die schlechte Konvertierung der Ein-/Ausgabe Anweisungen von Pascal erzeugt. Bei der Umwandlung von write() in fprintf() geht die Feldbreite verloren (write(x:4) wird zu printf("%d",x) anstelle von printf("%4d",x)). Ebenso gibt es Probleme bei der Eingabe, wenn selbstdefinierte Datentypen verwendet werden. Dadurch kommt es zu einem Fehler beim Abspeichern bzw. Einlesen der Hashtabelle, die im File hf3 abgespeichert wird. Wieder ein anderes Problem entsteht durch die trickreiche Umsetzung von Prozedurdeklarationen und -aufrufen. Um die Unterscheidung von Wert- und Variablenparametern so transparent wie moeglich zu machen, werden alle Funktionen (im C-Code) umbenannt und stattdessen Makros definiert, die den Adressoperator auf alle Var-Parameter anwenden und damit die (jetzt umbenannte) Funktion aufrufen. Vorteil: Am Funktionsaufruf aendert sich gar nichts, nur wird statt der Funktion jetzt eben der Makro `aufgerufen', der dann fuer die richtige Uebergabe der Parameter sorgt. Leider tut web2c zuviel des Guten und erzeugt in den Makros auch noch Typecasts, damit die Parameter auch nur ja den richtigen Typ haben. Und GNU C vertraegt es leider nicht, wenn Casts auf Array-Typen vorgenommen werden, was in SiTeX nun halt einmal vorkommt. Deshalb muessen alle Casts, die Array-Typen spezifizieren, aus coerce.h entfernt werden (dort sind alle Makros und Funktionsprototypen definert). Um Ihnen diese Korrekturen abzunehmen, stehen die Files tex6.c, coerce.h und texd.h in bereits korrigierter Form zur Verfuegung, und muessen nach TEXSRC/tex kopiert werden, sobald `make' zum ersten Mal mit der Fehlermeldung `cast specifies array type' abbricht (wenn vorher ein anderer Fehler auftritt, ist etwas schiefgegangen !). Wenn Sie das `install' Skript verwenden, geschieht dies automatisch. Dann wird einfach wieder das `make' neu gestartet. Das Problem dabei ist, dass web2c eigentlich nur ein einziges grosses C-File erzeugt, das dann nachtraeglich in die einzelnen Files aufgespaltet wird, und dass keine Garantie dafuer besteht, dass das tex6.c, das Sie erhalten, genauso aussieht wie jenes, das bei mir enstanden ist und in dem ich die Fehler korrigiert habe. Sollten sich (was aber eher unwahrscheinlich ist) im weiteren Verlauf des `make' wieder Fehler ergeben, und zwar dass Symbole nicht bzw. doppelt deklariert wurden, ist genau dieser Fall eingetreten. Verstaendigen Sie mich dann bitte umgehend. Ansonsten sollten Sie aber jetzt ohne weitere Probleme initex und virtex in Ihrem TEXSRC/tex Verzeichnis erhalten. 4) Die Installation des fertigen SiTeX. --------------------------------------- Nachdem also nun initex und virtex erfolgreich erstellt wurden, muessen Sie noch die Format-Files erzeugen und alles in den entsprechenden Verzeichnissen installieren. Die Format-Files werden vom `install' Skript automatisch erzeugt, aber wenn Sie es haendisch tun wollen/muessen, sehen Sie am besten im Makefile in Ihrem SISISIDIR nach, wie man Format-Files erzeugt. Wenn Sie das `install' Skript verwendet haben, finden Sie neben sitex.fmt und silatex.fmt in TEXSRC/tex auch noch ein File namens sitex.pool und ein File namens hf3. Wenn Sie allerdings `install' nicht verwendet haben, heisst sitex.pool noch tex.pool und muss erst umbenannt werden. Das hf3 File wird automatisch generiert, sobald Sie das erste Format-File erzeugen. Sie sollten nun zuerst hf3 in ein Verzeichnis in Ihrem TEXINPUTS Pfad kopieren, und sitex.pool in das TEXPOOLDIR. Dann kommen sitex.fmt und silatex.fmt in das TEXFORMATS Verzeichnis, und in dem selben Verzeichnis erzeugen Sie auch einen Link namens siplain.fmt auf sitex.fmt. Jetzt muessen Sie sich entscheiden, ob Sie Ihr altes TeX/LaTeX behalten wollen oder nicht. Falls Sie auch weiterhin fremdsprachige Texte bearbeiten wollen, sollten Sie das neue initex und virtex unter neuem Namen (z.B. siinitex und sivirtex) in ein Verzeichnis in Ihrem Standard-Suchpfad kopieren, und Links namens sitex und silatex auf sivirtex erzeugen, in dem selben Verzeichnis. Falls Sie das alte TeX nicht mehr wollen, kopieren Sie einfach das neue virtex ueber das alte, und ebenso das neue initex ueber das alte initex, und stellen Sie die sitex und silatex Links her. Die alten Links, tex, latex, slitex etc. koennen Sie entfernen. 5) Bugs, Probleme etc. ---------------------- Der Installationsprozess wurde auf einem 486 PC mit Interactive Unix SVR3.2 und auf einer HP 9000/705 mit HP-UX 8.07 getestet. Auf beiden Maschinen sind die Resultate, die silatex liefert, identisch. Allerdings hatte ich bis jetzt keine Gelegenheit, silatex auf anderen Systemen, speziell BSD und AIX, zu testen. Deshalb muss silatex noch immer als Beta Version betrachtet werden, und alle Fehlermeldungen, Kommentare, (Verbesserungs-)Vorschlaege und Berichte ueber erfolgreiche Inbetriebnahme sind willkommen. Schicken Sie bitte EMail an heinz@eiunix.tuwien.ac.at .