\def\fileversion{1.0} \def\filedate{1-FEB-1993} \def\filename{trennung.tex} \meldedich \section{Trennungsprobleme} \p Die automatische Trennung von W"ortern beim Zeilenumbruch ist ein nicht-triviales Problem. K"onnen Sie mir sagen, was Sie in bezug auf \TeX\ bereits dar"uber wissen? \r Das will ich gerne tun. Soweit ich wei"s, arbeitet der Trennalgorithmus von \TeX\ nicht etwa mit einem W"orterbuch, sondern mit Trenntabellen, die aber je f"ur verschiedene Sprachen neu erstellt werden m"ussen. F"ur's Deutsche gibt es au"serdem noch \sty{german}. Ferner kenne ich Anwender, bei denen die Trennung im Deutschen ganz und gar nicht klappt; sie erhalten laufend "ubervolle \cs{hbox}es. Au"serdem habe ich manchmal Trennprobleme mit W"ortern, die Umlaute oder Bindestriche enthalten. Woran liegt das? \p Sie sprechen da verschiedene Dinge an, die nicht notwendigerweise zusammengeh"oren. Um die Zusammenh"ange zu kl"aren, sollten wir einmal den Trennungsmechanismus von \TeX\ n"aher betrachten. \r Ich bitte darum. \p Der Trennalgorithmus wird (unter bestimmten Umst"anden) w"ah"-rend des Zeilenumbruchs vorgenommen. \r Also sollten wir den Zeilenumbruch in groben Z"ugen kl"aren. \subsection{\TeX's Zeilenumbruch} \p Das wird leider nicht m"oglich sein\dots Vom Umbruchalgorithmus von \TeX\, behauptet \DEK, er sei der wohl interessanteste Aspekt des gesamten \TeX-Systems. Wir k"onnen hier nat"urlich nicht auf jedes Detail dieses komplexen, wahrlichen Meisterwerks der Programmierkunst eingehen, sondern wollen nur soviel beleuchten, um das von Ihnen dargelegte Problem hinreichend zu l"osen. Dies wird aber nicht in groben, sondern nur in gr"obsten Z"ugen gehen. \r Nur zu, ich bin ganz Ohr. \subsubsection{Die Elemente der horizontalen Liste} \p Dies rate ich Ihnen auch. \TeX{} bildet aus jedem von Ihnen geschrieben Absatz das, was man unter \TeX\ eine {\em horizontale Liste\/} ({\em horizontal list}) nennt. Diese horizontale Liste repr"asentiert den von Ihnen geschriebenen Absatz. Die Bestandteile einer horizontalen Liste sind: \begin{enumerate} \item Boxen ({\em boxes}); entweder solchen mit horizontaler Ausrichtung (\cs{hbox}) oder solchen mit vertikaler Ausrichtung (\cs{vbox}); \item Worttrennstellen ({\em discretionary breakpoints}); "ublicherweise Trennungsstriche; \item Kleber ({\em glue}), und zwar "ublicherweise zwischen W"ortern; \item Unterschneidungs-Elemente ({\em kerns}); "ublicherweise zwischen Buchstaben; \item Strafpunkte ({\em penalties}); sie bestimmen die Stellen des Zeilenumbruch entscheidend mit, wobei Stellen mit negativen Strafpunkten beim Zeilenumbruch bevorzugt werden, positive hingegen eher einen Zeilenumbruch verhindern; \item einige andere, f"ur uns hier nicht wichtige Elemente. \end{enumerate} Ein Zeilenumbruch kann nur an {\em glue}-, {\em kern}-, Strafpunkt- sowie Worttrennstellen erfolgen. \r Ich vermisse in Ihrer Aufz"ahlung etwas Wichtiges, n"amlich Buchstaben! \p Buchstaben werden von \TeX\ als Boxen angesehen. \r Aber woher kommen denn die ganzen anderen Elemente der horizontalen Liste? Buchstaben tippe ich selbst ein; Boxen mittels \cs{mbox}; Trennstellen mitunter auch mittels der Eingabe von \glq\verb|"-|\grq. \p Richtig, aber \TeX\ f"ugt in die horizontale Liste von sich aus weiter sog.\ "`leere Trennstellen"' ({\em empty discretionaries}) ein, und zwar nach jedem \glq{\tt -}\grq\ und jeder Ligatur, die mit einem \glq{\tt -}\grq\ endet. "`Leer"' hei"st diese Trennstelle deshalb, weil im Falle eines Zeilenumbruches an dieser Stelle kein Trennungsstrich eingef"ugt wird. \r Das erscheint sinnvoll, denn ein Divis ist meistens eine geeignete Trennstelle, bei der im Falle der Trennung kein weiterer Divis eingef"ugt werden sollte. Diese leeren Trennstellen sind also neben Wortzwischenr"aumen erlaubte Trennstellen? \p Grob gesprochen ist das so. (Es gibt allerdings noch Einschr"ankungen und weitere Trennstellen; diese k"onnen wir aber, da es uns ja lediglich aufs Gr"obste ankommt, nicht n"aher darlegen). \r Aber woher kommen {\em glue}, {\em kern\/} sowie Strafpunkte? \p Wenn Sie beispielsweise das Wort "`Schrift-Satz"' eingeben, so macht \TeX\ daraus den folgenden Eintrag in der horizontalen Liste. \begin{ogfudatim} \glue 4 plus 2 minus 1.33333 \cmr/m/n/12 S \cmr/m/n/12 c \kern-0.32639 \cmr/m/n/12 h \cmr/m/n/12 r \cmr/m/n/12 i \cmr/m/n/12 f \cmr/m/n/12 t \cmr/m/n/12 - discretionary \cmr/m/n/12 s \cmr/m/n/12 a \cmr/m/n/12 t \cmr/m/n/12 z \glue 4 plus 2 minus 1.33333 \end{ogfudatim} \r Der erste und der letzte {\em glue\/} wird wohl der zwischen W"ortern sein; {\em discretionary\/} vom Divis. Woher aber kommt der {\em kern}? \p Die {\em kern}-Informationen entnimmt \TeX\ aus der zu dem aktuellen Font geh"orenden {\tt .tfm}-Datei, die ihrerseits w"ahrend der Erzeugung der Schrift mittels \mf\ abf"allt. Hier hat der Schriftdesigner entschieden, zwischen dem \glq c\grq\ und dem \glq h\grq\ einen kleinen negativen Zwischenraum einzuf"ugen, der bewirkt, da"s das \glq c\grq\ ein wenig n"aher an das \glq h\grq\ ger"uckt wird. ({\em kern\/}s m"ussen nicht immer negativ sein; so wird beispielsweise zwischen einem \glq b\grq\ und einem \glq o\grq\ ein kleiner positiver {\em kern\/} gesetzt.) \r Und woher stammen die Strafpunkte? \p Eine gute Frage. Wenn Sie Ihrem Dokument den letzten Schliff geben, so werden Sie schon hin und wieder an passender Stelle beispielsweise das Kommando \cs{linebreak} benutzt haben\dots \r \dots um einen Zeilenumbruch zu forcieren. \p Ganz recht. Nun ist aber \cs{linebreak} im wesentlichen die Ab"-k"ur"-zung f"ur \cs{penalty-10000}, eine f"ur \TeX\ unendlich wenige Anzahl von Strafpunkte (da \TeX\ alle Strafpunkte von mehr als 10\,000 als unendlich viel und von weniger als $-10\,000$ als unendlich wenig ansieht). Daher findet an dieser Stelle ein Zeilenumbruch statt. Wenn Sie einen Zeilenumbruch zwischen zwei W"ortern unterbinden wollen, verwenden Sie das Band~\glq\verb|~|\grq; dies ist eine Abk"ur"-zung f"ur \cs{penalty10000}, also so hoch, da"s \TeX\ an dieser Stelle nie die Zeile umbricht. \r Erl"autern Sie mir den Zusammenhang von Strafpunkten und Zeilenumbruch bitte n"aher. \subsubsection{Absatzweise Optimierung} \p Beim Zeilenumbruch wird die umzubrechende Zeile in der Regel mehr oder weniger entweder gestreckt oder gestaucht. Dabei werden {\em Dehnpunkte} ({\em badness}) vergeben. Die Strafpunkte einer Zeile sind neben den Dehnungspunkten ({\em badness}) dieser Zeile sowie besonderen Spezial-Fehlpunkten der Zeile die bestimmenden Gr"o"sen f"ur den Zeilenumbruch. Aus beiden werden (mittels einer hier nicht n"aher vorgestellten Formel) f"ur jede Zeile die sog.\ "`Fehlpunkte"' ({\em demerits}) errechnet, die die typographische Qualit"at des Umbruch widerspiegeln. Je weniger Fehlpunkte \TeX\ errechnet, desto besser ist der Zeilenumbruch. \r Minimiert \TeX\ die Fehlpunkte einer Zeile und bricht demgem"a"s die Zeile um? \p Durchaus nicht. \TeX\ macht es sich bei weitem nicht so einfach wie andere zeilenumbrechende Programme. Es werden die Fehlpunkte nicht etwa zeilenweise minimiert, sondern {\em absatzweise}. \TeX\ verwandelt also stets einen kompletten Absatz in eine horizontale Liste und errechnet denjenigen Zeilenumbruch, der von allen m"oglichen Zeilenumbr"uchen dieses Absatzes die wenigsten Fehlpunkte aufweist. (Hier kann \TeX\ beispielsweise die o.\,g.\ Spezial-Fehlpunkte zuf"ugen: so erh"oht sich beispielsweise, falls bei einem Umbruch zwei aufeinanderfolgende Zeilen mit einem Trennungsstrich enden, die Anzahl der Fehlpunkte um den Wert \cs{doublehyphendemerits}, der in \LaTeX\ auf 10\,000 gesetzt ist.) \r Da hat \TeX\ aber beim Zeilenumbruch eine Menge Arbeit! \subsubsection{Der dreistufige Umbruchalgorithmus} \p So ist es. Hinzu kommt, da"s der Zeilenumbruch {\em dreistufig\/} erfolgt. Die erste Stufe versucht einen Absatz {\em ohne Worttrennung\/} zu realisieren; hier kommen als Trennstellen also im wesentlichen nur Wortzwischenr"aume und leere Trennstellen in Frage. Dieser Umbruch wird akzeptiert, falls die Dehnungspunkte jeder umgebrochenen Zeile einen einstellbaren Wert (\cs{pretolerance}) nicht "uberschreiten. In \LaTeX\ betr"agt ist \cs{pretolerance=100}. Ist diese auf einen negativen Wert gesetzt, so wird dieser erste Versuch nicht ausgef"uhrt. \r Wohl um im mehrspaltigen Satz, wo es ohnehin kaum einen Absatz ohne Worttrennung gibt, Zeit zu sparen. \p Genau deshalb. \r Was geschieht weiter, falls im ersten Versuch kein Umbruch gefunden wird, bei dem die Dehnpunkte einer jeden Zeile den eingestellten Wert \cs{pretolerance} unterschreiten? \p Dann versucht \TeX, weitere Umbruchstellen zu finden; als solche kommen dann zus"atzlich diejenigen Trennstellen in W"ortern hinzu, die \TeX\ durch seinen Trennalgorithmus findet. Mit diesen zus"atzliche Trennstellen versucht \TeX, den Absatz derart umzubrechen, da"s die Dehnungspunkte jeder Zeile den Wert \cs{tolerance} nicht "uberschreiten. (\cs{tolerance} ist "ublicherweise auf den Wert 200 gesetzt.) Auf spezielle Probleme, die den Trennalgorithmus von \TeX\ sowie das Zusammenspiel mit dem Zeilenumbruch betreffen, gehen wir sp"ater ein. \r Gut. Hier macht es aber offensichtlich keinen Sinn, \cs{tolerance} auf einen negativen Wert zu setzen. \p Ganz und gar nicht. Ein negativer Wert von \cs{tolerance} f"uhrt sogar zu einer Fehlermeldung. Aber wenn Sie \cs{tolerance=10000} oder h"oher setzen, wird auf den dritten Versuch verzichtet. \r Was passiert weiter, wenn auf diesen dritten Versuch verzichtet wird? \p Das h"angt von zwei weiteren einstellbaren Parametern, n"amlich \qcs{hfuzz} und \qcs{hbadness}, ab. Hierbei wird durch \cs{hfuzz}, welcher mit 0,1\,pt eingestellt ist, ein "Uberstand einer jeden Zeile erlaubt; jede Zeile darf also, ohne da"s \TeX{} meckert, 0,1\,pt l"anger als \cs{hsize} sein. Der Parameter \cs{hbadness} ist "ublicherweise mit $1\,000$ initialisiert. Wenn eine Zeile einen gr"o"seren "Uberstand als \cs{hfuzz} aufweist, erhalten Sie eine Meldung, die Sie auf eine \ttind{overfull}~\cs{hbox} hinweist; ist {\it badness\/} hingegen gr"o"ser als \cs{hbadness}, so h"alt \TeX{} die Zeile f"ur \ttind{underfull}. \r Das bringt mich auf eine Idee! Wenn ich beispielsweise im mehrspaltigen Satz mit kleiner Zeilenbreite sichergehen will, da"s keine Zeile eine \itind{badness} von mehr als 500 aufweisen soll, setze ich \cs{tolerance} auf einen hohen Wert und \cs{hbadness} auf 500. \TeX{} w"urde dann keine {\it overfull boxes\/} produzieren, aber mir eben die {\it underfull boxes\/} melden. \p Ja, aber wenn Sie Wert auf typographische Qualit"at legen\dots \r \dots werde ich vielmehr \cs{tolerance} auf einen etwas h"oheren Wert, sagen wir 500--1\,000, setzen und nichts an \cs{hbadness} "andern! Dann n"amlich sehe ich, welche Zeilen zu lang sind und kann den Text entsprechen umformulieren. \p Das ist richtig, aber \TeX{} hat ja noch einen dritten Versuch! \r Wie geht \TeX\ in diesem dritte und letzten Versuch vor? \p Diesen dritten Versuch unternimmt \TeX\ nur in einer Versionsnummer ab 3.0 und auch nur dann, wenn der Parameter \cs{emergencystretch} auf einen positiven Wert gesetzt wurde. Diese L"ange wird zur Dehnungs"-m"og"-lichkeit einer jeden Zeile hinzuaddiert und ein neuer Umbruch gestartet. Dadurch werden die Dehnungspunkte jeder Zeile verringert. Meist hilft schon ein relativ kleiner Wert von ca.\ 10\,pt, jedoch gibt es mit diesem Parameter bisher noch keine gro"sen Erfahrungen, so da"s man ruhig ein bi"schen mit dem Wert herumprobieren sollte. \r Und wie verh"alt sich \TeX, falls auch im dritten Versuch keine geeigneten Umbruchstellen gefunden wurden? \p Falls es "uberhaupt zum dritten Versuch kam, war \cs{tolerance} auf einen kleineren Wert als 10\,000 gesetzt und \cs{emergencystretch} positiv (andernfalls w"urde ja nach Stufe~2 kein weiterer Versuch mehr unternommen). In diesem Fall erhalten Sie wie im zweiten Versuch eine Meldung "uber {\it under-} oder {\it overfull box}. \r Diese Meldung ist mir nur zu vertraut. Und wenn ich in diesem Fall die \env{sloppypar} verwende, erhalte ich ein undiskutables Ergebnis, da hier die Wortabst"ande meist "uber Ge"-b"uhr gro"s sind. \p Das liegt daran, da"s innerhalb von {\sf sloppypar} die \cs{tolerance} auf einen Wert von 10\,000 gesetzt wird\dots \r \dots und daher also der dritte Versuch nicht mehr gestartet wird; daher k"onnen auch Zeilen mit unendlich-vielen Dehnungspunkten beim Umbruch ber"ucksichtigt werden. \p Sicherlich sind Ihnen aber bessere L"osungen bekannt. \r Ich kann zus"atzliche Trennstellen mittels \glq\verb|"-|\grq\ angeben oder die fragliche Stelle umformulieren. (Ich mu"s aber auch zugeben, da"s manchmal falsch geschriebene W"orter die Ursache daf"ur waren, da"s \TeX\ ein Wort nicht trennen konnte.) Nun denke ich, ist es an der Zeit, mehr "uber \TeX's Trennalgorithmus zu erfahren! \subsection{\TeX's Trennalgorithmus} \p \TeX\ arbeitet, wie Sie vorhin richtig bemerkten, nicht mit einem Lexikon, sondern vielmehr mit sog.\ "`Trenntabellen"' (den {\em hyphenation patterns}). Trenntabellen werden in den meisten F"allen mit dem Programm {\tt PatGen} erzeugt, und das hat seinen guten Grund. Es steht in einer solchen Tabelle ja nicht jedes Wort einzeln, sondern ein Konglomerat aus Regeln, so z.\,B.: "`wenn dort ein \glq st\grq\ kommt, darfst Du diese nicht trennen, wenn allerdings davor ein \glq p\grq\ steht, meistens schon, au"ser es kommt danach ein \glq x\grq, und auch dann nur, wenn vorne ein z steht."', wobei die verschiedenen Stufen des "`Du darfst"' bzw.\ "`Du darfst nicht"' durch ansteigende Werte ungerader bzw. gerader Zahlen dargestellt werden. {\tt PatGen} liest nun eine Liste korrekt getrennter W"orter ein und erstellt daraus eine solche Trenntabelle. Wenn man also an einer Tabelle etwas "andern will, dann am besten an der W"orterliste, aus der die Tabelle entstanden ist, wobei leider den wenigsten ein Duden auf Platte zur Verf"ugung steht. (Wenn ich mich recht entsinne, haben die Polen die Trenntabelle per Hand erstellt, und zwar weil die polnische Trennung derart regelm"a"sig ist, da"s man einfacher die Regeln (als Patterns) hinschreiben als ein W"orterbuch mit {\tt PatGen} erstellen kann.) \r Also mu"s f"ur jede Sprache eine neue Trenntabelle erstellt werden? \p So ist es. \r Ist denn das Erstellen derartiger Trenntabellen nicht eine zeitraubende Angelegenheit? \p Ja, aber gl"ucklicherweise mu"s sich der Anwender nicht darum k"um"-mern. Flei"sige \TeX{}niker haben das bereits erledigt. Weiter sehen Sie, da"s \sty{german} nichts mit dem eigentlichen Trennverfahren zu schaffen hat. Allein in der Trenntabelle befinden sich die f"ur die Trennung n"otigen Regeln. Die deutsche Trenntabelle tr"agt "ubrigens den Namen {\tt ghyphen.tex}. \r Und wie wendet \TeX\ die Trenntabellen zur Trennung von W"or"-tern an? \p Ich will es Ihnen gerne darlegen. Im \TeX Book, Anhang~H erkl"art \DEK\ die Regeln, mit denen \TeX\ ein trennbares Wort (oder einen Anteil davon) aus der horizontalen Liste, als der ein Absatz repr"asentiert wird, herausfischt. \TeX\ versucht dann, die Trennstellen in diesen Teilen mittels der Trenntabellen zu finden (was bei sehr kurzen Teilen nicht klappt). \r \TeX\ versucht also, wenn ich Sie richtig verstanden habe, den eingelesenen Text in das zu zerlegen, was es f"ur W"orter h"alt, indem es all das, was es f"ur Nicht-Wortbestandteile h"alt, als Begrenzer eines Wortes ansieht und so, grob gesagt, den Text zerlegt in die jeweils l"angste Abfolge blo"ser Buchstaben. \p So k"onnte man es mit aller Vorsicht formulieren. Grob gesagt beginnt f"ur \TeX\ ein neues Wort mit einem gew"ohnlichen Buchstaben hinter {\em glue}. (Allerdings kann ein Wort, welches \TeX\ zu trennen versucht, auch implizite {\em kerns} sowie Ligaturen enthalten.) Das zu trennende Wort endet mit dem ersten darauf"|folgendem Eintrag in der horizontalen Liste, welcher weder ein Buchstabe, noch eine Ligatur, noch ein impliziter {\em kern\/} ist. \r Wieso aber werden W"orter, die Umlaute enthalten, h"aufig nicht oder fehlerhaft getrennt? Ist etwa der Trennalgorithmus von \TeX\ mangelhaft? \p Durchaus nicht. Das liegt an \sty{german}, dort werden die Umlaute neu definiert. \r Sie verwirren mich! Sie stellten doch eben fest, da"s die Trennregeln allein in der Trenntabelle zu finden sind, und nicht etwa in \sty{german}. \subsection{Umlaute und Trennung} \p Nun, das ist kein Widerspruch. Ich will Ihre Verwirrung gerne auf"|l"osen. Durch \sty{german} wird vor und nach einem Umlaut \cs{allowhyphens} eingef"ugt und dieses expandiert zu einem ``{\em glue item}'' (\cs{hskip 0pt plus 0pt}). Damit kann \TeX\ an dieser Stelle ein neues "`Wort"', das evtl. getrennt werden kann, beenden bzw.\ beginnen. Beispiel: \TeX\ macht aus \glq\verb|gew"ohnlich|\grq\ die Wortfolge \glq\verb|gew|\grq\ {\tt [Umlaut-o]} \glq\verb|hnlich|\grq\ und versucht dann, \glq\verb|gew|\grq\ und \glq\verb|hnlich|\grq\ zu trennen. Da es in diesen "`W"ortern"' keine erlaubten Trennungen findet, wird \glq\verb|gew"ohnlich|\grq\ gar nicht getrennt. \r Dann ist also die l"angste Abfolge trennbarer W"orter, die \TeX\ in der Zeichenfolge \glq\verb|gew"ohnlich|\grq\ findet, einmal \glq\verb|gew|\grq\ und andererseits \glq\verb|hnlich|\grq, da n"amlich \glq\verb|"o|\grq\ noch etwas Leim enth"alt und so \TeX\ die o.\,g.\ Zeichenfolge in drei W"orter zerlegt! \p Genauso ist es. Genauer wird aus der Eingabe von \glq\verb|gew"ohnlich|\grq\ das Folgende. % \begin{ogfudatim} \cmr/m/n/12 g \cmr/m/n/12 e \cmr/m/n/12 w \penalty 10000 \glue 0.0 \kern 0.0 (for accent) \hbox(7.96431+0.0)x5.87494, shifted 0.47266 .\cmr/m/n/12 ^^? \kern -5.87494 (for accent) \cmr/m/n/12 o \penalty 10000 \glue 0.0 \cmr/m/n/12 h \cmr/m/n/12 n \cmr/m/n/12 l \cmr/m/n/12 i \cmr/m/n/12 c \kern-0.32639 \cmr/m/n/12 h \end{ogfudatim} % Ist Ihnen eine Abhilfe bekannt? \r Ja, ich benutze dann, wie auch in den seltenen F"allen, in denen die Trennung nicht eindeutig ist (wie bei Haus-tier und Hau-stier) bzw.\ bei den zugegebenerma"sen seltenen falschen Trennungen, die Trennhilfe \glq\verb|"-|\grq. \p Ausgezeichnet, wie w"are also dem Trennproblem von \glq\verb|gew"ohnlich|\grq\ beizukommen? \r Nun, ich gebe einfach \glq\verb|ge"-w"ohn"-lich|\grq\ ein. Die Behandlung der Umlaute erinnert den Benutzer also schmerzhaft daran, da"s der Sch"opfer von \TeX\ Amerikaner ist! \p Nicht ganz; es erinnert daran, da"s der Zeichensatzgenerator \mf\ von einem Amerikaner geschrieben wurde! Die verbreitetste Zeichensatzfamilie, n"amlich die Computer Modern Roman (Sie lesen Sie gerade), enth"alt von sich aus gar keine Umlaute. Umlaute werden eben aus zwei Zeichen zusammengesetzt. Es sind aber seit einiger Zeit Bestrebungen im Gange, eine Zeichensatzkonvention festzulegen und Zeichens"atze zu entwickeln, bei denen Umlaute (und andere Zeichen, die nicht als solche in den cmr-Fonts enthalten sind) als ein Zeichen enthalten sind. Momentan sind diese sog.\ EC- bzw.\ DC-Fonts noch nicht fertig; wir werden uns mit ihnen besch"aftigen, wenn sie allgemein verf"ugbar sind. \subsection{Fehlerhafte Trennung} \r Das sind ja erfreuliche Aussichten. Lassen Sie uns jetzt noch den Fall einer fehlerhaften Trennung besprechen. Ist es empfehlenswert, auch hier Trennhilfen anzubringen? \p Das w"are eine Notl"osung\dots In den F"allen fehlerhafter Trennung ist eine andere Methode sachgerechter. \r Teilen Sie mir mit, welche Methode Sie f"ur angemessen halten, falls W"orter fehlerhaft getrennt werden? \p Das will ich gerne tun. Die Ausnahmew"orter k"onnen {\em dauerhaft}, also ohne jedesmal die Trennhilfe \glq\verb|"-|\grq\ anzugeben, mittels \cs{hyphenation} richtig getrennt werden. So wird beispielsweise "`Zeilenumbruch"' von \TeX\ fehlerhaft zu "`Zei-le-num-bruch"' getrennt; Abhilfe schafft hier ein in der Pr"aambel des Dokumentes eingegebenes \verb|\hyphenation{zei-len-um-bruch}|. \r Dieser Befehl veranla"st \TeX\ also jedesmal, wenn ihm das Wort "`Zeilenumbruch"' unterkommt, es gem"a"s der im \cs{hyphenation}-Befehl angegebenen Trennung zu trennen. \p Genauso ist es. Sie k"onnen \cs{hyphenation} auch eine durch Leerzeichen getrennte Liste von Ausnahmetrennungen "ubergeben, also beispielsweise (da pikanterweise das Wort "`Trennalgorithmus"' in "`Tren-nal-go-rith-mus"' zerlegt wird): \medskip \noindent\verb|\hyphenation{mo-nats-um-satz trenn-al-go-rith-mus...}|\dots \medskip \r \dots statt eben \cs{hyphenation} zweimal zu verwenden: \begin{ogfudatim} \hyphenation{zei-len-um-bruch} \hyphenation{trenn-al-go-rith-mus} \hyphenation{...} \end{ogfudatim} \p Leider gibt es da noch einen kleinen Wermutstropfen: W"orter, die Umlaute enthalten, d"urfen (noch) nicht im \cs{hyphenation}-""Befehl aufgenommen werden.\indexcs{hyphenation!und Umlaute} \r Das ist gut zu wissen. Ich nehme an, das "andert sich, wenn die DC/EC-Zeichens"atze allgemein verwendet werden. Nun verraten Sie mir noch, warum \TeX\ W"orter, die einen Bindestrich enthalten, nur am Bindestrich selbst trennt. \subsection{Trennung am Bindestrich} \p Dies ist ein Seiteneffekt einer entweder implizit (als leere Trennstelle von \TeX\ selbst nach W"ortern, die einen Bindestrich enthalten oder bei Ligaturen, die mit einem solchen aufh"oren, wie \sq{--} oder \sq{---}) oder explizit durch Eingabe von \glq\verb|"-|\grq\ eingef"ugten \cs{discretionary}: {\em Jede Trennstelle unterdr"uckt n"amlich die Trennung des Wortteils rechts von der Trennstelle}. \r Das erscheint mir in der Regel auch sinnvoll, W"orter mit expliziten Bindestrichen nicht an anderen Stellen zu trennen, da die leichte Lesbarkeit durch eine Trennung, die nicht am Bindestrich erfolgte, empfindlich gest"ort w"urde. \p Sie sagen es. Dazu schreibt \DEK\ selbst: \begin{quote}\selectlanguage{USenglish} ``[\dots] Thus, a box or rule or math formula or discretionary following too closely upon the trial word will inhibit hyphenation. (Since \TeX\ inserts empty discretionaries after explicit hyphens, these rules imply that already-hyphenated compound words will not be further hyphenated by the algorithm.)'' \end{quote} \r Jedes eingef"ugte \cs{discretionary} verhindert die Trennung des davorstehenden Wortes (es ist leider ``too closely''). Was kann man tun? \p Da gibt es mindestens zwei M"oglichkeiten: \begin{enumerate} \item Man kann \sty{german} benutzen, und zwar vor und nach jedem Bindestrich ein \cs{allowhyphens} einf"ugen. Das Ganze packt man dann am besten in ein Makro. Zum Beispiel (beachten Sie bitte, da"s \glq\verb|""|\grq\ eine Trennhilfe wie \glq\verb|"-|\grq\ darstellt, das Wort jedoch im Falle der Trennung an der Trennstelle ohne das Trennungszeichen \glq-\grq\ ausgegeben wird): \begin{ogfudatim} \newcommand{\dds}{Donau\allowhyphens-""Dampfschiff}. \end{ogfudatim} \item Man kann einen Font mit einem \cs{hyphenchar} ungleich \glq\verb|`\-|\grq\ benutzen, damit \TeX\ nicht ein \cs{discretionary} nach dem Bindestrich einf"ugt. Dadurch kann der Wortteil vor dem Bindestrich getrennt werden. Damit der Rest auch noch getrennt wird, mu"s nach dem Bindestrich wieder ein `{\em glue item}' eingef"ugt werden. Wir werden darauf noch eingehen, wenn die neuen EC-Fonts ihre $\beta$-Phase beendet haben. \end{enumerate} Man kann aber mit Hilfe von \cs{allowhyphens} und Makros (siehe Punkt (1)) ganz gut leben. \r Und warum kann ich das Donau-Dampfschiff nicht in die Ausnahmeliste aufnehmen? \p Innerhalb des \cs{hyphenation}-Befehls hat das Zeichen \sq{{\tt- }} {\it immer\/} die Bedeutung einer Trennstelle. Es ist "uberhaupt nicht m"oglich, einen Bindestrich als "`normalen"' Wortbestandteil einzugeben. Ein weiterer kleiner Designfehler in \TeX, den man leider auch durch Tricks nicht umgehen kann. \indexcs{hyphenation!und Bindestriche} Wenn Sie aber die L"osung mit \cs{allow\-hyphens} und \verb+""+ verwenden, k"onnen Sie f"ur die einzelnen Wortteile f"ur sich die Ausnahmen angeben. \r Auf diese Weise also. Nun kann es aber zu "ublen Trennungen bei Ausdr"ucken wie "`(Sub-)Indizes"' kommen; dieses kann ja eventuell als "`(Sub-)Indizes"' getrennt werden. \p So kann es sein. Abhilfe verspricht in diesem besonderen Fall die Verwendung einer \cs{mbox}: Schreiben Sie einfach \glq\verb|{mbox{(Sub-)}Index}|\grq. \r Andererseits kann aber auch der Fall eintreten, da"s am Bindestrich selbst nicht getrennt werden soll, wie z.\,B.\ im Wort \glq A-H"ornchen\grq. Wie gehe ich hier vor? \p Hier k"onnen Sie \glq\verb|A"~H"ornchen| eingeben. \verb|"~| erzeugt einen expliziten Bindestrich, an dem aber nicht getrennt werden kann. \r Also k"onnte ich das (Sub-)Index-Problem auch mittels % \begin{ogfudatim} (Sub"~)""Index \end{ogfudatim} % l"osen, denn \glq\verb|"~|\grq\ erzeugt einen Bindestrich, an dem die Trennung unterdr"uckt wird und \glq\verb|""|\grq\ erzeugt ja eine explizite leere Trennstelle. Gibt es in \sty{german} noch weitere Varianten des Trennungsstriches? \p Ja, ich stelle Sie Ihnen insgesamt vor. \begin{enumerate} \item Da ist zun"achst einmal die Ihnen bekannte Trennhilfe \glq\verb|"~|\grq. Im Gegensatz zu \glq\verb|\-|\grq\ verhindert sie jedoch nicht die Trennung an anderen, ohne die Eingabe von \glq\verb|"-|\grq\ gemachten, Wortstellen. \item \glq\verb|""|\grq\ f"ugt eine Trennstelle ein, die im Falle der Trennung an dieser Stelle allerdings keinen Trennungsstrich erzeugt. \item \glq\verb|"~|\grq\ erzeugt, wie wir oben sahen, einen Bindestrich, an dem nicht getrennt werden kann. \item \glq\verb|"=|\grq\ schlie"slich erzeugt einen Bindestrich, unterdr"uckt jedoch nicht die Trennung an anderen Wortstellen, wie es ein gew"ohnlicher Bindestrich machen w"urde. \end{enumerate} \r Welche Parameter beeinflussen die Trennung noch? \p \TeX\ ab der Version 3.0 kennt noch zwei weitere wichtige Parameter, die die Trennung eines Wortes beeinflussen, n"amlich \cs{lefthyphenmin} bzw.\ \cs{righthyphenmin}. Diese Parameter geben an, wieviele Buchstaben bei einer Trennung mindestens links bzw.\ rechts vom Trennungsstrich stehen m"ussen. "Ublicherweise sind diese Parameter in einer deutschen Version auf \glq2\grq\ gesetzt, so da"s auch ein Wort wie beispielsweise \glq al-so\grq\ getrennt werden kann. \subsection{Trennung in verschiedenen Sprachen} \r Nun, das war viel auf einen Schlag; aber ich mu"s noch wissen, woher denn \TeX\ wei"s, gem"a"s welcher Sprache die W"orter zu trennen sind? \p Auch auf diese wichtige Frage will ich Ihnen die Antwort nicht schuldig bleiben. \TeX\,$3.x$ (und diese Version verwenden Sie ja) erlaubt es Ihnen im Unterschied zu "alteren \TeX-Versionen, Trennmuster f"ur verschiedene Sprachen in einem Dokument zu benutzen. \TeX\ mit einer Versionsnummer 3.0 oder h"oher besitzt einen neuen internen Z"ahler namens \cs{language}, der eine von bis zu 256 Trenntabellen ausw"ahlt. Nach \cs{language=1} wird die Trenntabelle verwendet, die auf Position~1 im Ini\TeX-Lauf geladen wurde. Wurden f"ur eine Position {\em keine\/} Patterns geladen, so wird nicht mehr getrennt. (Wie sollte \TeX\ denn auch?!) \sty{german} setzt nun auch beim Sprachwechsel diesen neuen Counter mit um und nimmt dabei an, da"s f"ur \cs{language=0} die US-amerikanische (englischen) und f"ur \cs{language=1} die deutsche Trenntabelle geladen wurden. Daher sind beim Erzeugen des Formatfiles noch folgende lokale Modifikationen vorzunehmen. \begin{ogfudatim} \language=0 \lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks \input ehyphen \language=1 \lefthyphenmin=2 \righthyphenmin=2 \input ghyphen \language=0 \end{ogfudatim} \r Lokale Modifikationen? Was verstehen Sie darunter? \p Nun, bei meiner Implementierung verh"alt es sich so: Es existiert eine Datei namens {\tt lplain.tex}, die eine an \LaTeX\ angepa"ste Version der {\sc Knuth}schen {\tt plain.tex}-""Makrodatei enth"alt. Am Ende dieser Datei finden Sie die Zeilen: \begin{ogfudatim} \typeout{Input any local modifications here.}. \end{ogfudatim} Und eben nach diesen Zeilen f"ugen Sie o.\,g.\ lokalen Modifikationen ein. (Das ist "ubrigens auch der Ort, an dem s"amtliche andere Modifikationen, wie zum Beispiel das Einlesen von \AmS-\LaTeX\ und \PiCTeX, durchzuf"uhren sind.) Da wir gerade bei den Modifikationen sind, mu"s ich Sie auf Folgendes aufmerksam machen. In {\tt latex.tex} wird dem Symbol \glq\verb|@|\grq\ eine besondere Bedeutung beigemessen. \r Ja, das habe ich schon gesehen; es taucht in vielen Kontrollsequenzen auf. \r Dieses Zeichen weist darauf hin, da"s die Kontrollsequenz, die es enth"alt, ein {\em low-level}-Kommando ist. Um dem Normalanwender "Arger zu ersparen, kann dieses Zeichen nicht mehr als ein normaler Buchstabe im Text eingegeben werden, damit nicht versehentlich eine dieser Kontrollsequezen umdefiniert wird. \r Eine durchaus sinnvolle Einrichtung. \p Durchaus. Wollen Sie daher mit den lokalen Modifikationen beispielsweise erzielen, da"s h"aufig ben"otigte {\tt .sty}-Dateien in die {\tt .fmt}-Datei mit aufgenommen werden, so sollten Sie \begin{ogfudatim} \makeatletter \input{xyz.sty} \makeatother \end{ogfudatim} eingeben. Der Befehl \cs{makeatletter} verwandelt \glq\verb|@|\grq\ in einen Buchstaben und \cs{makeatother} macht ihn wieder zu einem Nicht-Buchstaben. \r Vielen Dank f"ur diesen wichtigen Hinweis. Allerdings sollte man doch gewi"s nicht jede beliebige {\tt .sty}-Datei mitdumpen. \p Durchaus nicht. Geeignete Kandidaten sind etwa \PiCTeX\ oder \AmS-\LaTeX. Und gerade bei \AmS-\LaTeX\ ist etwas wesentliches zu beachten. In \AmS-\LaTeX\ wird n"amlich \cs{makeatother} umdefiniert, was zur Folge hat, da"s andere {\tt .sty}-Dateien, die den Klammeraffen \verb|@| als Befehlszeichen nutzen (wie etwa \sty{array}), gef"ahrlich ins Schleudern kommen. Sie sollten, wenn Sie \AmS-\LaTeX\ mit in die {\tt .fmt}-Datei aufnehmen wollen, etwa Folgendes als lokale Modifikation eintragen. \begin{ogfudatim} \makeatletter % macht @ zu einem Buchstaben \input{amstex.sty} % Wegen der Umdefinition von \makeatother in amstex.sty wird die % Originaldefinition von \makeatletter aus latex.tex jetzt % restauriert... \def\makeatother{\catcode`\@=12\relax} % ... und nun auch verwenden: \makeatother \end{ogfudatim} \r Ein brauchbarer Hinweis. Lassen Sie uns aber jetzt auf unser Trennproblem zur"uckkommen! \p Das sollten wir tun. In \sty{german} ist standardm"a"sig das deutsche Trenntabelle aktiv. Mittels \verb|\selectlanguage{USenglish}| kann dann im Text auf englische Trennmuster umgeschaltet werden. Blicken wir noch einmal auf das erste Zitat von \DEK; der Eingabetext lautete hier: \begin{ogfudatim} \begin{quote}\selectlanguage{USenglish} ``[\dots] Thus, a box or rule or math formula or discretionary following too closely [...] will not be further hyphenated by the algorithm.)'' \end{quote}. \end{ogfudatim} Ohne das Umschalten auf englische Trennmuster mittels der Anweisung \begin{ogfudatim} \selectlanguage{USenglish}, \end{ogfudatim} w"are der Text so umgebrochen worden: \begin{quote} ``[\dots] Thus, a box or rule or math formula or discretionary following too closely upon the trial word will inhibit hyphenation. (Since \TeX\ inserts empty discretionaries after explicit hyphens, these rules imply that already-hyphenated compound words will not be further hyphenated by the algorithm.)'' \end{quote} Beachten Sie die falsche Trennung des Wortes `following'! \r Man kann also einfach mittels des Kommandos \cs{selectlanguage} in den Trennalgorithmus einer andern Sprache umschalten (sofern daf"ur eben Trenntabellen mitgedumpt wurden). Jetzt habe ich nur noch ein letztes Problem mit Trennungen. \subsection[Zu lange Abschnittstitel]{Was kann man machen, wenn eine Kapitel"uberschrift zu lang ist, als da"s sie in den lebenden Kolumnentitel pa"st?} \p Die Antwort auf diese Frage ist leicht. Sie denken sich einen pr"agnanten Titel f"ur den lebenden Kolumnentitel aus und notieren Ihr Abschnittskommando etwa so: % \begin{ogfudatim} \subsection[Zu lange Abschnittstitel]{Was kann man manchen, wenn eine Kapitel"uberschrift zu lang ist, als da"s sie in den lebenden Kolumnentitel pa"st?} \end{ogfudatim} \endinput