14 Erweiterungen von Plain-lEX
DaB man umfangreichere Dokumente nicht allein mit Tpc bzw. Plain-Tpc erstellt, liegt auf der Hand und wird von allen Autoren bestatigt. Knuth entwickelte die - inzwischen legendaren - manmac-Makros, und wir stellten das fancy-Format vor, welches bestimmte, immer wiederkehrende, Layout-Makros enthalt. Viele Dokumententypen stellen ahnliche Anforderungen an die Strukturierung und Gliederung, so daB es naheliegend ist, Makros hierftir bereitzustellen. Das bekannteste Makropaket hierflir stellt k\T~ dar, das von einem speziellen Entwicklerteam - dem ,,JbTJi( 3 Project Team" - grundlegend tiberarbeitet wird, siehe Literaturverzeichnis. Aber auch flir Plain-Tpc existieren Erweiterungen, die viele der beim Buchdruck immer wieder auftretenden Aufgaben sehr elegant lOsen konnen. Die wichtigste dieser Erweiterungen - ePlain-TEX- steHen wir im folgenden genauer vor.
14.1 Was ist "eplain"?
ePlain-Tpc steht flir "erweitertes" oder "erganztes" Plain-Tpc. Es wird von Karl Berry (und in einigen Teilen von Steven Smith) entwickelt und gepftegt. Die aktuelle Version 2.6 wird unter den Bedingungen der "GNU General Public License" auf den CTANServern als eplain. tex zur Verfligung gestellt. Eine dokumentierte Variante ist dort unter xeplain. tex ebenfalls vorhanden.
1m Unterschied zu k\T~ steHt ePlain-Tpc nur minimale Makros zur visuellen DarsteHung ("visuelles Markup") zur Verftigung, da die notwendigen Formatannahmen oft nicht den tatsachlichen Erfordernissen entsprechen. Hier ist dann der Autor gefordert, selbst entsprechende Makros zu entwickeln. ePlain-Tpc bietet stattdessen Makros ftir die Grundstrukturierung von Dokumenten, also z. B. ftir das Anlegen eines Inhaltsverzeichnisses, eines Stichwortregisters oder den Mehrspaltensatz.
R. Séroul et al., TEX Praxis© Birkhäuser Verlag 1998
258 Kapitel 14. Erweiterungen von Plain-T EX
14.2 ePlain-TEX einsetzen
Es gibt mehrere Moglichkeiten, ePlain-Tpc einzusetzen.
ePlain-TeX in den Quelltext laden
ePlain-Tpc kann mittels des \input-Kommandos im Quelltext geladen werden. Diese einfache Moglichkeit empfiehlt sich, wenn die Eignung bestimmter ePlain-Tpc -Strukturen getestet werden solI.
Bei dieser Methode ist es sinnvoll, zu testen, ob ePlain-Tpc bereits geladen wurde. Dazu kann folgende kurze Befehlsfolge verwendet werden:
\ifx\eplain\undefined \input eplain \fi
ePlain-TPC besteht aus mehreren Komponenten: eplain. tex enthltlt die meisten der unten beschriebenen Makros. arrow. tex enthalt Makros zum Setzen der in Abschnitt 11.24 vorgestellten kommunitativen Diagramme. btxmac. tex definiert die Makros fUr Literaturzitate und -verzeichnisse. texnames. tex schlieBlich wird zur Darstellung von TPC-Logos - wie z. B. BmTpc - eingesetzt.
Die in der Datei btxmac . tex definierten Makros benotigen relativ viel Speicherplatz. Deshalb wurde folgende Moglichkeit vorgesehen, diese Makros nicht zu laden:
\let\nobibtex=t \input eplain
(Entsprechendes gilt auch fUr arrow. tex, des sen Laden durch den Befehl \noarrow unterbunden wird.)
Ein ePlain-TeX-Format Die zweite Moglichkeit, ePlain-TJ3X einzusetzen, besteht in def Vefwendung eines spe
ziellen Format-Files. Diese Moglichkeit stellt die schnellste Variante dar und sollte verwendet werden, wenn ePlain-TJ3X -Makros regelmltBig benutzt werden.
Beim Erzeugen eines speziellen ePlain-TEX.-Format-Files muB die Datei eplain. aux existieren, ansonsten werden viele Features abgeschaltet. (Der Inhalt dieser Datei ist irrelevant, *nix-User verwenden wahrscheinlich touch eplain. aux, urn diese Datei zu erstellen.) AnschlieBend muB initex nur noch mit dem Plain-Tpc-Format gestartet und eplain. tex eingeladen werden:
initex This is TeX, ... **&plain eplain (eplain) \dump
Damit ist die Datei eplain. fmt im aktuellen Verzeichnis entstanden. Verschieben Sie diese in das (in Ihrer Implementation) entsprechende Verzeichnis.
14.4 Makros filr logische Strukturen 259
14.3 Die ePlain-TEX-Makros Die ePlain-TEX-Makros konnen in verschiedene Funktionsgruppen unterteilt werden:
Es existieren Makros, die bestimmte Einstellungen vornehmen oder iindern, Makros, die bestimmte logische Strukturen definieren, und solche, die beim Erstellen und Testen eigener Makrostrukturen hilfreich sind. Wir werden diese Gruppen in den folgenden Abschnitten vorstellen.
Makros, die Einstellungen vornehmen oder andern Wiihrend Plain-TEX voreinstellungsgemaB O.4pt starke Linien setzt, konnen bei der
Verwendung von ePlain-TEX die folgenden drei Befehle zur Definition der Defaultwerte eingesetzt werden.
\hrul edef aul the igh t definiert die vertikale Ausdehnung horizontaler Linien (voreingestellt sind 0.4 pt). \hruledef aul tdepth (voreingestellt ist 0 pt) beschreibt den vertikalen Versatz der Linie zum Referenzpunkt. \ vruledef aul twidth legt die horizontale Breite vertikaler Linien fest, (voreingestellt sind 0.4 pt).
Damit die Verwendung dieser Makros nicht eine Redefinition der Befehle \hrule und \vrule notwendig macht (welche unabsehbare Folgen hat), werden die beiden ePlainTEX-Befehle \ehrule und \evrule eingefUhrt. Sie sollten an Stelle von \hrule und \ vrule eingesetzt werden.
Der Bereich, in dem TEX den Text setzt, wird durch die TEX-primitives \hsize und \ vsize festgelegt. Alternativ kann auch eine Beschreibung des Textbereiches durch die Angabe von Riindern erfolgen. Dazu sind die folgenden Makros vorhanden:
\ topmargin enthiilt den Wert fUr den oberen Rand, \bottommargin fUr den unteren. Entsprechend definieren \leftmargin und \rightmargin die linken bzw. rechten Rander. Fur alle Befehle stehen Varianten zur Verfugung, die die entsprechenden Riinder veriindern. \advancetopmargin wird z. B. fUr den oberen Rand eingesetzt, fUr den linken heiBt sie \advanceleftmargin, etc. Die Befehle werden folgendermaBen eingesetzt:
\advancebottommargin by 3ex
vergroBert den unteren Rand urn den Wert 3ex, wlihrend
\advancerightmargin by -5mm
den rechten Rand urn 5 mm verkleinert. Die GroBe der Gesamtseite wird durch die Werte in den Makros \paperwidth (8.5in)
und \paperheight (llin) definiert; die Defaultwerte wurden in Klammern angegeben.
14.4 Makros fOr logische Strukturen Die in den folgenden Abschnitten beschriebenen Makros werden zur Formatierung be
stimmter logischer Strukturen verwendet. Die endgiiltige Darstellungsweise kann (und solI) durch Anwenderbefehle den Erfordernissen entsprechend angepaBt werden. Die hier beschriebenen Makros definieren die Funktion der entsprechenden Struktur.
260 Kapitel 14. Erweiterungen von Plain-T £X
Listen
Listen sind haufig auftretende Strukturen in technisch/wissenschaftlichen Dokumenten. Eine Anzahl von Einzelpunkten wird konsistent formatiert. Plain-TEX definiert nur die einfachste Form der Liste. Die einzelnen Listeneintrage konnen aus mehreren Absatzen bestehen. Eine Verschachtelung mehrerer Listen ist moglich, siehe dazu die Diskussion der Makros \i tem, \i temi tem und \i temi temi tem.
ePlain-TEX definiert zwei weitere Listentypen.
1) Numerierte Listen: Ein Beispiel sehen Sie hier. Listen dieses Typs beginnen mit dem Befehl \numberedlist. Die Listeneintrage werden nicht wie i.iblich durch \itemBefehle, sondem mittels \li markiert. Numerierte Listen beginnen voreinstellungsgemaB bei 1.
a) Listenelemente der nachsten Ebene werden dann mit arabischen Kleinbuchstaben bezeichnet.
i) Die dritte Ebene verwendet kleine romische Zahlen zur Kennzeichnung der Listeneintrage.
In allen weiteren Ebenen werden die Listeneintrage durch ein vorangestelltes *-Symbole markiert.
2) Ein Synonym flir die \numberedlist stellt \orderedlist dar.
3) Listen mit festen Markierungen werden durch die Befehle \unorderedlists und \endunorderedlists erzeugt:
• Elemente der ersten Ebene werden wie hier dargestellt markiert .
• Das Symbol wird durch den Befehl \blackbox erzeugt.
- Die folgende Ebene wird durch ein ,,-"-Symbol gekennzeichnet, alle weiteren Ebenen erhalten defaultmaBig das ,,*"-Symbol.
Diese Listen konnen weitgehend konfiguriert werden:
• \abovelistskipamount wird vor der Listenstruktur, \belowlistskipamount danach eingefligt.
• Zwischen den Listenpunkten wird der Abstand \interi temski pamount gesetzt.
• Rechtsseitig findet eine Einriickung urn der Wert von \listrightindent und linksseitig von \listleftindent statt. Dabei wird \listrightindent zu dem Wert von \rightskip addiert und \listleftindent relativ zu dem Wert von \parindent.
• Zwischen der Listenmarkierung und dem Eintragstext wird ein Abstand in der GroBe von \listmarkerspace gesetzt. Voreingestellt ist hier ein \enspace.
• Diese Voreinstellungen konnen durch den Aufruf des Befehls \listcompact deutlich reduziert werden, ohne daB sich die Gesamtdarstellung wesentlich verandert.
14.4 Makros fOr /ogische Strukturen 261
• Listenmarkierungen konnen durch die Redefinition der Makros \numberedmarker bzw. \unorderedmarker verandert werden. Dort konnen \orderedlistdepth oder \numberedlistdepth eingesetzt werden, wie folgende Definitionen zeigen.
Die Voreinstellung fiir numerierte Listen lautet:
\def\numberedmarker{% \ifcase\numberedlistdepth
}%
(impossible)% \or \printitemnumber \or \printitemletter \or \printitemromannumeral \else *% \fi
Die Numerierung in der Liste erfolgt tiber die zwei Integer-Variablen \i temnumber und \i temletter. \i temnumber beginnt mit dem Wert 1 und \i temletter bei 97 (entspricht dem ASCII-Wert des kleinen "a".)
Die Voreinstellung fiir Listen yom Typ \unorderedlist ist:
\def\unorderedmarker{% \ifcase\unorderedlistdepth
}%
(impossible)% \or \blackbox \or ---% \else *% \fi
Die Problematik der FuBnotendarstellung wurde in Kapitel 6.12 bereits erlautert. Das Glossar enthiilt unter dem Stichwort \myfootnote einen Vorschlag zur Programmierung besserer FuBnotenmakros. ePlain-TEX enthalt hierfiir einen weiteren Ansatz.
Mit dem Makro \numberedfootnote wird der im Argument tibergebene Text als FuBnote dargestellt. Diese FuBnoten erhalten zur Kennzeichnung eine Zahl, die sich bei jeder FuBnote erhoht. Sie konnen das FuBnotenmakro auch durch
\let\footnote\numberedfootnote
fiir aIle FuBnoten auf den Befehl \footnote abbilden. Die Nummer der aktuellen FuBnote wird im Ganzzahlregister \footnotenumber gespeichert. Diese kann - z. B. am Beginn einen neuen Kapitels durch
\footnotenumber=O
zUrUckgesetzt werden. Zwischen der FuBnote und dem FuBnotentext wird der Abstandsbefehl \footnotemarkseparation eingefiigt, er ist mit einem \enspace vorbelegt.
Zwischen mehreren FuBnoten einer Seite wird der im \interfootnoteskip-Makro enthaltene vertikale Abstand gesetzt. \parindent ist in FuBnotentexten verschwindend klein (0 mm).
262 Kapitel 14. Erweiterungen von Plain-T EX
Eine wesentliche Hilfe bei der gleichmaBigen Formatierung von FuBnoten stellt das Makro \everyfootnote dar. Dieses Tokenregister wird nach dem Berechnen der FuBnotennummer und Position am Beginn der Ausgabe des FuBnotentextes expandiert. So ist es durch die Angabe
\everyfootnote={\sevenrm \leftskip10mm}
moglich, alle FuBnoten einheitlich mit dem Font \sevenrm und einer linksseitigen Einriickung von 10 mm darzustellen.
FuBnotentexte werden durch eine Linie yom FlieBtext getrennt. Diese Linie kann durch die Langenvariablen \footnoterulewidth in ihrer Lange und in ihrer Starke durch \footnoteruleheight verandert werden. \footnoteruleheight=Omm laBt diese Linie verschwinden. Zwischen der Linie und der ersten FuBnote wird der vertikale Abstand \belowfootnoterulespace eingefiigt, den der Anwender ebenfalls verandem kann.
Der Abstand zwischen FlieBtext und FuBnotenlinie wird durch \skip\footins kontrolliert. Voreingestellt ist hier ein \bigskip.
TOC: (TableOfContents), das Inhaltsverzeichnis Das automatische Erstellen eines Inhaltsverzeichnisses ist eine in vielen Arbeiten sinn
volle Aufgabe. Zum einen wird hierdurch eine erhebliche Menge an Arbeitszeit eingespart, anderseits werden die Fehlermoglichkeiten wesentlich reduziert, insbesondere dann, wenn zu einem spateren Zeitpunkt Erganzungen des Textes vorgenommen werden.
ePlain-T£X verwendet in Analogie zu ~T£X eine exteme Datei mit der Extension . toe, urn das Inhaltsverzeichnis zu speichern. (Die Extension dieser Datei wird im Makro \definecontentsfile definiert.)
Eintrage in diese Datei werden mit dem Makro \writetocentry vorgenommen. 1m ersten Argument dieses Makros wird die Gliederungsebene des Eintrags iibergeben - z. B. "chapter" oder "section"- , im zweiten der Text des entsprechenden Eintrags, wie er im Inhaltsverzeichnis erscheinen soll. (Dieser Text muB nicht zwingend identisch sein mit dem, der in der Uberschrift erscheint. Manchmal ist es sinnvoller, abgektirzte Titel im Inhaltsverzeichnis zu verwenden.)
In der . toc-Datei entsteht fiir jeden durch das Makro \writetocentry generierten Eintrag eine Zeile der folgenden Form:
\ tocpartentry{TextHSeite}
Vordefiniert sind die folgenden drei Makros \ tocchapterentry, \ tocsectionentry und \tocsubsectionentry:
\def\tocchapterentry#1#2{\line{\bf #1 \dotfill\ #2}}% \def\tocsectionentry#1#2{\line{\quad\sl #1 \dotfill\ \rm #2}}% \def\tocsubsectionentry#1#2{\line{\qquad\rm #1 \dotfill\ #2}}%
Weitere Makros konnen nach diesem Muster leicht erzeugt werden, vergleichen Sie auch unsere Ausfiihrungen tiber den \leaders-Befehl..
Das im Argument Text vorhandene Material wird ohne Expansion in die. toc-Datei tibernommen.
\ wri tenumberedtocentry erweitert die Syntax des Makros \ writetocentry urn eine wesentliche Komponente: Ein drittes Argument wird bei diesem Befehl an der Stelle
14.4 Makros fOr logische Strukturen 263
im Quelltext expandiert, an welcher der Befehl aufgerufen wird. Damit ist es moglich, aktuelle Werte von Zahlem in die. toc-Datei aufzunehmen. Wird im dritten Argument also z. B. \ the \chapter geschrieben, expandieren diese Makros zu dem entsprechenden Wert, den sie im Quelltext haben. In diesem Kapitel wird also folgende Zeile in die . tocDatei geschrieben:
\ tocchapterentry{Erwei terungen von Plain-TEX}{14}{Seitenzahl}
Die Verwendung des \wri tenumberedtocentry-Makros macht eine Redefinition der \ tocpartentry-Makros erforderlich, urn den Inhalt des dritten Argumentes auswerten zu konnen.
Wenn nach einem Ubersetzungslauf die. toc-Datei existiert, sollte sie mit dem Makro \readtocfile an der entsprechenden Stelle im Quelltext eingelesen werden, an der das Inhaltverzeichnis gesetzt werden solI.
Durch \rewri tetocfilefalse wird ein emeutes Schreiben der . toc-Datei unterbunden, was sich empfiehlt, wenn das Inhaltsverzeichnis am Ende des Dokumentes eingebunden werden solI.
Querverweise
Querverweise stellen ein sehr machtiges Werkzeug zur Orientierung in umfangreichen Dokumenten dar. Mit TEX ist es auf einfache Weise moglich, auf bestimmte Seiten, Kapitel, Abschnitte, Gleichungen oder ahnliche Strukturen zu verweisen.
Querverweise werden in einer Datei mit der Extension aux verwaltet. Diese Datei wird von den ePlain-TEX-Befehlen automatisch gelesen und danach emeut geschrieben, so daB nach zwei Ubersetzungen die aktuellen Referenzen vorhanden sind.
ePlain-TEX verwendet bei der Verwaltung der Querverweise ein Verfahren, das dem von Jt\TPC weitgehend entspricht. Die Label dtirfen aus Zeichen der Kategorieklassen 3, 4, 7, 8, 10, 11 und 12 bestehen, jedoch keine Zeichen der anderen Klassen enthalten. (Die Zeichen %\{} sind verboten.)
An den Stellen des Quelltextes, auf die Bezug genommen werden soli, werden Markierungen (Label) angebracht. Mittels bestimmter Referenzbefehle konnen dann die relevanten Informationen gewonnen werden. Die folgenden Beispiele zeigen die Arbeitsweise:
Diese Seite wird mit dem Befehl \xrdef{bsp-sei te} markiert.
\@definelabel{bsp-seite}{263}{page}
Der Befehlsaufruf \xrefn{bsp-sei te} fligt dann ,,263" in den Text ein. Wurde zuvor ein "word" -Befehl flir diesen Labeltyp definiert (hier ist es der Typ "page", siehe unten), also z. B. \def\pageword{Sei te}, dann generiert \ref{bsp-sei te}: Seite 263.
Allgemein werden Label mit dem Befehl \definexref definiert. Dieser Befehl verfligt tiber drei Argumente: das erste Argument enthalt den Markierungstext, wie er in den Referenzbefehlen angegeben wird. Das zweite Argument kann einen beliebigen Eintrag enthalten, tiblicherweise wird hierin der Wert (eines Zahlers) der Gliederungsstruktur tibergeben. Das dritte Argument zeigt schlieBlich den Typ des Labels an. Label, die sich auf Abschnitte beziehen, sollten yom Typ "section" sein, solche flir Kapitel "chapter", und flir Beispiel konnte der Typ "example" angegeben werden.
264 Kapitel 14. Erweiterungen von Plain-T e<
\def\eplainref{\©generalref{}}% \def\refs{\©generalref s}% \def\©generalref#1#2{%
}%
\readauxfile \edef\temp{\getproperty{\xrlabel{#2}}{class}}% \expandafter\ifx\csname \temp word\endcsname\relax \else
\csname \temp word\endcsname #1\penalty\©M \
\fi \refn{#2}%
Ein Beispiel: Hier wird mittels \definexref{bsp}{1}{example} ein Label definiert. In die. aux-Datei wird die Zeile \©definelabel{bsp}{1}{example} geschrieben. Der Aufruf von \ref{bsp} expandiert zu 1. Falls der korrespondierende "word"Befehl existiert, (\def\exampleword{Beispiel}) wird "Beispiel 1" gesetzt.
Folgende "word"-Befehle sollten bereitgestellt werden:
\def\pageword{Seite} \def\chapterword{Kapitel} \def\sectionword{Abschnitt} \def\subsectionword{Unterabschnitt}
Weitere Referenzbefehle sind:
• \refn und \xrefn (Synonym). Sie referenzieren den im zweiten (~ummer-) Argument des Befehls \definexref enthaltenen Wert: \refn{bsp} liefert "Beispiel I", wohingegend \refn{bsp-sei te} zu ,,263" expandiert.
• \refs (Definition siehe oben) erzeugt Beispiels 1 (Beispiel mit "s" am Ende). Urspriinglich wurde das Makro fUr die englische Sprache entwickelt, so daB eine Anpassung sinnvoll sein konnte, z. B. in der Form: \def\refs{\©generalref e}
• \xref ist ein spezieller Referenzbefehl fUr "page"-Label: \xref{bsp-sei te} setzt "p. 263". Die voreingestellte Befehlsdefinition zeigt die nachste Abbildung.
Wird stattdessen \def\xref{S. \thinspace\xrefn} definiert, erzeugt der Aufruf \xref{bsp-sei te} entsprechend "S. 263". Auf Label anderer Typen angewendet werden mit diesem Befehl unsinnige Ausgaben produziert: \xref{bsp} erzeugt "S. 1".
Nicht existierende Label-Marken erzeugen voreingestelltermaBen Warnungen: \ref {nicht existierender Label} wird als 'nicht existierender Label' (was so ebenfalls auf dem Terminal ausgegeben wird) gesetzt, wenn nicht zuvor die Meldungen mit \xrefwarninigfalse unterdruckt wurden.
Fur mathematische Gleichungen existieren entsprechende Befehle, die das Verweisen auf einzelne Gleichungen oder auch Gleichungsteile ermoglichen.
14.4 Makros fOr logische Strukturen 265
\def\xrefn#1{% \readauxfile
}%
\expandafter \ifx\csname\xrlabel{#1}\endcsname\relax \if@citewarning
\message{\linenumber Undefined label '#1' .}% \fi \expandafter\def\csname\xrlabel{#1}\endcsname{%
'{\tt
}% \fi
\escapechar = -1 \expandafter\string\csname#1\endcsname
}'%
\csname\xrlabel{#1}\endcsname % Always produce something.
\let\refn = \xrefn \def\xref{p.\thinspace\xrefn}%
Oas Stichwortverzeichnis: Index Stichwortverzeichnisse stellen eine weitere, nicht triviale Aufgabe beim Satz komple
xer Dokumente dar. Indexeintrage werden im Quelltext markiert (oder unsichtbar eingefiigt), und TE,X erzeugt bei der Ubersetzung eine exteme Datei mit den Stichworten und den Seitenzahlen, auf denen das Stichwort auftritt. Diese Stichwortdatei wird - zumeist mit einem speziellen Programm (oft wird make index hierfur verwendet) - sortiert. Dabei werden die Stichworte alphabetisch (und eventuell in mehreren Ebenen) sortiert, gleiche Stichworte werden zusammengefaBt, und die Seitenzahlen werden auf eine spezielle Weise zusammengestellt. Diese Daten werden in eine exteme Datei geschrieben, welche dann bei der nachsten Ubersetzung in das Dokument eingebunden werden kann.
ePlain-TEX erlaubt die Verwendung mehrerer Indexdateien. So wird fUr dieses ein Index fiir die normalen Stichworte gefiihrt und ein weiterer fUr die Kontrollsequenzen. Dadurch ist es wesentlich einfacher, bestimmte Informationen gezielt aufzusuchen.
ePlain-TEX verwendet voreingestellt die Indexdatei . idx. Jeder weitere Index wird mit dem Befehl \defineindex{Kennhuchstabe} eingefUhrt. Fur jeden Index werden automatisch mehrere Befehle definiert. (In den folgenden Ausfuhrungen berucksichtigen wir nur den Default-Index, fUr aile weiteren gilt analoges. Der Buchstabe "i" wird dann durch den entsprechenden ersetzt.)
Der Indexbefehl \idx schreibt den im Argument enthaltenen Text sowohl in die. dviDatei als auch in die Indexdatei.
\idx{Index} erzeugt in der . idx-Datei folgende Zeile:
\indexentry{Index}{265}
Der zweite Indexbefehl stellt eine stille Variante von \idx dar: \sidx erzeugt keinen Text in der . dvi-Datei, wohl aber einen Eintrag im Indexfile. Dabei kann der Eintragstyp bei dies em Befehl genauer spezifiziert werden.
266 Kapitel 14. Erweiterungen von Plain-T e<
\sidx{Index} [EintragJ erzeugt folgende Zeile in der . idx-Datei:
\indexentry{Index!Eintrag}{265}
Das ,,!"-Zeichen dient dem make index als Indikator fUr Untereintrage; die Zeile oben wird also interpretiert als "Eintrag »Index« mit dem Untereintrag »Eintrag«".
make index kann Eintrage in drei Ebenen verwalten. Sie konnen deshalb auch den folgenden Code eingeben \sidx{Eintrag! Index! manuell} und erhalten dann:
\indexentry{Eintrag!Index!manuell}{266}
Ftir die Eingabe von Namen wurden zwei spezielle Befehle bereitgestellt: \idxname und \sidxname. Der Befehl wird folgendermaBen verwendet.
\sidxname{Vorname}{von Nachname} [UntereintragJ generiert:
\indexentry{von Nachname\idxnameseparator Vorname!Untereintrag}{266}
\idxnameseparator ist mit dem Kommazeichen vorbelegt. Oft ist es sinnvoll, bestimmte Indexeintrage unter einem bestimmten Schliisselwort ein
zusortieren, dort aber eine andere Darstellungsform zu verwenden. Z. B. sollte der Eintrag rEX unter TeX erscheinen, aber als \ TeX-Logo gesetzt werden.
Die Befehle \idxmarked und \sidxmarked sind fUr diese Aufgabe vorgesehen. Beide Befehle verwenden ein yom Anwender definiertes Formatierungsmakro fUr die Darstellung der Indexeintrage. Dieses Formatierungsmakro verftigt tiber ein Argument, das die bei der Sortierung berucksichtigte Form des Indexeintrags enthalt. 1m obigen Beispiel wtirde folgende Form zum gewtinschten Ergebnis fUhren:
\def\idxformat#1{\csname #1\endcsname} \idxmarked\idxformat{TeX}
\idxformat{TeX} wird als TEX dargestellt. In der . idx-Datei steht dann folgende Zeile:
\indexentry{TeX@\idxformat {TeX}}{266}
Die gleichen Indexeintrage konnen nattirlich auch durch das direkte EinfUgen des ,,@"Zeichens in den - stillen - Indexbefehl erzeugt werden. ,,@" trennt den Sortierschliissel yom dargestellten Eintrag.
Urn eines der Indexsonderzeichen ,,!", ,,©" oder ,,1" darzustellen, wird ihnen ein ,,"" vorangestellt. Das gilt auch fUr die Darstellung des,,"" -Zeichens, es wird verdoppelt.
\idxsubmarked und \sidxsubmarked sind Varianten dieser Befehle fUr die formatierte Darstellung von Untereintragen.
Die ePlain-rEX -Indexbefehle verfUgen tiber weitere Features. Eines wollen wir hier noch vorstellen: AIle Indexbefehle verftigen tiber ein optionales Argument, das - wenn es vor dem ersten, in {}-Klammem angegebenen auftritt - die Art des Indexeintrags genauer spezifizieren kann. Die komplette Syntax des \idx-Befehls lautet also
\idx [SpezifizierungJ [EintragJ [UntereintragJ
Spezifizierung kann die folgenden Schliisselworte enthalten:
• begin oder end: Mit diesen Schltisseln werden Bereiche gekennzeichnet, in denen der Eintrag mehrfach auf tritt, jedoch nicht immer markiert wurde. Die Angabe der
14.4 Makros fOr logische Strukturen 267
Schlussel bewirkt, daB im Index ein ,,-" -Strich (-- "bis") zwischen der Seitenzahl fOr die erste und letzte Angabe gesetzt wird.
auf Seite 17: \idx [begin] {Indexeintrag} und auf Seite 25: \sidx [end] {Indexeintrag} bewirkt: Indexeintrag 17-25
• see: Hiermit wird ein Verweis auf einen anderen Indexeintrag gegeben. \idx[see] {Eintrag} [Index] {Indexeintrag}
erzeugt in der . idx-Datei:
\indexentry{Eintrag! Index I indexsee{Indexeintrag}}{9999 9}
Vor dem Querverweis wird der Inhalt des Makros \idxseecmdword eingeftigt; dieses ist folgendermaBen vordefiniert:
\def\idxseecmdword{see}%
• seea!so kombiniert die Eigenschaften von see mit den normalen Verweisen. Neben dem Querverweis werden auch noch die entsprechenden Seitenzahlen eingeftigt. Vor dem Querverweis wird der Inhalt des Makros \idxseea!socmdword gesetzt:
\def\idxseea!socmdword{seea!so}%
• pagemarkup=Typ: Mittels dieses Schlusselwortes kann eine bestimmte Formatierung der Seitenzahl, die mit dem Stichwort in die. idx-Datei geschrieben wird, festgelegt werden. Mit diesem Verfahren werden z. B. in [4] und [7] die Seitenzahlen, auf denen die Definition eines Makros gezeigt wird, unterschieden (kursiv, fett oder unterstrichen dargestellt) von denen, auf denen das Makro angewendet wird (normal gesetzt), obwohl die Seitenzahlen alle hinter demselben Stichwort erscheinen.
Fur den Typ muG ein Makro mit genau einem Argument (der Seitenzahl des Eintrags) definiert werden:
\def\defPage#1{{\bf #1}}
Das MakrO wird dann in der . idx-Datei angewendet: \sidx [pagemarkup=defPage] {bsp} erzeugt auf Seite 222: \indexentry{bsp I defPageH222}, was als \i tem bsp \pfil! \defPage{22} im Index gesetzt wird.
Fur die Indexerstellung stellt ePlain-TEX noch einige hilfreiche Makros zur Verfugung. \indexproofterm ist ein Makro, das den in seinem Argument enthaltenen Text in
einer \hbox setzt und mit dem Befehl \indexprooffont (default emtt8) formatiert darstellt. Wird dieser Befehl zusammen mit den Indexbefehlen angewendet, kann ePlainTEX eingesetzt werden, urn die tatsaehlieh verwendeten Indexeintrage im Dokument zu kennzeichnen.
\indexproofingtrue ist ein Schalter, der die ePlain-TEX-Indexmakros veranlaBt, ihren Inhalt in den Seitenrand zu schreiben. Dadurch konnen Fehler bei der Indexmarkierung leichter aufgekliirt werden. Die Voreinstellung ist \indexproofingfa!se.
Den Index sortieren Nachdem die rohe Indexdatei durch das Ubersetzen des Quelltextes erstellt wurde, wird
sie sortiert. Fur diese Aufgabe bietet sich der Indexprozessor make index von Pehong
268 Kapitel 14. Erweiterungen von Plain-T g<
Chen an. Wir sehen hier von einer ausfUhrlichen Beschreibung des Programmes ab, da sie den Rahmen sprengen wtirde und die Programmdokumentation (einschlieBlich manpages) sehr ausfUhrlich ist. In [4] und [7] werden Anwendungsbeispiele gegeben.
Die rohe Indexdatei wird mit dem Befehlsaufruf
make index eingabe.ist
bearbeitet. Dabei entsteht neben der Ausgabedatei eingabe. ind noch eine . ilg-Datei, die zusatzliche Informationen zur Indexbearbeitung enthiHt.
Auf dem Terminal erscheinen Meldungen der Form:
This is make index , portable version 2.12 [26-May-1993]. Scanning input file eingabe.idx .... done (100 entries accepted, o rejected). Sorting entries ... done (100 comparisons). Generating output file eingabe.ind .... done (80 lines written, o warnings). Output written in eingabe.ind. Transcript written in eingabe.ilg.
Die rohe Indexdatei kann auch unter Verwendung einer Indexstildatei bearbeitet werden, diese enthiilt dann Angaben tiber das Format der Eingabedatei und konfiguriert die Darstellung des Stichwortverzeichnisses.
make index -sStildatei eingabe. ist
Die Verwendung einer Stildatei (hier gind. i st) wird durch folgende Zeile auf dem Terminal dokumentiert:
Scanning style file gind.ist ..... done (13 attributes redefined, 3 ignored).
Den sortierten Index einbinden
Nachdem der Index sortiert in einer Datei mit der Extension. ind vorliegt, kann er in das Dokument eingebunden werden. ePlain-TEX hat dazu den \readindexfile{i}Befehl definiert. {i} kennzeichnet den verwendeten Index, wie oben beschrieben.
Je nach der verwendeten Indexstildatei treten im sortierten Indexfile Formatierungsbefehle auf, die zuvor definiert werden mtissen. (Tatsachlich dient die Indexstildatei u. a. dazu, die geeigneten Befehle in die sortierte Indexdatei zu schreiben.) Bei der Verwendung der Standard-Indexstildatei gind. ist sind folgende Definitionen notwendig:
\let\bfseries\bf \let\nopagebreak\nobreak \let\pfill\dotfill \let\efill\dotfill
Mit den weiter unten beschriebenen Makros fUr den Mehrspaltensatz sind so auf einfache Weise drei- oder vierspaltige Stichwortverzeichnisse darstellbar. Voreingestellt ist der zweispaltige Satz.
14.4 Makros fOr logische Strukturen 269
Einfache Tabellen ePlain-TJY( stellt fUr den Tabellensatz ein einziges Makro \makecolumns zur Verfti
gung. Dieses Makro ist geeignet, einfaehe Tabellen mit wenig Aufwand darzustellen. Das \makecolumns-Makro weist eine etwas gewohnungsbedtirftige Syntax auf: Es
verftigt tiber zwei Argumente, von denen das erste mit einem "/,, begrenzt wird und das zweite dureh: ,,: u" (ein Doppelpunkt gefolgt von einem Leerzeiehen). Beide Argumente sind ganze Zahlen; das erste enthalt die Anzahl der zu bearbeitenden Eintrage, das zweite die Anzahl der zum Satz verwendeten Spalten. Dies ist der Quelltext fUr die folgenden Abbildungen:
1. Eintrag 2. 3. \bf fett 4. 5. 6. 7. 8. 9. 10. 11. letzter Dieser Text steht hinter dem letzten Eintrag.
Die linke Abbildung wird in einer 33mm breiten, die reehte in einer 92mm breiten Box gesetzt, die folgenden Beispiele dann in 60mm breiten Boxen:
\makecolumns12/2: \makecolumns12/6: erzeugt: 1. Eintrag 7. 1. Eintrag 3. fett 5. 7. 9. 11. 2. 8. 2. 4. 6. 8. 10. letzter 3. feU 9. 4. 10.
Dieser Text steht hinter dem letzten Eintrag.
5. 11. 6. letzter
Dieser Text steht hinter dem letzten Eintrag.
\makecolumns12/4: erzeugt: l. Eintrag4. 7. 10. 2. 5. 8. 11. 3. fett 6. 9. letzter
\makecol umns 12/3: erzeugt: l. Eintrag 5. 9. 2. 6. 10. 3. fett 4.
7. 8.
11. letzter
Die obigen Beispiele zeigen die Wirkung des \makecolumns-Makros: stets werden die Tabellen in der Breite der umgebenden Box (\hsize) erzeugt, und alle Spalten haben die gleiche Breite. Textzeilen, die naeh der Tabelle folgen, werden als eigenstandige Absatze formatiert.
270 Kapitel 14. Erweiterungen von Plain-T g<
Literaturzitate und -verzeichnisse
Die Verwaltung der Literaturzitate und -verzeichnisse erfolgt weitgehend analog zu derjenigen in k\TpC Diese ist z. B. in [4] und [7] ausfiihrlich dargestellt. Wir werden im folgenden nur die wichtigsten Konzepte vorstellen.
Literaturverzeichnisse konnen manuell erstellt (siehe [7]) oder aus Literaturdatenbanken extrahiert (siehe [4] und [8]) werden. Das Ergebnis dieser Arbeit stellt eine Umgebung yom Typ \thebibliography (in k\T~) oder \References (ePlain-TEX) dar, innerhalb der durch \bibi tem-Makros getrennt, die Literaturzitate einzeln aufgefiihrt sind.
\bi bi tern [optionale Listenmarke] {Label fur ersten Eintrag} erster Eintrag \bibi tern [optionale Listenmarke] {Label fur zweiten Eintrag} zweiter Eintrag
Mit den optionalen Parametern der \bibi tem-Befehle konnen alternative DarsteIlungen der Zitatbezeichner gesetzt werden. Label fur . .. ten Eintrag enthalt die Markierung, mit der im \ci te-Befehl auf diesen Eintrag verwiesen wird, siehe unten.
1m wesentlichen handelt es sich bei der \thebibliography- oder \ReferencesUmgebung urn eine Listenstruktur. Jeder einzelne Eintrag in dieser Liste besteht aus einem Label, dem Zitatbezeichner und dem dazugehorenden Textblock, der in konsistenter Weise aIle Zitate darstellt. So konnen z. B. aIle Autorennamen durch Kapitalchen gekennzeichnet werden, Buchtitel kursiv gesetzt werden und ahnliches mehr.
Die in der Literaturliste definierten Label konnen innerhalb des Dokumentes referenziert (d. h. auf sie kann verwiesen) werden. Dazu wird der \ci te-Befehl verwendet. Diesem Befehl wird in geschweiften Klammern ein - analog zu den Querverweisen definierter - Bezeichner tibergeben, z. B.:
\cite{texbook}
Existiert in der Literaturliste ein \bibi tem-Befehl, der das gleiche Argument hat, also
\bibitem{texbook} ... ,
dann expandiert der \ci te-Befehl zu dem Zitatbezeichner, hier also [1], siehe Literaturverzeichnis. Der \ci te-Befehl schreibt den im Argument enthaltenen Bezeichner als
\ci tation{Bezeichner}
in die. aux-Datei, die dann von BIBTEX bearbeitet wird (siehe unten). Die Darstellung der Zitatbezeichner IaBt sich in vielf<iltigster Weise voreinstellen, eben
so wie das Format der Literaturzitate in der Literaturliste, so daB aIle geforderten Darstellungen moglich sind.
Die folgenden Kontrollsequenzen beeinftussen die Darstellung der Literaturzitate im Text und in der Literaturliste.
Darstellung von Literaturzitaten im Text andern Die Darstellung der Zitatbezeichner durch den \ci te-Befehl wird durch die folgenden
Befehle gesteuert: Die Makros \printci testart und \printci tefinish definieren diejenigen Zeichen, die vor und nach dem entsprechenden Zitatbezeichner gesetzt werden. Voreingestellt sind die Zeichen ,,[" und ,,]".
14.4 Makros fOr logische Strukturen 271
Das Makro \printbetweenci tations wird expandiert, wenn mehrere Zitate nacheinander angegeben werden, wenn also z. B.
\cite{texbook, texprogram}
geschrieben wird, was als [1, 2] dargestellt wird. Voreingestellt ist ein Komma, gefolgt von einem Leerzeichen.
Es bleibt noch anzumerken, daB der \ci te-Befehl tiber ein optionales Argument verfiigt, das das Literaturzitat weiter konkretisiert: \ci te [Sei te 17] {texbook} wird als [1, Seite 17] dargestellt.
\printci tenote: Dieses Makro hat ein Argument, welches eine optionale Note (Anmerkung zum Zitat) darstellt. Es wird nur dann ausgefiihrt, wenn das optionale Argument des \cite-Befehls verwendet wird.
K. Berry schHigt vor, hochgestellte Zitate durch folgende Definition zu realisieren:
\def\printcitestart{\unskip$-\bgroup} \def\printcitefinish{\egroup}$ \def\printbetweencitations{,} \def\printcitenote#1{\hbox{\sevenrm\space (#1)}}
Literaturlisten mit Bm'IEX erstellen Das Extrahieren von Literaturlisten aus Literaturdatenbanken wird von ePlain-TljX mit
mehreren Befehlen untersttitzt, die wir hier vorstellen wollen. Zunachst werden wir jedoch noch einmal kurz auf die Arbeitsweise von BIBTljX eingehen.
BIBTljX liest . aux-Dateien, durchsucht diese nach den unten beschriebenen Schltisselworten und bearbeitet dann eine Literaturdatenbank. Diese Literaturdatenbank ist in einer (oder mehreren) Dateien mit der Extension. bib enthalten. Das Ergebnis dieser Bearbeitung ist eine lokale Literaturliste, die in einer Datei mit der Extension . bbl gespeichert wird. Werden in einem Dokument - z. B. einem Sammelwerk mehrerer Autoren - mehrere Literaturverzeichnisse benotigt, konnen ftir diese tiber das Makro \bblfilebasename unterschiedliche Dateinamen (z. B. kapitelweise) ftir die einzelnen . bbl-Dateien angegeben werden.
Das Makro \bibliography hat eine zweifache Funktion: einerseits schreibt es den Inhalt seines Argumentes in die. aux-Datei, andererseits versucht es, eine . bbl-Datei mit dem entsprechenden Namen in das Dokument einzubinden, also die lokale Literaturliste darzustellen.
Uber BIBTljX-Steuerdateien (sie werden auch als BIBTljX-Styles bezeichnet und haben die Dateiextension . bst) wird die Formatierung und Extraktion gesteuert.
Die Information dartiber, welche . bst-Datei von BIBTljX beim der Erstellen der . bblDatei verwendet werden solI, wird mit dem \bibliographystyle-Befehl innerhalb des Quelltextes festgelegt. Der Inhalt des Befehlsargumentes wird in der Form \bibstyle {Sti!} in die. aux-Datei geschrieben, wo BIBTljX sie findet und auswertet. In [8] werden zahlreiche, an die deutsche Sprache angepaBte, Varianten der . bst-Dateien vorgestellt. Die enge Zusammenarbeit von ePlain-TljX und BibTeX macht folgende Arbeitsweise notwendig:
272 Kapitel 14. Erweiterungen von Plain-T g<
eplain datei bibtex datei eplain datei eplain datei
erzeugt: datei. aux liest datei. aux und erzeugt: datei. bbl liest datei . bbl ein, Referenzen noeh undefiniert Referenzen eingeftigt, fertig
Der Befehl \noci te wird in Quelltexten eingesetzt, urn nieht dargestellte (nieht zitierte) Literaturquellen in die Literaturliste aufzunehmen. Der Befehl sehreibt analog zum \ci te-Befehl eine \ci tation-Zeile in die. aux-Datei. Von besonderer Bedeutung ist die Angabe \noci te{ *}: sie bewirkt, daB aile Literaturzitate aus der Literaturdatenbank in die. bbl-Datei tibemommen werden. \xrefwarningfalse unterdrtiekt Wamungen, die von ePlain-TEX generiert werden, wenn auf in der Literaturliste nicht definierte Zitate verwiesen wird.
Literaturverzeichnisse formatieren
Die Darstellung der Literaturlisten unterliegt ahnlichen Anforderungen wie die der Label im Text. ePlain-TEX definiert zahlreiche Befehle, die die Formatierung dieser Liste steuem. \biblabelwidth ist ein \dimen-Register, das die Breite des langsten Label in der Literaturliste angibt. \biblabelprint formatiert den im Argument enthaltenen Bezeichner als Label. Das Makro kann redefiniert werden, wenn z. B. die eingefUgten Abstande verandert werden sollen. Es arbeitet eng mit dem folgenden Befehl zusammen, wie die Definition zeigt.
\def\biblabelprint#l{\noindent \hbox to \biblabelwidth{%
\biblabelprecontents \biblabelcontents{#l}% \biblabelpostcontents}%
\kern\biblabelextraspace}%
\biblabelprecontent und \biblabelpostcontents sind mit . bst-abhangigen Definitionen belegt. Fur numerische Label wird z. B.
\let\biblabelprecontents = \hss \let\biblabelpostcontents = \relax
definiert. Sie konnen fUr besondere Darstellungen angepaBt werden. \biblabelextraspace wird bei der Formatierung der Literaturliste mit "hangendem
Einzug" zusatzlieh eingefUgt. Voreingestellt sind 0.5 em. \biblabelcontents formatiert den im Argument vorhandenen Eintrag. Voreinge
stellt dazu ist die Verwendung des Befehls \bblrm, altemativ konnen auch die Befehle \bblem, \bblsc oder analog definierte Makros eingesetzt werden.
\def\biblabelcontents#l{{\bblrm [#1]}}% \def\bblrm{\rm}% \def\bblem{\it}% \def\bblsc{\ifx\©scfont\©undefined
\font\©scfont = cmcscl0 \fi \©scfont}%
14.4 Makros fOr logische Strukturen 273
\bibnewblock separiert die einzelnen Komponenten eines Eintrags in der Literaturliste. Dieser Befehl wird z. B. zwischen der Darstellung des Autornamens und des Titels, des Titels und der Vedagsangabe usw. ausgefiihrt.
\def\bblnewblock{\hskip .11em plus .33em minus .07em }%
Bleibt noch das Makro \bblhook. Es wird vor dem Einlesen einer . bbl-Datei expandiert und kann verwendet werden, urn bestimmte Einstellungen (z. B. die GroBe des \parindent) festzulegen oder urn Fonts zu aktivieren. Die VoreinsteHung bewirkt nichts.
\let\bblhook = \empty
Dieses Makro wird mittels \def-Befehlen definiert.
Mehrspaltensatz
Die Formatierung mehrspaltiger Dokumente steHt eine nicht triviale Aufgabe dar. Umso bemerkenswerter ist die Tatsache, daB ePlain-TEX Makros fUr die ein- bis vierspaltige Formatierung enthalt.
Der Zweispaltensatz wird mit dem Makrobefehl \doublecolumns eingeleitet.
Entsprechendes gilt fUr den dreispalten Satz, der durch \triplecolumns begonnen wird und fUr
den Vierspaltensatz, der nach \quadcolumns-Befehlen verwendet wird.
\singlecolumn wechselt dann wieder in die gewohnte Satzform zurUck.
Eine Spalte kann durch den Befehl \ col umnf ill so mit Leerraum aufgefUHt werden, daB der Satz in der nachsten Zeile weiter geht.
Die einzelnen Spalten werden urn den im Makro \gutter enthaltenen Llingenwert (voreingesteHt 2 pc) voneinander ge-
trennt gesetzt. Vor einem Textblock im Mehrspaltensatz wird der vertikale Abstand \abovedoublecolumnskip eingefUgt, \belowdoublecolumnskip anschlieBend.
VoreingesteHt ist fUr beide Makros der Wert \bigskipamount.
Die Formatierung sehr schmaler Spalten steHt ein schwieriges typografisches Problem dar, wie die Beispiele oben zeigen. Sie konnen TEX die Arbeit erleichtern, indem Sie folgende - dem U\Tpc-Befehl \sloppy entstammenden - Makros vor dem Satz dieser Spalten aufrufen:
\tolerance9999 \emergencystretch3em \hfuzz.5pt
274 Kapitel 14. Erweiterungen von Plain-T e<
14.5 Diverses ePlain-TEX stellt noch weitere Befehle fUr Anwender und Programmierer zur Verfii
gung. Wir werden die wichtigsten auf den folgenden Seiten kurz beschreiben.
Boxen Schwarze Quadrate (.), wie sie in nicht numerierten Listen angewendet werden, k6nnen
mit \blackbox erzeugt werden. Fiir die Darstellung nicht ausgefiillter Boxen wurde der Befehl \makeblankbox de
finiert. Er ben6tigt zwei Angaben tiber die Breite und H6he der leeren Box. Die Konstruktion bezieht sich auf die \boxO, deren Inhalt ignoriert wird. Diese ist deshalb zuvor entsprechend zu initialisieren.
ePlain-TEX stellt eine Variante des \boxi t-Makros zur Verfiigung:
\long\def\boxit#l{% \vbox{%
}% }%
\ehrule \hbox{%
\evrule \kern\boxitspace \vbox{\kern\boxitspace \parindent Opt #l\kern\boxitspace}% \kern\boxitspace \evrule
}% \ehrule
So wurde [ BOXIT [ durch \boxi t{\hbox{BOXIT} erzeugt. Die Makros \ehrule und \evrule werden zur Konstruktion verwendet.
Verbatimes Die Problematik bei der Darstellung verbatimen Materials wurde in Abschnitt 12.6
erHiutert. ePlain-TEX unterstiitzt den Anwender mit einigen sehr hilfreichen Befehlen. Zwischen den Befehlen \verbatim und I endverbatim kann beliebiger 7-Bit-Code
stehen. (8-Bit-Zeichen erzeugen Fehlermeldungen.)
\verbatim%&#@-Iendverbatim erzeugt: %&#@-
Der escape character fUr die I endverbatim-Zeichenkette wird in dem \catcodebasierenden Makro \ verbatimescapechar mit I vorbelegt. \ verbatimescapechar\@ definiert @ fUr diesen Zweck.
\listing ist ein Makro, das verwendet werden kann, urn eine exteme Datei im Quelltext verbatim darzustellen. Es wird analog zu \input verwendet, wobei die Syntax des jeweiligen Filesystems berticksichtigt werden muB. Die Datei wird zeilenweise eingelesen, gegebenenfalls werden Seitenumbriiche vorgenommen; \listing {. / gind. ist} erzeugt:
actual '=' quote' , level '!' preamble "\n \\begin{theindex} \n " %\\makeatletter\\scan@allowedfalse\n" post amble "\n\n \\end{theindex}\n" item_xl "\\efill \n \\subitem " item_x2 "\\efill \n \\subsubitem " delim_O "\\pfill" delim_l "\\pfill" delim_2 "\\pfill"
14.5 Diverses 275
% The next lines will produce some warnings when % running Makeindex as they try to cover two different % versions of the program: lethead_prefix "{\\bfseries\\hfil" lethead_suffix "\\hfil}\\nopagebreak\n" lethead_flag 1 heading_prefix heading_suffix headings_flag %%
"{\\bfseries\\hfil " "\\hfil}\\nopagebreak\n"
1
%% End of file 'gind.ist'. Weiterhin ist eine zeilenweise numerierte Darstellung der eingelesenen Datei mit dem
Makro \linenumberedlisting moglich. Das Makro \printlistinglineno bewirkt die Formatierung der Zeilennummem. Voreingestellt ist folgende Definition:
\def\printlistinglineno{\llap{[\the\lineno]\quad}}%
Zur Darstellung wird der im Makro \listingfont definierte Fontbefehl ausgefilhrt, sinnvoll sind hier in erster Linie die Schreibmaschinenschriften wie \ tt (Voreinstellung).
Das Makro \setuplistinghook wird vor dem Expandieren der ... listing ... -Befehle ausgefilhrt. Durch
\def\printlistinglineno{\llap{\sevenrm\the\lineno:\quad}} \let\setuplistinghook\linenumberedlisting
wird die eingelesene Datei mit kleinen (im Roman-Font gesetzten) Zahlen, die mit einem Doppelpunkt abgeschlossen sind, dargestellt.
Pfade: Technische Bezeichner umbrechen
Der Befehl \path wird zur Darstellung langer (technischer) Bezeichner verwendet, wie z. B. von email-Adressen. Der im Argument dieses Befehls stehende Text wird nur an den Stellen umgebrochen, die durch \discretionaries definiert werden. Voreingestellt ist \discretionaries '-@$%&- _: ; ,. ! ?'\!<>="*O{}[] ,
276 Kapitel 14. Erweiterungen von Plain-T g<
Dieser Befehl verwendet zur Begrenzung der Argumente ebenso wie der \path-Befehl das Zeichen I. Durch den Schalter \specialpathdelimi terstrue kann diese Voreinstellung veriindert werden.
Diagramme
DaB arrow. tex sehr wirksame Makros fUr das Setzen von (kommutativen) Diagrammen enthiilt, haben wir bereits in Abschnitt 12.24 gezeigt.
Wir wollen hier deshalb auf die Beschreibung der einzelnen Befehle verzichten und zeigen stattdessen ein weiteres Beispiel nebst Quelltext:
U v
u(U n V) (U n V)v
unv Unv
$$\hgrid=16pt \vgrid=8pt \sarrowlength=32pt \def\cross#1#2{\setboxO=\hbox{$#1$}%
\hbox to\wdO{\hss\hbox{$#2$}\hss}\11ap{\unhboxO}} \def\1#1{\11ap{$#1$\hskip.5em}} \def\r#1{\rlap{\hskip.5em$#1$}} \gridcommdiag{&&U&&&&V\cr &&\bullet&&&&\bullet\cr &&\sarrowlength=16pt\sline(O,1)&&&&\sarrowlength=16pt\sline(O,l)\cr &&\l{u(U\cap V)}\bullet&&&&\bullet\r{(U\cap V)v}\cr &&&\sline(2,-1)&&\sline(2,1)\cr &&\cross{=}{\sline(O,l)}&&\bullet&&\cross{=}{\sline(O,l)}\cr\cr &&\l{-{\textstyle u(U\cap v)}}\bullet&&\cross{=}{\sline(O,l)}&& \bullet\r{-{\textstyle(u\cap V)v}}\cr
&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)\cr \l{u}\bullet&&&&\bullet&&&&\bullet\r{v}\cr &\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)\cr &&\bullet&&&&\bullet\cr &&u\cap V&&&&U\cap v\cr}$$
Die Abbildung entsteht in einem Tabellenraster, wie Sie an den &-Zeichen erkennen.
Makros fOr den Mathematikmodus
Plain-TJY( bewirkt, daB abgesetzte Formeln (die durch $$ erzeugt werden) immer horizontal zentriert werden. Viele Layouts sehen aber eine linksbiindige Darstellung vor. ePlain-TJY( definiert dafUr den Befehl \leftdisplays, der ein Einriicken urn den Wert aus \leftskip plus \parindent plus \leftdisplayindent bewirkt. \leftdisplays
14.5 Diverses 277
redefiniert \displaylines, \eqalignno und \leqalignno so, daB linksbiindiger Satz entsteht.
ePlain-TEX steHt eine alternative Variante des \nicefrac-Makros unter dem Namen \frac zur Verfugung.
Fur die Darstellung von Gleichungsnummem werden drei Makros definiert: \eqprint setzt die Nummer in der Gleichung.
\def\eqprint#1{(#1)}%
lautet die VoreinsteHung, sie kann entsprechend den Anforderungen angepaBt werden. Der Parameter #1 wird durch den darzusteHenden Text (i. A. der Gleichungsnummer) ersetzt, die im Ganzzahlregister \eqnumber vorliegt. Hier sind auch die bei den Querverwei sen beschriebenen logischen Verweise moglich.
Programmierhilfen
Bei der TEX-Programmierung ist es oft notwendig, den kompletten Inhalt von Boxen auf dem Terminal (und im . log-File) sehen zu konnen, urn bestimmte Resultate zu verstehen. Der ePlain-TEX-Befehl \tracingboxes wurde fUr diesen Zweck definiert.
Aktive Zeichen konnen mit ePlain-TEX durch den Befehl \makeactive definiert werden: \makeacti ve'@ aktiviert das @-Zeichen. Zwei \catcode-Abkurzungen wurden definiert: \letter und \other stehen fUr die Kategorieklassen II und 12.
\uncatcodespecial wird verwendet, urn die urspriinglichen Kategorieklassen aller Zeichen zu restaurieren.
ePlain-TEX definiert fUr die Alloziierungs-Makros \new ... (count, skip, etc.) Versionen, die auch innerhalb von Makrodefinitionen wirksam sind. Dieser Mechanismus erstreckt sich auch auf Makrodefinitionen, die durch \innerdef\name{NAME} erfoIgen. name ist der Name des Makros, wahrend NAME die outer-Zeichenkette fUr das Makro darstellt.
Sehr niitzlich sind die folgenden Makros: \for bearbeitet iterativ eine durch Kommata separierte Liste von Eintragen, die mit \do terminiert ist. Das Argument des \do-Befehls enthalt die auszufUhrenden Befehle.
\for\name:= karl, karsten,kurt\do{% \message{\name}%
}
\def\namelist{ karl, karsten,kurt} \for\name:=\namelist\do{%
\message{\name}% }
schreibt" karl karstenkurt" auf das Terminal. Beachten Sie die Ausgabe des Leerzeichens vor karl und karsten. Die zweite Variante liefert dasselbe Ergebnis. " karl karstenkurt"
\gobble, \gobbletwo und \gobblethree sind "Dummy"-Makros", die 0, ein oder zwei Argumente verwerfen. Ahnlich funktioniert auch \eattoken, das genau ein (das)
278 Kapitel 14. Erweiterungen von Plain-T E'<
folgendes Token vernichtet: \eattoken{ ... } wiirde nur die offnende Klammer aus dem Eingabestrom entfernen.
\identi ty ist als \def\identi ty#1 {#1}% definiert; sinnvoll wird es z. B. dann eingesetzt, wenn die Redefinition eines Makros vorgesehen ist, die Voreinstellung jedoch keine besondere Funktion haben solI.
\sanitize wandelt die Expansion der folgenden Kontrollsequenz in eine Zeichenfolge (Kategorieklasse 11) urn, wie dies z. B. beim Schreiben in eine Datei notwendig ist.
\csn{Argument} ist eine Abkiirzung fiir \csnameArgument\endcsname. \ece{Token}{Argument} expandiert Token nach \csnameArgument\endcsname. \expandonce {Argument} ist eine Abkiirzung fiir \expandafter\noexpand{Argu-
ment}. Argument wird einmal expandiert. \hookaction, \hookappend, \hookprepend und \hookactiononce addieren die
folgende Kontrollsequenz zu der im Argument angegebenen Hookliste. \ifundefined fiihrt in Abhiingigkeit von der Existenz der folgenden Kontrollsequenz
die folgenden Befehle aus. Wie immer wird mit \else eine Alternative eingeleitet, \fi terminiert die Abfrage.
Jt\TPC verwendet einen funktionsgleichen Befehl, urn das Uberschreiben bestehender Kontrollsequenzen bei der Definition neuer zu verhindern. Schwartz hat in [3] einen entsprechenden \def-Befehl vorgestellt:
\let\AltesDef\def \AltesDef\def#1{\ifx#1\GanzBestimmtUndefiniert
\else \message{\string#1 ist bereits definiert} \fi \AltesDef#1}
\futurenonspacelet funktioniert wie \futurelet, ignoriert aber aIle Leerzeichen. \obeywhitespace wandelt Leerzeichen (und Zeilenumbriiche) im Quelltext in hori
zontalen Leerraum urn, auch dort, wo \obeyspaces versagt: am Anfang von Zeilen. \blanklineskipamount kann verwendet werden, urn den vertikalen Abstand von
Leerzeilen zu justieren. Der Wert wird als Argument eines \ vski p-Befehls eingesetzt. \hpenal ty fiigt explizit die im Argument iibergebenen Strafpunkte im horizontalen
Modus ein. Dafiir wird - wenn notwendig - \leavevmode ausgefiihrt. \ vpenal ty stellt die Variante zum Einfiigen von Strafpunkten im vertikalen Modus
(durch \par) dar. \loggingall ist ein Makro, das - analog zu \tracingall- den gesamten Weg von
Makroexpansionen darstellt. Diese werden aber nur in die .log-Datei geschrieben. \ tracingoff schaltet das Protokollieren von Makroexpansionen abo Weiterhin definiert ePlain-TEX zwei Tracing-Befehle mit globaler Wirkung:
\gtracingall aktiviert das Tracing, \gloggingall das Schreiben in die .log-Datei, unabhangig, ob die Befehle innerhalb einer Gruppe angewendet werden oder nicht.
Fiir die Verwendung in Hilfsmeldungen (error messages) ist das Makro \newlinechar vorgesehen. Es wird von ePlain-TEX als - - J (Zeilenumbruch) definiert.
14.5 Diverses 279
\setproperty und \getproperty wurden zum Setzen und Abfragen von properties (in LISP eingeftihrte Name/Wert-Paare) implementiert. Da TEX tiber keine eingebauten property-Mechanismen verftigt, werden diese Befehle selten verwendet.
\setproperty{atom}{name}{wert}\getproperty{atom}{name} erzeugt: wert
\iifileexists fUhrt in Abhangigkeit von der Existenz einer Datei die im folgenden Token beginnende Aktion aus. Das Makro wird durch \ testf ileexistence initialisiert.
\testfileexistence definiert einen Dateinamen, der sich aus dem \jobname (V oreinstellung) und der im Argument iibergebenen Extension zusammensetzt. Urn die Existenz einer . toc-Datei zu testen und sie - wenn vorhanden - einzuladen, wird folgender Code ausgefUhrt:
\testfileexistence{toc} \iffileexists\input \jobname.toc \fi
Die Flexibilitat dieser Abfrage laBt sich noch vergroBern, indem man auch den Basisnamen der Testdatei angibt. Dies ist moglich in Form eines optionalen Parameters des Befehls \ testfileexistence:
\testfileexistence [gind] {ist} \iffileexists\listing{gind.ist} \fi
Die Auswertung optionaler Befehlsparameter ist fUr Programmierer, die ePlain-TEX verwenden, einfach, wie das folgende Beispiel zeigt:
\def\@testfileexistence{\@getoptionalarg\@finishtestfileexistence}% \def\@finishtestfileexistence#l{%
}%
\begingroup \def\extension{#l}% \immediate\openinO =
\ifx\@optionalarg\empty\jobname\else\@optionalarg\fi \ifx\extension\empty \else .#l\fi \space
\ifeof 0 \global\@fileexistsfalse
\else \global\@fileexiststrue
\fi \immediate\closeinO
\endgroup
\let\testfileexistence = \@testfileexistence
\@getoptionalarg ist ein internes Makro zur Auswertung optionaler Befehlsparameter.
280 Kapitel 14. Erweiterungen von Plain-T E?<
Logos und andere Befehle Wird das Laden der texnames. tex-Definitionen ermoglicht (siehe Abschnitt 14.2),
konnen die folgenden Logos im Quelltext eingesetzt werden:
T}3X \TeX AMS-U\TPC \AMSLaTeX U\TPC \LaTeX AM5-T}3X \AMSTeX
METAFONT \MF b4MS-T}3X \LAMSTeX
\SliTeX \BibTeX
ePlain-T}3X stellt einfache Makros fUr den Flattersatz (siehe Abschnitt 6.6) bereit, sie sind als Altemativen der dort definierten \ragged ... -Makros anzusehen:
\center, \flushleft und \flushright werden innerhalb einer Gruppe angewendel. Sie
wirken ab dem Befehl bis zum Ende der Gruppe auf aIle
eingeschlossenen
Absatze, wie dieses Beispiel zeigt:
Gruppe angewendet. {\rm Sie\center wirken ab dem Befehl bis zum Ende der Gruppe auf alle
eingeschlossenen
Abs\"atze,} wie dieses Beispiel zeigt:
\monthname erzeugt den auf drei Zeichen abgekiirzten Namen des aktuellen Monats; \fullmonthname liefert den ganzen (englischen) Namen; eine Redefinition der Makros ist einfach:
\def\monthname{% \if case \month
}%
\or Jan\or Feb\or Mar\or Apr\or May\or Jun% \or Jul\or Aug\or Sep\or Oct\or Nov\or Dec%
\fi
\ timestring expandiert zu der Tageszeit, zu der die T}3X-Dbersetzung gestartet wurde. \timestamp erganzt diese urn das aktuelle Datum, das mit \today auch einzeln dargestellt werden kann.
\def\timestamp{\number\day\space\monthname\space \number\year\quad\timestring}%
\def\today{\the\day\ \fullmonthname\ \the\year}%
\numbername ist ein leicht an die Erfordemisse anpaBbares Makro, das Zahlen durch ihre Zahlworter darstelll. Werte, flir die keine Zahlworter definiert sind, werden als Zahlen dargestelll.
\def\numbername#1{\ifcase#1%
}%
zero% \or one \or five \or nine \fi
\or two \or six \or ten
\or three \or seven \or #1%
14.5 Diverses 281
\or four% \or eight%