diff options
Diffstat (limited to 'info/german/ogfuda/trennung.tex')
-rw-r--r-- | info/german/ogfuda/trennung.tex | 761 |
1 files changed, 761 insertions, 0 deletions
diff --git a/info/german/ogfuda/trennung.tex b/info/german/ogfuda/trennung.tex new file mode 100644 index 0000000000..d6de82d70b --- /dev/null +++ b/info/german/ogfuda/trennung.tex @@ -0,0 +1,761 @@ +\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 |