From 5f30f566873c313b554f087c0f7e132efa54d64a Mon Sep 17 00:00:00 2001
From: Matthias Andreas Benkard <code@mail.matthias.benkard.de>
Date: Tue, 28 Jul 2026 06:00:16 +0200
Subject: Recognise word-anchored insertions; close quotes at the next item
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The documented next step was the word-anchored structural insertion
("Vor den Wörtern „Aus dem Bereich Verkehr:“ wird folgender Absatz 5
eingefügt", Berlin Artikel 1 Nr. 2 b) bb)). StrukturEinfuegung now
carries an optional WortAnker, the recogniser has a pattern for the form
— placed before STRUKTUR_EINFUEGUNG, which bails out of recognition
entirely when the StellenParser cannot read "den Wörtern «0»" — and the
applier positions the new unit at the anchor line instead of a structural
boundary.

Two blockers turned up next to it, both measured on the corpus rather
than assumed:

The command was not cleanly recognisable at all. Its closing quotation
mark is missing in the official text, so the quote swallowed items cc)
and c); an anchor alone would have made the command look applicable with
a huge foreign quote as its payload. The docs called a boundary at
enumeration markers impossible, and that holds for the unguarded form: a
quoted amendment provision carries command language itself. Guarded by
four conditions together — the article's quotation marks demonstrably do
not balance, the next line's marker is at the same or a shallower level
than the one the quote opened on, that line carries command language, and
closing here leaves the rest of the article balanced — it fires exactly
twice in the whole sample corpus, both times where the missing mark
belongs: Berlin before cc), and GV. NRW. Artikel 2 before 12. Without the
guards it also fires inside quoted amendment provisions in the BayJG and
GModG documents; the balance gate rules those out.

The GV.-NRW. gazette encodes part of its umlauts decomposed (u + U+0308,
79 places, dozens of them "eingefügt:"/"angefügt:"). Invisible in the
text, but a different word to every command pattern, so those commands
could never match. TextBereiniger now normalises to NFC first — not
NFKC, which would flatten the official sentence numbers ¹²³ and take
SatzTeiler and Superskript their basis. Every other sample document,
every gii-XML stem and every hand-kept plain-text stem is already NFC, so
the pinned figures stay bit-identical.

Berlin Artikel 1 is thereby fully recognised (6 of 6 commands, none
unknown). One pinned statement changed for a stated reason: the NRW
acceptance test asserted the article-heading warning, which is now
preempted by the item boundary inside Artikel 2 — Nr. 12 survives
instead of being swallowed. 241 tests green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Change-Id: Ic579bec6fecc2495a61b3dcf87c9ad71b42f34ae
---
 README.adoc | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

(limited to 'README.adoc')

diff --git a/README.adoc b/README.adoc
index d3a8eb5..dc1893d 100644
--- a/README.adoc
+++ b/README.adoc
@@ -107,13 +107,20 @@ ersetzt, eingefügt, gestrichen — sie werden auf die
 Inhaltsübersichts-Norm angewandt), das Einfügen und Ersetzen von
 Gliederungs-Überschriften („Nach § 33 werden die folgenden Überschriften
 zu Teil 3 … eingefügt“), Voranstellungen, Mehrfach-Ersetzungs- und
--Einfügepaare, Verbünde aus Umnummerierung und Folgeänderung („§ 50 wird
-zu § 38 und wird wie folgt geändert“) sowie die Neufassung der
-Gesetzesüberschrift. Die PDF-Aufbereitung toleriert dabei
+-Einfügepaare, Einfügungen, deren Position ein Wortanker statt einer
+Stellenangabe bestimmt („Vor den Wörtern „Aus dem Bereich Verkehr:“ wird
+folgender Absatz 5 eingefügt“), Verbünde aus Umnummerierung und
+Folgeänderung („§ 50 wird zu § 38 und wird wie folgt geändert“) sowie die
+Neufassung der Gesetzesüberschrift. Die PDF-Aufbereitung toleriert dabei
 Drucksachen-Artefakte (Seitenköpfe und -füße, Vorabfassungs-Wasserzeichen,
-vertauschte oder gerade Anführungszeichen, verklebte Wortgrenzen) und
-bestimmt die Brotschrift seitenweise, sodass auch Ministeriumsentwürfe
-mit gemischten Layouts vollständig extrahiert werden. Auf den
+vertauschte oder gerade Anführungszeichen, verklebte Wortgrenzen, zerlegt
+kodierte Umlaute) und bestimmt die Brotschrift seitenweise, sodass auch
+Ministeriumsentwürfe mit gemischten Layouts vollständig extrahiert
+werden. Fehlt im amtlichen Satz ein schließendes Anführungszeichen, endet
+das Zitat an der nächsten Strukturgrenze — an einer Artikel-Überschrift
+oder, wo die Anführungszeichen eines Artikels nachweislich nicht
+aufgehen, am nächsten Aufzählungspunkt des Änderungsgesetzes; gemeldet
+wird das als Warnung. Auf den
 Beispieldaten werden damit alle Befehle der BGBl-Fassungen und der
 aktuellen Entwürfe angewandt (UWG/AGG/ProdHaftG: 0 manuell); was
 unsicher bleibt — etwa Befehle gegen eine ältere Gesetzesfassung, deren
@@ -141,9 +148,9 @@ Paragraphen; die Unterschiede liegen im Gesetzblatt-Satz und in
 Befehlsidiomen. Belegt sind Sachsen (SächsBeamtVG), Niedersachsen
 (NEFG) und Nordrhein-Westfalen (Telemedienzuständigkeitsgesetz) mit
 vollen Akzeptanztests ohne Rest; für Schleswig-Holstein und Berlin
-reicht die Prüfung bis zur Befehlserkennung, weil deren Landesportale
-ihre Stammfassungen nur über eine anmeldepflichtige Schnittstelle
-ausgeben. Welche Konvention welches Land beisteuert, welche
+reicht die Prüfung bis zur Befehlserkennung — dort vollständig, aber ohne
+Anwendung —, weil deren Landesportale ihre Stammfassungen nur über eine
+anmeldepflichtige Schnittstelle ausgeben. Welche Konvention welches Land beisteuert, welche
 Stammfassungen woher stammen und was noch offen ist, verzeichnet
 `src/main/resources/sampledata/Landesrecht-Beispiele.adoc`.
 
-- 
cgit v1.2.1

