Lang-s-Skript: neue Option zum Beibehalten der Trennzeichen.
[wortliste.git] / skripte / spezialmuster / lang_s / s2long-s.py
blobf1d453736958d9857c26d2734bf7879e22740cec
1 #!/usr/bin/env python3
2 # -*- coding: utf8 -*-
3 # :Copyright: © 2012, 2014 Günter Milde.
4 # :Licence: This work may be distributed and/or modified under
5 # the conditions of the `LaTeX Project Public License`,
6 # either version 1.3 of this license or (at your option)
7 # any later version.
8 # :Version: 0.3 (2014-06-14)
10 # ===================================================================
11 # Langes oder rundes S: Automatische Konversion nach Silbentrennung
12 # ===================================================================
14 # ::
16 """
17 Erstelle eine Wortliste mit (weitgehend) korrekter lang-S Schreibung.
19 Automatische Bestimmung der S-Schreibung auf Basis der Silbentrennung
20 in der `Wortliste der deutschsprachigen Trennmustermannschaft`.
22 Für die Wandlung mit Hilfe der patgen-generierten Muster siehe
23 ``skripte/lib/py_patuse/``.
24 """
26 # .. contents::
28 # Vorspann
29 # ========
31 # Lade Funktionen und Klassen für reguläre Ausdrücke::
33 import os, argparse, re, sys
35 # path for local Python modules (../../lib/py_wortliste/)
36 skriptdirname = os.path.dirname(os.path.dirname(os.path.dirname(
37 os.path.abspath(__file__))))
38 sys.path.insert(0, os.path.join(skriptdirname, 'lib'))
40 from py_wortliste.wortliste import WordFile, WordEntry, join_word
43 # Trennzeichen
44 # ------------
46 # Die Trennzeichen der Wortliste sind
48 # == ================================================================
49 # \· Notentext-Trennstellen (am Wortrand und in Abkürzungen)
50 # . unerwünschte Trennstellen, z.B. Ur-in.stinkt
51 # = Haupttrennstellen
52 # \- einfache Trennstellen
53 # < Trennstellen nach Vorsilben
54 # > Trennstellen vor Suffixen
55 # == ================================================================
58 # Funktionen
59 # ==========
61 # ſ-Regeln
62 # --------
64 # Siehe [wikipedia]_ und [Duden71]_ (Regeln K 44,45)::
66 def s_ersetzen(word):
68 # Ausnahmeregeln
69 # ~~~~~~~~~~~~~~
71 # Für sz und sk gelten Regeln, welche die Herkunft der Wörter beachten.
72 # Diese und weitere spezielle Fälle, welche Lang-S vor Trennstellen verlangen
73 # sind in `Ausnahmen Lang-S`_ gelistet::
75 for (ausnahme, ersetzung) in ausnahmen_lang_s:
76 if ausnahme in word:
77 word = word.replace(ausnahme, ersetzung)
78 # print("ſ-Ausnahme", ersetzung, word, file=sys.stderr)
80 # Allgemeine Regeln
81 # ~~~~~~~~~~~~~~~~~
83 # ſ steht im Silbenanlaut::
85 word = re.sub(r'(^|[-<>=·.])s', r'\1ſ', word)
87 # ſ steht im Inlaut als stimmhaftes s zwischen Vokalen
88 # (gilt auch für ungetrenntes ss zwischen Selbstlauten, z.B. Hausse, Baisse)::
90 word = re.sub(r'([AEIOUYÄÖÜaeiouäöüé])s([aeiouyäöüé])', r'\1ſ\2', word)
91 word = re.sub(r'([AEIOUYÄÖÜaeiouäöüé])ss([aeiouyäöüé])', r'\1ſſ\2', word)
94 # Doppel-S statt ß
95 # ----------------
97 # Wenn kein ß vorhanden ist (GROSSSCHREIBUNG) und in der Schweiz wird ss
98 # statt ß geschrieben. Seit 1996 wird auch am Wort-/Silbenende und vor t nach
99 # kurzem Vokal ss geschrieben. Der "Reformduden" empfielt im Fraktursatz die
100 # Schreibung "ſs" (die auch vor 1901 in Gebrauch war).
102 # Wir übernehmen diese Schreibung am Wort-/Silbenende::
104 word = re.sub('ss($|[-=<>.])', r'ſs\1', word)
106 # Vor t schreiben wir nach kurzem Vokal Doppel-ſ::
108 word = word.replace('sst', 'ſſt')
110 # Nach langem Vokal steht auch in de-1996 ein ß, in de-x-GROSS ist keine
111 # ſ-Wandlung nötig/möglich.
112 # TODO: in der Schweizer Orthographie müßte nach langem Vokal oder Zwielaut
113 # auch vor t ein ſs stehen (beißt -> beiſst).
115 # Verbindungen und Digraphen
116 # --------------------------
118 # ſ steht in den Verbindungen sp, st, sch und in Digraphen::
120 word = word.replace('st', 'ſt')
121 word = word.replace('sp', 'ſp')
122 word = word.replace('sch', 'ſch')
124 word = word.replace('Ps', 'Pſ') # Ψ
125 word = re.sub(r'^ps', r'pſ', word) # ψ (ps am Wortanfang)
126 word = re.sub(r'([-<>=·.])ps', r'\1pſ', word) # ψ (ps am Silbenanfang)
129 # ſ vor Trennstellen
130 # ------------------
132 # Die Verbindungen ss, sp, st werden zu ſſ, ſp und ſt, auch wenn sie
133 # durch eine Nebentrennstelle (Trennung innerhalb eines Wortbestandteiles)
134 # getrennt sind. Das s bleibt rund im Auslaut, d.h. am Wortende und vor
135 # einer Haupttrennstelle (Trennung an der Grenze zweier Wortbestandteile
136 # (Vorsilbe<Stamm, Bestimmungswort=Grundwort).
138 # ::
140 word = re.sub(r's([-.]+)ſ([aeiouyäöüé])', r'ſ\1ſ\2', word)
141 word = re.sub(r's([-.]+)p([^h])', r'ſ\1p\2', word)
142 word = re.sub(r'(^|[^s])s([-.]+)t', r'\1ſ\2t', word) # Reformschreibung
144 # ſ wird auch geschrieben, wenn der S-Laut nur scheinbar im Auslaut steht,
145 # weil ein folgendes unbetontes "e" ausfällt:
147 # "s-l" (Baſ-ler, pinſ-le, Kapſ-lung, Wechſ-ler, wechſ-le, Rieſ-ling),
148 # aber nicht bei
150 # | M.s-l: Mus-lim, Mos-lem, ...
151 # | [iys]s-l: Gris-ly, Crys-ler, ... (ss-l siehe nächste Regel)
152 # | s-la: Bra-tis-la-va, Gos-lar, Bres-lau
154 # ::
156 word = re.sub(r'([^mM][^siy])s-l([^a])', r'\1ſ-l\2', word)
158 # "ss-l", aber nicht bei "...eiss-l" und "Ess-lingen" mit ss statt ß::
160 word = re.sub(r'([^iE])ss-l', r'\1ſſ-l', word) # Droſſ-lung, ...
162 # Für weitere Fälle siehe auch `Ausnahmen Lang-S`_ (bereits oben ersetzt).
165 # Fremdwörter und Eigennamen mit Schluss-ß
166 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
168 # Der 1971er [Duden71]_ führt zu englischen Fremdwörtern mit Schluß-ß die
169 # österreichische Schreibung mit "ss" auf (Miß, engl. und österr. Schreibung
170 # Miss) wobei das Schluß-s nicht unterstrichen ist (also lang sein müßte?). So
171 # auch Boss, Business, Stewardess.
173 # Dagegen sagt [en.wiktionary.org]_: "the digraph «ss» was often written «ſs»
174 # rather than «ſſ»". Die Lang-S Seite der [wikipedia]_ zeigt Beispiele der
175 # englischen Schreibung "Congreſs".
177 # ::
179 # TODO ſſ oder ſs (wie in de-1996)? :
180 # if lang == 'de-1901':
181 # word = re.sub(r'ss$', r'ſſ', word)
182 # word = word.replace('ss=', 'ſſ=')
183 # word = word.replace('ss-ſch', 'ſſ-ſch')
185 return word
188 # Ausnahmen Lang-S
189 # ~~~~~~~~~~~~~~~~~~~
191 # Teilstrings mit Lang-S vor Trennstelle::
193 ausnahmen_lang_s = [
195 # ſ wird geschrieben, wenn der S-Laut nur scheinbar im Auslaut steht,
196 # weil ein folgendes unbetontes e ausfällt::
198 'Pilſ-ner', # < Pilsen, aber Mes-ner, Meiss-ner (de-ch)
199 'Klauſ-ner', # < Klause, aber Gleiss-ner (de-ch)
200 'riſſ-ne', # ge<riss-ne, ... (de-ch)
201 'oſſ-ne', # ge<schoss-ne, ge<schloss-ne, ... (de-ch)
202 'er<leſ-ne', # auserlesne
203 'unſ-r', # unsre, unsrige, ...
204 'ſſl', # Röſſl
205 'ſl', # Beiſl, Häuſl
206 'kreiſ-le',
207 'Wieſn',
208 'Schiſſ-la-weng',
209 'ſſ-re', # bessre, wässre, ...
210 'Pſſſt', # im Duden pst!
212 # ſ steht in Abkürzungen, wenn es im abgekürzten Wort steht
213 # (Abſ. - Abſatz/Abſender, (de)creſc. - (de)creſcendo, daſ. - daſelbst ...)
214 # ::
216 'creſc', # creſcendo
217 'Diſſ', # Diſſertation
218 'Maſſ', # Maſſachuſetts
219 'WiſſZeitVG', # Wiſſenſchaft...
221 # Alternativtrennung, wo beide Fälle ſ verlangen::
223 'er<.]ſat', # Kin[-der=/d=er<.]satz, ...
224 'er<.]ſät', # Kin[-der=/d=er<.]sätze, ...
225 'eſ[-ſer=/', # Mes[-ser=/s=er<.]satz
226 'ſ[-ter=/t', # Tes[-ter=/t=er<.]ken-nung
230 # Fremdwörter und Eigennamen
231 # --------------------------
233 # Schreibung nach Regeln der Herkunftssprache. Dabei ist zu bedenken, daß zu
234 # der Zeit, als das lange s im Antiquasatz noch üblich war (bis ca. 1800), die
235 # Rechtschreibung freier gehandhabt wurde und mehrfach Wandlungen unterworfen
236 # war [West06]_.
238 # Im Deutschen werden im Fraktursatz nicht eingedeutschte Fremdwörter
239 # lateinischen und romanischen Ursprungs in Antiqua mit rund-s geschrieben.
241 # Im Englischen gilt:
243 # The long, medial, or descending ess, as distinct from the short or
244 # terminal ess. In Roman script, the long ess was used everywhere except at
245 # the end of words, where the short ess was used, and frequently in what is
246 # now the digraph «ss», which was often written «ſs» rather than «ſſ»
247 # [en.wiktionary.org]_. See also [Typefounder08]_ and [West06]_.
249 # ::
251 ausnahmen_lang_s.extend(
254 # Digraphen::
256 'ſh', # (englisch)
257 'Cſar', # Cs -> Tsch (Csardas, ... ungarisch)
258 'ſz', # polnisch, ungarisch (Liszt, Puszta)
260 # ts am Silbenanfang (chinesisch, japanisch, griechisch)::
262 'Tſa', 'Tſe', 'tſe', 'tſi', 'Tſu', 'tſu',
264 # In vielen (aber nicht allen) Fremdwörtern steht ſc/ſz trotz Trennzeichen::
266 'ſ-ce-', # Fluo-res-ce-in
267 'ſ-ze-', # Aszese, aszetisch, Damaszener, vis-ze-ral, ...
268 'ſ-zen', # Adoleszenz, Aszendent, ...
269 'ſ-zes', # Abs-zess (de-1996), ...
270 'ſ-zet', # As-zet
271 # ſ-zi (aber Dis-zi-plin):
272 'ſ-zil-l' , # Oszillation, Oszilloskop, ...
273 'Aſ-zi', # Aszites
274 'aſ-zi', # fasziniert, lasziv
275 'bſ-zö', # obszön
276 'gnoſ-zie', # rekognoszieren,
277 'reſ-zi', # fluoreszieren, phosporeszieren, Fluo-res-cin, ...
278 'le-biſ-zi', # Plebiszit,
279 'viſ-zi', # Mukoviszidose
281 # ſ steht in der Endung sk in Wörtern und Namen slawischen Ursprungs
283 # ::
285 'Gdanſk',
286 'owſk', # Litowſk
287 'Minſk',
288 'Mur-manſk',
289 'ſi-birſk',
290 'Smo-lenſk',
292 # Iſlam, Iſmael, Iſrael: uneinheitlich
294 # - Duden 1972: Iſlam (in Österreich Islam)
295 # - Duden 1934: Preußen Iſlam, Österreich Islam, Bayern beides
296 # - Brockhaus 1894-1896 und Meyer 1885-1892: Islam, Israel
298 # ::
300 'Iſ-lam',
301 'Iſ-la-m',
302 'iſ-la-m',
303 'Iſ-ma-e',
304 'Iſ-ra-e',
305 'iſ-ra-e',
308 # ſſ steht in vollständig assimilierten Präfixen auf s (dis-, as-)
309 # die Wortliste zeichnet diese mit "normaler Trennung aus (dis-so-nant, ...)
311 # Wandel in Liste mit (Ausnahme, Ersetzung)-Tupeln::
313 ausnahmen_lang_s = [(exception.replace('ſ', 's'), exception)
314 for exception in ausnahmen_lang_s]
317 # s-Regeln
318 # --------
320 # Test auf verbliebene Unklarheiten
322 # Wenn ein Wort "s" nur an Stellen enthält wo die Regeln rundes S vorsehen,
323 # ist die automatische Konversion abgeschlossen.
325 # Ausnahmen und spezielle Regeln
327 # Liste von Teilstrings, welche stets rund-s behalten ::
329 ausnahmen_rund_s = [
331 # Abkürzungen::
333 'Ausg', # Ausgang, Ausgabe
334 'ausſchl',
335 'desgl', # des<gleichen
336 'Esc', # engl. Escape
337 'hrsg', # herausgegeben
338 'Hrsg', # Herausgeber
339 'insb',
341 # ausgelassenes flüchtiges e::
343 'Dresd-ne', # Dresd-ner/Dresd-ne-rin
345 # s steht auch in einigen Fremdwörtern vor z::
347 'is-zi-pl', # Disziplin (Duden 1971, aber Duden (1934) Diſziplin)
348 'mas-ze-ner', # Damaszener
349 'on<fis-zie', # konfiszieren, ...
350 # 'le-bis-z', # Plebiszit (Mayer 1885), Duden (1934 und 1971) Plebiſzit
352 # ss, sc im Auslaut uneinheitlich (vgl. `Fremdwörter und Eigennamen`_)::
354 'Disc', # uneinheitlich (auch Diſc aber eingedeutscht Disk)
355 '=disc', # Radiodiscjockey
356 # 'Gauss', # "Briefwechsel zwischen C.F. Gauss und H.C. Schumacher,
357 # herausg. von C.A.F. Peters"
358 # aber Boſſ, Busineſſ, Dreſſ, Miſſ
362 def is_complete(word):
364 # Kurztest: schon alles gewandelt?::
366 if 's' not in word:
367 return True
369 # Ersetze s an Stellen, wo es rund zu schreiben ist, durch ς (Schluss-Sigma)
370 # und teste auf verbliebene Vorkommen.
372 # Einzelfälle mit rundem S (substrings)::
374 for fall in ausnahmen_rund_s:
375 if fall in word:
376 # print('s-Ausnahme', fall, word)
377 word = word.replace(fall, fall.replace('s','ς'))
379 # s steht am Wortende, auch in Zusammensetzungen (vor Haupttrennstellen)::
381 word = re.sub(r's($|[=<>])', r'ς\1', word)
383 # Einige ältere Quellen schreiben ss am Schluss von Fremdwörtern oder Namen
384 # (Gauss). Andere schreiben ſs oder ſſ. (Vgl. `Fremdwörter und Eigennamen
385 # mit Schluss-ß`_) Wir verwenden ſs (TODO oder?)::
387 #word = re.sub(r'ss(=|$)', r'ςς\1', word)
389 # s steht am Silbenende (vor Nebentrennstellen), wenn kein p, t, z oder ſ
390 # folgt (in der traditionellen Schreibung wird st nicht getrennt)::
392 word = re.sub(r'ss?([·.\-][^ptzſ])', r'ς\1', word) # konservativ
394 # s steht auch vor Nebentrennstellen, wenn sch folgt::
396 word = word.replace('s-ſch','ς-ſch')
398 # s steht nach Vorsilben (wie aus<) auch wenn s, p, t, oder z folgt::
400 word = word.replace('s<','ς<')
402 # s steht vor Trennstellen am Suffixanfang
403 # auch wenn s, p, t, oder z folgt (Ols>sen, Jonas>son, Wachs>tum)::
405 word = word.replace('s>','ς>')
407 # s steht meist im Inlaut vor k, n, w (aber: siehe Lang-ſ-Ausnahmen)::
409 word = re.sub(r's([knw])', r'ς\1', word)
411 # s steht in der Verbindung sst, die in der Schweiz und
412 # bei fehlendem ß (GROSS) für ßt steht::
414 # TODO: nur nach Zwielaut und langem Vokal.
415 # word = word.replace('ſst', 'ſςt')
416 # word = word.replace('ſs-t', 'ſς-t')
418 # s steht als zweiter Buchstabe im ersetzten ß::
420 word = word.replace('-ſs', '-ſς') # traditionelle Orthographie
422 # und suche nach übrigen Vorkommen::
424 return 's' not in word
427 # Aufruf von der Kommandozeile
428 # ============================
430 # ::
432 if __name__ == '__main__':
434 # Pfad zu "../../../wortliste" unabhängig vom Arbeitsverzeichnis::
436 default_wortliste = os.path.relpath(os.path.join(
437 os.path.dirname(skriptdirname), 'wortliste'))
439 # Optionen::
441 parser = argparse.ArgumentParser(description=__doc__)
442 parser.add_argument('WORTLISTE', nargs='?',
443 help='Eingangsdatei im "Wortliste-Format" '
444 '("-" für Standardeingabe), '
445 'Vorgabe "%s".'%default_wortliste,
446 default=default_wortliste)
447 parser.add_argument('-l', '--language', dest='language',
448 help='Sprachvariante(n) (kommagetrennte Liste von '
449 'ISO Sprachtags), Vorgabe "de-1901"',
450 default='de-1901')
451 parser.add_argument('-d', '--drop-homonyms', action="store_true",
452 default=False,
453 help='Bei mehrdeutigen Wörtern, die sich nur in '
454 'Lang-S-Schreibung unterscheiden, nimm nur das erste.')
455 parser.add_argument('-k', '--keep-hyphens', action="store_true",
456 default=False,
457 help='Gib die Wörter unter Beibehaltung der '
458 'Trennzeichen der Eingabeliste aus. Ignoriert die '
459 'Option "--drop-homonyms".')
461 args = parser.parse_args()
464 # Angabe der Sprachvariante nach [BCP47]_ (Reformschreibung 'de' oder
465 # 'de-1996', Schweiz 'de-CH', ...)::
467 lang = args.language
469 # Iterator::
471 if args.WORTLISTE == '-':
472 wordfile = (WordEntry(line.rstrip()) for line in sys.stdin)
473 else:
474 wordfile = WordFile(args.WORTLISTE)
477 # Hauptschleife
478 # =============
480 # Konvertiere die Wörter der Trennliste und sortiere die Ergebnisse in
481 # Listen::
483 no_of_words = 0 # Gesamtwortzahl der gewählten Sprache(n)
484 irreversible = [] # Rückkonversion ungleich Original (Fehler)
485 offen = [] # Der Algorithmus kann die Schreibweise (noch) nicht ermitteln
487 # Iteration über alle Zeilen der Wortliste::
489 for entry in wordfile:
491 word = entry.get(lang) # Wort mit Trennstellen
492 if not word: # Wort existiert nicht in der Sprachvariante
493 continue
494 no_of_words += 1
496 # Vorsortieren
497 # ------------
499 # Wörter ohne Binnen-s müssen nicht konvertiert werden. Damit wird die
500 # Wortliste ungefähr um die Hälfte kürzer
502 # TODO: gibt es eine Abkürzung ohne Binnen-s die auf ſ endet?
503 # Dann wäre ein Test auf Kommentar nötig.
504 # ::
506 if 's' not in entry[0][:-1]:
507 if args.keep_hyphens:
508 print(word)
509 else:
510 print(entry[0])
511 continue
513 # Regelbasierte s/ſ-Schreibung::
515 lang_s_word = s_ersetzen(word)
517 # Einsortieren nach Vollständigkeit der Ersetzungen::
519 # print(lang, lang_s_word, str(entry))
520 entry.set(lang_s_word, lang) # Rückschreiben von teilweisen Ersetzungen
522 if lang_s_word.replace('ſ', 's') != word:
523 entry.comment = lang_s_word.replace('ſ', 's') + " != " + word
524 irreversible.append(entry)
525 continue
527 if not is_complete(lang_s_word):
528 offen.append(entry)
529 continue
531 # Mehrdeutigkeiten [ſ/s] oder [s/ſ] auflösen::
533 if args.keep_hyphens:
534 print(lang_s_word)
535 else:
536 lang_s_word = join_word(lang_s_word)
537 if '/' in lang_s_word:
538 # 1. Alternative:
539 print(re.sub(r'\[(.+)/.+\]', r'\1', lang_s_word))
540 if not args.drop_homonyms:
541 # 2. Alternative
542 print(re.sub(r'\[.+/(.+)\]', r'\1', lang_s_word))
543 else:
544 print(lang_s_word)
547 # Auswertung
548 # ==========
550 # ::
552 sys.stdout.flush() # prevent mixing data with diagnostic output
553 print(f"# Gesamtwortzahl {lang} {no_of_words}", file=sys.stderr)
554 print(f"# erkannte Konvertierungsfehler: {len(irreversible)}",
555 file=sys.stderr)
556 for entry in irreversible:
557 print(entry, file=sys.stderr)
558 print(f"# noch offen/unklar: {len(offen)}", file=sys.stderr)
559 for entry in offen:
560 print(entry, file=sys.stderr)
563 # Diskussion
564 # ==========
566 # Für gebrochene Schriften gibt es den `ISO Sprachtag`_
568 # :Latf: Latin (Fraktur variant)
570 # (Lateinisches Alphabet, gebrochen), e.g. "de-1901-Latf",
571 # "de-1996-Latf".
573 # .. _ISO Sprachtag: https://www.unicode.org/iso15924/iso15924-codes.html
575 # Statistik
576 # ---------
578 # Gesamtwortzahl (traditionelle Rechtschreibung): 427746
579 # Automatisch konvertiert: 427740
580 # Kategorisierung der Trennstellen fehlt: 0
581 # noch offen: 6
583 # Die Mehrzahl der Wörter der Trennliste wurde nach den Regeln des Dudens in
584 # die Schreibung mit langem `S` (ſ) konvertiert (wobei ungefähr die Hälfte der
585 # Wörter kein kleines `s` enthält womit die Konversion trivial wird).
587 # Für eine beschränke Anzahl offener Fälle wurden Ausnahmeregeln und Ausnahmen
588 # implementiert.
590 # Das Resultat muß noch auf nicht erfaßte Ausnahmen und Sonderfälle geprüft
591 # werden. Fehlentscheidungen sind nicht auszuschließen.
594 # Offene Fälle
595 # ------------
597 # Wörter mit identischer Schreibung ohne Lang-S
598 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
600 # Einige mehrdeutige Zusammensetzungen unterscheiden sich in der
601 # Lang-S-Schreibung, z.B.
603 # * Wach[s/ſ]tube: Wach-Stube / Wachs-Tube
604 # * Ga[s/ſ]traſſe: Gas-Trasse / Gast-Rasse
605 # * Schiff[ſ/s]tau: Schiffs-Tau / Schiff-Stau
607 # Im Normalfall schreibt s2long-s.py beide Varianten in die Ausgabedatei. Die
608 # Option --drop_homonyms kann verwendet werden, wenn dies nicht erwünscht ist.
610 # Unklare Schreibung
611 # ~~~~~~~~~~~~~~~~~~
613 # * Ersetztes SZ in reformierter Rechtschreibung, wenn ein Selbstlaut folgt
614 # (z.B. "Straſ-ſe" oder "Straſ-se).
616 # - Während in 1901-er Rechtschreibung die Trennung vor dem "ss" erfolgt
617 # (was Ersetzung mit "ſs" impliziert) wäre bei Trennung "wie normales
618 # Doppel-S" dann ein rundes S am Silbenanfang.
620 # Korrekte Fallunterscheidung geht nur bei Betrachtung der Nachbarfelder.
622 # * Tonarten (As-Dur oder Aſ-Dur)
624 # - Im Fraktur-Duden steht As *in Antiqua* mit rundem s, also
625 # keine Aussage zur Schreibung in Fraktur.
626 # - Im 1971-er [Duden71]_ steht As (Tonart) ohne Unterstreichung des `s`,
627 # das wäre Lang-S, obgleich am Wortende! Ebenso für Es, Cis, ...
629 # Wir brauchen keine Ausnahme, da korrekterweise die Tonart immer in Antiqua
630 # zu setzen ist.
633 # Quellen
634 # =======
636 # .. [Duden71] `Der Große Duden` 16. Auflage, VEB Bibliographisches Institut
637 # Leipzig, 1971
639 # Kennzeichnet im Stichwortteil rundes „s“ durch Unterstreichen.
641 # .. [Duden34] `Der Große Duden`, Leipzig 1934
643 # In Fraktur.
645 # .. [wikipedia] Langes s
646 # https://de.wikipedia.org/wiki/Langes_s
648 # .. [en.wiktionary.org]
649 # https://en.wiktionary.org/wiki/%C5%BF
651 # .. [Typefounder08]
652 # https://typefoundry.blogspot.com/2008/01/long-s.html
654 # .. [West06] Andrew West, `The rules for long s`, 2006
655 # https://www.babelstone.co.uk/Blog/2006/06/rules-for-long-s.html
657 # .. [BCP47] A. Phillips und M. Davis, (Editoren.),
658 # `Tags for Identifying Languages`, https://www.rfc-editor.org/rfc/bcp/bcp47.txt
660 # .. Links:
662 # .. _Wortliste der deutschsprachigen Trennmustermannschaft:
663 # https://mirrors.ctan.org/language/hyphenation/dehyph-exptl/projektbeschreibung.pdf