Web2C besteht aus einer Reihe von Programmen, die zusammen ein komplettes TeX-System darstellen. Dazu gehören natürlich TeX, METAFONT, MetaPost, BIBTeX usw. Die erste Implementierung eines TeX-Systems in der Programmiersprache C stammt von Tomas Rokicki und datiert zurück in das Jahr 1987. Rokicki benutzte als Basis sog. Change-Files unter Unix, die von Howard Trickey und Pavel Curtis entwickelt wurden. Tim Morgan hat dieses System, für das der Name Web-to-C eingeführt wurde, gepflegt. 1990 hat Karl Berry mit Unterstützung vieler Helfer die Weiterentwicklung übernommen und 1997 an Olaf Weber weitergegeben. Bei der Produktion dieser DVD und CD-ROM wurde die Version 7.5.2 von Web2C benutzt.
Web2C 7.5 läuft unter Unix, Windows 3.1, Windows9x/ME/NT/2000/XP, DOS und auf weiteren Betriebssystemen. Es benutzt die Original-Quelldateien von Donald E. Knuth und weitere in der Sprache web entwickelte Programme als Basis und übersetzt diese in C-Quellcode. Darüberhinaus bietet das System viele Makros und Funktionen zur Nutzung der originalen TeX-Software. Hier eine Liste der Basisprogramme eines TeX-Systems:
Die genaue Funktionsweise und die möglichen Parameter sind der Beschreibung der jeweiligen Pakete bzw. der Web2C-Dokumentation zu entnehmen. Trotzdem wird Ihnen ein Überblick über Zusammenspiel und Funktionsweise der Web2C-Programme sicher helfen, besser mit dem System zurechtzukommen.
Zunächst verstehen alle Programme die grundlegenden Parameter der GNU-Software:
Die Programme des Web2C-Systems benutzen zum Lokalisieren der benötigten Dateien im Dateisystem die Kpathsea-Bibliothek. Diese Bibliothek optimiert und beschleunigt den Suchprozess im Dateisystem. Ihre Arbeitsweise wird durch einige Umgebungsvariablen und eine Konfigurationsdatei gesteuert. Web2C 7.5 kann mehr als einen Dateibaum gleichzeitig verwalten und ermöglicht somit die schon beschriebene TeXLive-Installation unter Verwendung der CD-ROM oder DVD mit Ablage modifizierter Konfigurationsdateien und zusätzlicher Zeichensätze in einem zweiten Dateibaum. Die Suche nach Dateien wird durch die Analyse der Datei ls-R beschleunigt, die in jedem Wurzelverzeichnis eines TeX-Dateibaums vorhanden ist. Sie enthält für jede Datei die genaue Position im Dateibaum relativ zum Wurzelverzeichnis.
Wir beschreiben zunächst den grundlegenden Suchmechanismus der Kpathsea-Bibliothek.
Ein Suchpfad ist eine durch Kommata oder Semikola getrennte Liste von Pfadkomponenten, die üblicherweise Verzeichnisnamen darstellen. Ein Suchpfad kann sich aus vielen Komponenten zusammensetzen. Die Suche nach einer Datei »my-file« über den Suchpfad ».:/dir« bewirkt, dass Kpathsea jede Komponente nacheinander überprüft, also zunächst »./my-file« und dann »/dir/my-file«. Als Ergebnis wird entweder die erste gefundene Datei oder eine Liste aller passenden Dateien geliefert.
Um auf allen Dateisystemen effizient zu arbeiten, verwendet Kpathsea ggf. andere Datei-/Verzeichnis-Separatoren als »:« und »/«.
Beim Überprüfen einer Pfadkomponente p überprüft Kpathsea zunächst, ob eine Dateinamen-Datenbank (siehe auch Dateinamen-Datenbank auf Seite 69) für die Pfadkomponente zuständig ist, d. h. beispielsweise steht die Datenbank in einem Verzeichnis, das im Pfad vor der zu überprüfenden Komponente p steht. In diesem Fall wird zur Bestimmung der Position der gesuchten Datei die Datenbank herangezogen.
Nur wenn keine passende Datenbank existiert oder wenn die Datei nicht in der Datenbank gefunden wird, durchsucht Kpathsea das Dateisystem. Diese zeitaufwendige Suche kann über Spezifikation der Pfadkomponente p mit Präfix »!!« unterbunden werden. Zur Suche erzeugt Kpathsea eine Liste der Verzeichnisse, die im Pfadelement enthalten sind, und durchsucht jedes dieser Verzeichnisse nach der gesuchten Datei.
Für Dateien kann auch ein Schalter »file must exist« gesetzt werden (Datei muss vorhanden sein). Wenn dieser Schalter nicht gesetzt ist und beispielsweise über das TeX-Kommando openin eine VF-Datei wie cmr10.vf gelesen werden soll, wäre es falsch, nach dieser Datei zu suchen, weil es sie gar nicht gibt. Speziell für neu installierte VF-Dateien sollten Sie also unbedingt die Dateinamen-Datenbank (ls-R) aktualisieren, weil die Dateien sonst nicht gelesen werden und kein Fehler erzeugt wird. Dieser Vorgang wiederholt sich für jede Komponente eines Suchpfades: zunächst wird die Datenbank überprüft, danach ggf. das Dateisystem. Wird die Datei gefunden, stoppt die Suche (normalerweise) und der komplette Pfad zur gesuchten Datei wird als Ergebnis zurückgegeben.
Außer Verzeichnisnamen dürfen Pfadkomponenten für Kpathsea folgende Elemente enthalten: (verschachtelte) Vorgaben, Umgebungsvariablen, Werte aus der Konfigurationsdatei, Home-Verzeichnisse von Benutzern und Startverzeichnisse für eine rekursive Suche. Diese Elemente werden vor einer Dateisuche von Kpathsea in gewöhnliche Verzeichnis- oder Dateinamen expandiert. Diese Expansion wird in den folgenden Abschnitten erklärt, und zwar genau in der Reihenfolge, wie die Elemente auch von Kpathsea bearbeitet werden.
Beachten Sie, dass Kpathsea bei absoluten und explizit relativen Komponenten, d. h. die Komponente beginnt mit den Zeichen »/«, »./« oder »../«, nur überprüft, ob die Datei existiert.
Ein Suchpfad kann aus vielen verschiedenen Bestandteilen aufgebaut werden. Dies sind in der Reihenfolge, wie Kpathsea sie auswertet:
Unter Verwendung der Parameter zur Fehlersuche können Sie diese Werte für einen Suchpfad auch anzeigen lassen. (Siehe dazu den Abschnitt Fehlersuche auf Seite 76.)
Die Kpathsea-Bibliothek liest zur Laufzeit die Konfigurationsdateien namens texmf.cnf. Der zugehörige Suchpfad zum Auffinden dieser Konfigurationsdateien steht in der Umgebungsvariablen TEXMFCNF (die Voreinstellung ist texmf/web2c). Kpathsea liest alle Dateien namens texmf.cnf, die es in diesem Suchpfad findet. Die zuerst gelesenen Definitionen haben dabei Vorrang vor später gelesenen Werten. Wenn der Suchpfad auf .:$TEXMF steht, überschreiben die Einstellungen in ./texmf.cnf diejenigen in $TEXMF/texmf.cnf.
Im Folgenden wird die Syntax der texmf.cnf-Datei angegeben. Konsultieren Sie zum besseren Verständnis beim Lesen die auf der CD oder DVD enthaltene Konfigurationsdatei.
Der Ausschnitt einer Konfigurationsdatei demonstriert diese Möglichkeiten.
Kpathsea verwendet in Suchpfaden ähnliche Zeichen und Konstrukte wie Unix-Shells. Beispielsweise wird die Definition ~$USER/{foo,bar}//baz in alle Unterverzeichnisse von foo und bar unterhalb vom Home-Verzeichnis von $USER expandiert, die eine Datei oder Unterverzeichnis namens baz enthalten. Der Expansionsmechanismus wird im Folgenden erklärt.
Wenn der Suchpfad mit der höchsten Priorität (siehe hierzu »Bestandteile von Pfadkomponenten« auf Seite 64) einen zusätzlichen (vorangestellten, nachgestellten oder verdoppelten) Doppelpunkt enthält, wird an dieser Stelle der Suchpfad eingefügt, der als nächstes in der Hierarchie folgt. Auch bei diesem gilt dieselbe Regel. Wenn beispielsweise die Umgebungsvariable
Da es sinnlos wäre, denselben Pfad mehrfach einzufügen, wird die Ersetzung nur einmal vorgenommen, und zwar in der Reihenfolge vorne, hinten und Mitte. Mehrfach verdoppelte Doppelpunkte bleiben unverändert.
Die Expansion geschweifter Klammern ist zur Definition mehrerer TeX-Hierarchien sehr nützlich. Beispielsweise wird v{a,b}w zu vaw:vbw. Verschachtelungen sind dabei erlaubt. Diese Technik kann dazu benutzt werden, durch Zuweisung an $TEXMF verschiedene TeX-Hierarchien einzuführen. Als Beispiel finden Sie in texmf.cnf folgende Definition (Zeile 75):
Eine Anwendung wie
führt dann dazu, dass erst im aktuellen Verzeichnis gesucht wird, dann der gesamte Dateibaum $HOMETEXMF/tex und $TEXMFLOCAL/tex (auf der Festplatte) und schließlich der gesamte Dateibaum $VARTEXMF/tex sowie $TEXMFMAIN/tex (nur in der Datenbank ls-R) durchsucht wird. Dadurch kann man bequem zwei parallel installierte TeX-Hierarchien durchsuchen, beispielsweise eine unveränderliche auf CD/DVD und eine dynamisch angepasste auf Festplatte, in der neue Programmversionen und zusätzliche Zeichensätze installiert werden. Durch die Verwendung der Variablen $TEXMF in allen Definitionen wird grundsätzlich zuerst der neuere Dateibaum durchsucht.
Zwei oder mehrere aufeinanderfolgende Schrägstriche (//) in einer Pfadkomponente, die auf einen Verzeichnisnamen d folgen, werden expandiert zu allen Unterverzeichnissen von d. Dieser Vorgang findet rekursiv statt, wobei erst alle Verzeichnisse auf einer Ebene bearbeitet werden, dann deren Unterverzeichnisse, usw. Auf den jeweiligen Ebenen ist nicht beeinflussbar, in welcher Reihenfolge die Unterverzeichnisse bearbeitet werden.
Wenn nach den Schrägstrichen Namen angegeben werden, dann werden nur Unterverzeichnisse mit passenden Namen in die Suche einbezogen. Beispielsweise wird »/a//b« in die Pfade /a/1/b, /a/2/b, /a/1/1/b usw. expandiert, aber nicht zu /a/b/c oder /a/1. (Jeweils vorausgesetzt, dass die Verzeichnisse existieren.)
Mehrere »//«-Konstruktionen innerhalb einer Pfadkomponente sind zulässig, allerdings nicht am Pfadanfang.
Folgende Zusammenfassung wiederholt alle Sonderzeichen, die in den Kpathsea-Konfigurationsdateien auftreten können:
Kpathsea unternimmt etliche Anstrengungen, um den Zugriff auf Festplatte und CD/DVD zur Suche nach Dateien zu reduzieren. Auf TeX-Systemen mit vielen Unterverzeichnissen kann die Suche in jedem möglichen Verzeichnis nach einer bestimmten Datei eine lange Zeit in Anspruch nehmen, besonders wenn einige Hundert Zeichensatzverzeichnisse durchforstet werden müssen. Um dieses Problem abzumildern, benutzt Kpathsea eine Art Datenbankdatei namens ls-R, die die Zuordnung von Dateinamen auf Verzeichnisse enthält. Dadurch muss nicht jedesmal die Festplatte durchsucht werden.
Eine zweite Datenbank in der Datei aliases kann eine Zuordnung zwischen den Namen in ls-R und weiteren Namen vornehmen und so beispielsweise hilfreich bei der Umsetzung von »DOS8.3«-Dateinamen auf die »echten«, aussagekräftigen Dateinamen zur Seite stehen.
Wie schon öfters erwähnt, muss die Datenbank der Dateinamen in der Datei ls-R gespeichert sein. Sie sollten eine solche Datenbank für jede TeX-Hierarchie (normalerweise in $TEXMF) Ihres Systems anlegen. Die meisten TeX-Systeme arbeiten nur mit einer Hierarchie. Kpathsea sucht die Datenbanken ls-R über den Pfad TEXMFDBS.
Es wird empfohlen, die Pflege der »ls-R«-Dateien dem mitgelieferten Skript mktexlsr zu überlassen. Dieses Skript wird automatisch von den verschiedenen »mktex... «-Skripten aufgerufen. Das Skript ruft grob gesagt den Befehl
Wenn eine Datei nicht über die Datenbank gefunden wird, sucht Kpathsea normalerweise auf der Festplatte weiter. Wenn eine Pfadkomponente mit »!!« beginnt, wird dagegen niemals die Festplatte durchsucht.
Mit dem Programm kpsewhich können Sie unabhängig vom Aufruf irgendeines TeX-Programms nach Dateien in der TeX-Hierarchie suchen (als schnellere Alternative zu dem Befehl find). Dies wird von den verschiedenen »mktex... «-Skripten bis zum Exzess vorexerziert.
Argumente der Kommandozeile, die keine Optionen darstellen, werden als Dateinamen interpretiert. Für jeden Dateinamen wird der erste passende Pfad gemeldet. Um eine Liste aller passenden Pfade zu erhalten, müssen Sie das Kommando »find« absetzen.
Im Folgenden werden die wichtigen Optionen beschrieben.
Die Umgebungsvariablen werden in der Konfigurationsdatei texmf.cnf definiert. Definieren Sie die entsprechenden Variablen über Ihre Shell nur dann, wenn Sie eine der Einstellungen zur Laufzeit ändern wollen.
Übrigens können Sie nur eine der beiden Optionen »--format« und »--path« gleichzeitig angeben.
Wir schauen uns nun die Funktionsweise von Kpathsea anhand einiger Beispiele an.
Als nächstes wenden wir uns den Header- und Konfigurations-Dateien von dvips zu. Zunächst suchen wir nach der Konfiguration für TeX-Unterstützung, dem Prolog tex.pro. Danach suchen wir die allgemeine Konfigurationsdatei (config.ps) und schließlich die PostScript-Zeichensatzzuordnungsdatei psfonts.map. Da die Endung ».ps« nicht eindeutig ist, müssen wir den gewünschten Typ (»dvips config«) für die Datei config.ps spezifizieren.
Diese Beispiele sollten deutlich gemacht haben, wie leicht bestimmte Dateien im TeX-Dateibaum gefunden werden können. Dies ist sehr wichtig, wenn Sie den Verdacht haben, dass eine falsche Version einer Datei verwendet wird. Sie lassen sich einfach die verwendete Datei von kpsewhich anzeigen.
Manchmal ist wichtig, bis ins Detail nachzuvollziehen, wie ein Programm eine bestimmte Datei findet. Zu diesem Zweck bietet die Kpathsea-Bibliothek verschiedene Stufen für den Umfang der Fehlersuche an.
Durch die Angabe von -1 setzen Sie alle Stufen gleichzeitig. Für eine effiziente Fehlersuche sollten Sie sich auf die wichtigsten Ausgaben beschränken.
Für dvips gibt es einen ähnlichen Mechanismus zur Erzeugung von Analysemeldungen um herauszufinden, warum bestimmte Dateien geöffnet wurden bzw. wo vielleicht das Problem liegt, wenn Dateien nicht gefunden werden.
Da fast alle Programme die Kpathsea-Bibliothek benutzen, können Sie die gewünschte Stufe auch über die Umgebungsvariable KPATHSEA_DEBUG einstellen, indem Sie einen der Werte oder eine additive Kombination spezifizieren.
Wir betrachten als Beispiel eine kleine LaTeX-Quelldatei namens hello-world.tex mit folgendem Inhalt:
Diese Datei verwendet nur einen Zeichensatz, cmr10. Wir sehen uns jetzt einmal genau an, wie dvips die PostScript-Datei erzeugt. (Da wir die Type-1-Variante der Computer-Modern-Roman-Zeichensätze verwenden wollen, haben wir die Option -Pcms verwendet).
debug:start search(file=texmf.cnf, must_exist=1, find_all=1,
path=.:/usr/local/bin/texlive:/usr/local/bin: /usr/local/bin/texmf/web2c:/usr/local: /usr/local/texmf/web2c:/.:/./teTeX/TeX/texmf/web2c:). kdebug:start search(file=ls-R, must_exist=1, find_all=1, path=~/tex:/usr/local/texmf). kdebug:search(ls-R) =>/usr/local/texmf/ls-R kdebug:start search(file=aliases, must_exist=1, find_all=1, path=~/tex:/usr/local/texmf). kdebug:search(aliases) => /usr/local/texmf/aliases kdebug:start search(file=config.ps, must_exist=0, find_all=0, path=.:~/tex:!!/usr/local/texmf/dvips//). kdebug:search(config.ps) => /usr/local/texmf/dvips/config/config.ps kdebug:start search(file=/root/.dvipsrc, must_exist=0, find_all=0, path=.:~/tex:!!/usr/local/texmf/dvips//). search(file=/home/goossens/.dvipsrc, must_exist=1, find_all=0, path=.:~/tex/dvips//:!!/usr/local/texmf/dvips//). kdebug:search($HOME/.dvipsrc) => kdebug:start search(file=config.cms, must_exist=0, find_all=0, path=.:~/tex/dvips//:!!/usr/local/texmf/dvips//). kdebug:search(config.cms) =>/usr/local/texmf/dvips/cms/config.cms
kdebug:start search(file=texc.pro, must\_exist=0, find\_all=0,
path=.:~/tex/dvips//:!!/usr/local/texmf/dvips//: ~/tex/fonts/type1//:!!/usr/local/texmf/fonts/type1//). kdebug:search(texc.pro) => /usr/local/texmf/dvips/base/texc.pro
kdebug:start search(file=cmr10.tfm, must\_exist=1, find\_all=0,
path=.:~/tex/fonts/tfm//:!!/usr/local/texmf/fonts/tfm//: /var/tex/fonts/tfm//). kdebug:search(cmr10.tfm) => /usr/local/texmf/fonts/tfm/public/cm/cmr10.tfm kdebug:start search(file=texps.pro, must\_exist=0, find\_all=0, ... <texps.pro> kdebug:start search(file=cmr10.pfb, must\_exist=0, find\_all=0, path=.:~/tex/dvips//:!!/usr/local/texmf/dvips//: ~/tex/fonts/type1//:!!/usr/local/texmf/fonts/type1//). kdebug:search(cmr10.pfb) => /usr/local/texmf/fonts/type1/public/cm/cmr10.pfb <cmr10.pfb>[1]
|
Zunächst sucht dvips (bzw. Kpathsea) seine Konfigurationsdateien, nämlich texmf.cnf (das die Pfade der anderen Dateien enthält), dann die Dateinamen-Datenbank ls-R (zur Optimierung der Suche) und die Datei aliases, mit deren Hilfe für eine Datei mehrere Namen vereinbart werden können, z. B. um die kurzen »8.3«-DOS-Namen mit aussagefähigen, langen Namen zu assoziieren. Danach wird die allgemeine dvips-Konfigurationsdatei config.ps, anschließend die benutzerspezifische Konfigurationsdatei .dvipsrc (wird hier nicht gefunden) gesucht. Als letztes sucht dvips die Zuordnungsdatei für Computer Modern PostScript- Zeichensätze config.cms (bedingt durch die Option -Pcms beim Aufruf von dvips). Diese Datei enthält die Dateinamen der Listen, die die Zuordnung zwischen Dateinamen und Zeichensatznamen herstellen.
Jetzt erfolgt die normale Startmeldung von dvips:
Zu den willkommenen Erweiterungen von Web2C zählt die Möglichkeit, zur Laufzeit einige Speichergrößen über die Datei texmf.cnf anpassen zu können (insbesondere die Größe einiger Stacks). Eine ausführliche Liste der veränderbaren Parameter finden Sie in der Datei texmf.cnf. Die wichtigsten Werte sind:
Natürlich sind diese Parameter kein Ersatz für eine wirklich dynamische Speicherverwaltung. Mit der gegenwärtigen Version von TeX ist dieses Konzept aber nur extrem schwer zu implementieren, darum stellt dieses Verfahren eine praktikable Lösung dar.