summaryrefslogtreecommitdiff
path: root/info/german/ogfuda/trennung.tex
blob: d6de82d70bcfc2f68e2020f3a1848885268241f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
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