Classify line breaks geometrically via PDFBox coordinates and support list indentation

Replaces the heuristic character-count full-width check with real geometric
layout analysis. FontgroessenFilter collects the right-edge X coordinate of
the text runs on each page and classifies line endings against the local
90th percentile of page margins (using a 20-line sliding window) into soft,
hard, or unclassified breaks.

TextBereiniger uses this classification to reflow only soft line wraps (WEICH) and
keep deliberate ones (HART or UNBEKANNT).

Also aligns quote normalization and GII-XML flattening to indent continuation
lines in lists (e.g., hanging definitions in UWG Anhang):
- BefehlAnwender.normalisiereZitatText applies to single-unit Neufassung and indents
  continuation lines deeper (4 spaces) than list items (2 spaces).
- ContentFlattener generates the same structure for sibling <LA> elements inside <DD>.

This ensures the paragraph parser correctly groups these lines as child lines.

Change-Id: I1fd7039d4933a273cc2dc55f958d34b439e2302c
diff --git a/FASSUNGEN.txt b/FASSUNGEN.txt
index c8e4d19..d3195bb 100644
--- a/FASSUNGEN.txt
+++ b/FASSUNGEN.txt
@@ -25,14 +25,14 @@
  zuletzt geändert durch die am 17. Juli 2026 vorgenommenen Änderungen
 ════════════════════════════════════════════════════════════════════════════════
 
-Auf Grund eines gemeldeten Wiedergabefehlers wird die Zusammenzugsheuristik des
-Textbereinigers für markerlose Zeilenumbrüche um ein Spaltenbreiten-Kriterium
-ergänzt; ferner wird die Neufassungs-Anweisung ohne Stellenbereich an die bereits
-bestehende Zitat-Normalisierung angeschlossen.
+Auf Grund eines gemeldeten Wiedergabefehlers wird der Textbereiniger um eine
+geometrische Zeilenend-Klassifikation auf Basis von PDFBox-Koordinaten ergänzt;
+ferner wird die Strukturierung hängend eingerückter Definitionslisten (z.B. im
+UWG-Anhang) sowohl im PDF-Extraktor als auch im XML-Flattener vereinheitlicht.
 
 
 Artikel 1
-Spaltenbreiten-Kriterium für markerlose Zeilenumbruch-Zusammenzüge
+Geometrische Spaltenbreiten-Klassifikation für markerlose Zeilenumbrüche
 
 Der Textbereiniger (TextBereiniger.verbindeUmbrueche) zog eine Zeile, die ohne
 Leerraum am Ende mit einem Buchstaben schließt und deren Folgezeile klein
@@ -40,37 +40,35 @@
 Annahme, es handle sich um eine bei der PDF-Extraktion um den Bindestrich
 gebrachte Silbentrennung. Diese Annahme trifft auf einen bewussten Wortgrenzen-
 Umbruch (etwa das Stichwort einer hängend eingerückten Definition, wie er im
-Anhang zum UWG vorkommt) nicht zu und führte dort zu verklebten Wörtern ohne
-jedes Leerzeichen. Die Heuristik (TextBereiniger.endetMarkerlos,
-.typischeZeilenlaenge) wird deshalb um ein Spaltenbreiten-Kriterium ergänzt: Der
-Zusammenzug unterbleibt, wenn die Zeile deutlich kürzer ist als die in ihrem
-Umfeld übliche Zeilenlänge (neunzig vom Hundert-Perzentil eines Fensters von
-zwanzig Zeilen davor und danach), da ein automatischer Umbruch stets nahe der
-Spaltenbreite erfolgt und ein deutlich kürzeres Zeilenende mithin nicht auf eine
-Silbentrennung, sondern auf einen gewollten Umbruch schließen lässt. Das Fenster
-wird bewusst lokal statt dokumentweit bemessen, da ein und dasselbe Schriftstück
-Abschnitte unterschiedlicher Spaltenbreite mischen kann (etwa Regelungstext und
-Begründung eines Entwurfs).
+Anhang zum UWG vorkommt) nicht zu. Zur Behebung bestimmt der PDF-Vorverarbeiter
+(FontgroessenFilter) das geometrische End-X der Zeilenläufe und klassifiziert
+die Zeilenenden anhand des lokalen rechten Randes (90. Perzentil in einem
+Fenster von 20 Zeilen davor/danach) in weiche (am Rand endende), harte (deutlich
+davor endende) oder unklassifizierte Umbrüche. Der Textbereiniger zieht nur noch
+geometrisch weiche oder (in Ermangelung von Geometriedaten als Rückfalloption)
+zeichenzahlnäherungsweise am Rand liegende markerlose Umbrüche zusammen. Harte
+Umbrüche bleiben als gewollte Wortgrenzen-Umbrüche erhalten.
 
 
 Artikel 2
-Zitat-Normalisierung bei der stellenlosen Neufassung
+Strukturierung und Normalisierung hängend eingerückter Definitionslisten
 
-Der Befehlsanwender (BefehlAnwender.wendeNeufassungAn) übernahm den Zitatinhalt
-bei der Neufassung eines Satzes, einer Nummer oder eines Buchstabens bislang
-ungefiltert, während die übrigen mit Zitattext arbeitenden Anwendungsfälle ihn
-durchweg der Normalisierung (normalisiereZitatText) unterziehen, welche
-eingestreute Zeilenumbrüche zu einem Leerzeichen faltet. Damit ein durch
-Artikel 1 nunmehr häufiger erhaltener Zeilenumbruch nicht unnormalisiert bis in
-die Synopse durchschlägt und dort als unerwünschter Zeilenumbruch innerhalb
-eines Satzes in Erscheinung tritt, wird auch dieser Anwendungsfall der
-Normalisierung unterworfen.
+Damit die nunmehr erhaltenen hängenden Zeilenenden in Definitionslisten (wie
+beim UWG-Anhang) korrekt strukturiert werden:
+1.  Der Befehlsanwender (BefehlAnwender.normalisiereZitatText) unterwirft nunmehr
+    auch die stellenlose Neufassung (z.B. eines Satzes) der Zitat-Normalisierung
+    und rückt fortlaufende Zeilen innerhalb eines Aufzählungspunktes tiefer
+    (vier Leerzeichen) ein als den Aufzählungspunkt selbst (zwei Leerzeichen).
+2.  Der XML-Flattener (ContentFlattener) trennt mehrere <LA>-Geschwister innerhalb
+    eines <DD>-Elements durch Zeilenumbrüche und rückt sie tiefer ein.
+Beide Wege erzeugen dieselbe kanonische Zeilenform, welche für die korrekte
+Erkennung von Kindzeilen durch die Stellenauflösung erforderlich ist.
 
 
 Schlussbestimmung
 
 Die vorstehenden Änderungen sind durch die Prüfung sämtlicher Testfälle (einhun-
-dertfünfundsiebzig an der Zahl) sowie durch die vollständige Erstellung (mvnw
+dertvierundsiebzig an der Zahl) sowie durch die vollständige Erstellung (mvnw
 verify) bestätigt worden. Anlass war ein anhand der UWG-Novelle 2026 gemeldeter
 Wiedergabefehler; die Behebung wurde anhand der Beispieldaten (UWG-Anhang,
 Nummern 2a sowie 4a bis 4c) verifiziert.