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-<version>.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 [email protected] .