Add North Rhine-Westphalia TMZ-Gesetz acceptance case

Article 3 of the 22. Rundfunkänderungsgesetz (GV. NRW. 2026 S. 202) amends
the Telemedienzuständigkeitsgesetz. All four commands apply cleanly, and
the result matches the official consolidated version of 1 April 2026.

recht.nrw.de turned out to be the one remaining state portal that serves
consolidated laws as server-rendered HTML, with the version history
encoded in the URL date prefix — so the pre-amendment stem (27 Apr 2022)
was directly obtainable.

Two fixes were needed:

  * LandesRechtTextParser read the parenthesised title suffix wholly as
    the abbreviation. State laws routinely carry both short title and
    abbreviation there ("(Telemedienzuständigkeitsgesetz – TMZ-Gesetz)"),
    and the amendment act cites the short title, so article selection
    never matched. The parser now splits at the dash.

  * ZitatExtraktor swallowed the rest of the document when a closing
    quotation mark is missing in the official text (Article 2 no. 11
    here), which hid Articles 3 to 5 entirely. An amendment act never
    quotes across an article heading, so an open quotation is now closed
    before a bare "Artikel N" line, with a warning. Quoted paragraphs are
    unaffected: Bavarian norm heads read "Art. N".

223 tests green; all previously pinned figures unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Change-Id: I78470075d9be2433966b821b6fe1e21808996c46
diff --git a/FASSUNGEN.txt b/FASSUNGEN.txt
index e09cc8a..dd458df 100644
--- a/FASSUNGEN.txt
+++ b/FASSUNGEN.txt
@@ -25,14 +25,24 @@
  zuletzt geändert durch die am 25. Juli 2026 vorgenommenen Änderungen
 ════════════════════════════════════════════════════════════════════════════════
 
-Die sechste Ertüchtigungswelle wird um den schleswig-holsteinischen Belegfall
-ergänzt: das Gesetz zur Änderung des Gesetzes zur Änderung kommunalrechtlicher
-Vorschriften vom 26. März 2026 (GVOBl. Schl.-H. 2026/27). Es führt drei bislang
-unbekannte Eigenheiten ein — den laufenden Seitenkopf des GVOBl. Schleswig-
-Holstein, hochgestellte Fußnotenmarker an den Artikel-Überschriften und einen
-Flattersatz, in dem die geometrische Randerkennung versagt. Ein voller
-Akzeptanztest bleibt vorerst aus, weil die konsolidierte Gemeindeordnung aus
-freien Quellen nicht in der maßgeblichen Fassung zu beschaffen ist.
+Der Abschluss der sechsten und der Beginn der siebten Ertüchtigungswelle: Zwei
+weitere Belegfälle treten hinzu.
+
+Schleswig-Holstein (Artikel 1 bis 4): das Gesetz zur Änderung des Gesetzes zur
+Änderung kommunalrechtlicher Vorschriften vom 26. März 2026 (GVOBl. Schl.-H.
+2026/27). Es führt drei bislang unbekannte Eigenheiten ein — den laufenden Seiten-
+kopf des GVOBl. Schleswig-Holstein, hochgestellte Fußnotenmarker an den Artikel-
+Überschriften und einen Flattersatz, in dem die geometrische Randerkennung
+versagt. Ein voller Akzeptanztest bleibt vorerst aus, weil die konsolidierte
+Gemeindeordnung aus freien Quellen nicht in der maßgeblichen Fassung zu
+beschaffen ist.
+
+Nordrhein-Westfalen (Artikel 5 bis 7): Artikel 3 des 22. Rundfunkänderungsgesetzes
+vom 24. März 2026 (GV. NRW. S. 202) ändert das Telemedienzuständigkeitsgesetz.
+Alle vier Befehle werden erkannt und angewandt; das Ergebnis ist gegen die
+amtliche Fassung vom 1. April 2026 abgeglichen. Dazu werden die Trennung von
+Kurztitel und Abkürzung im Klammerzusatz und eine Strukturgrenze für unbalancierte
+Anführungszeichen nötig.
 
 
 Artikel 1
@@ -86,6 +96,46 @@
 nicht. Die Fundstelle ist in sampledata/Landesrecht-Beispiele.adoc vermerkt.
 
 
+Artikel 5
+Kurztitel und Abkürzung im Klammerzusatz
+
+Der Landesrecht-Textparser (LandesRechtTextParser) las den Klammerzusatz der
+Titelzeile stets als Abkürzung. Landesgesetze führen dort jedoch häufig Kurztitel
+und Abkürzung nebeneinander („(Telemedienzuständigkeitsgesetz – TMZ-Gesetz)“,
+„(Gemeindeordnung – GO –)“), und das Änderungsgesetz zitiert das Stammgesetz mit
+dem Kurztitel, nicht mit der Abkürzung; die Artikelauswahl
+(AenderungsgesetzParser.betrifft) griff deshalb nicht. Der Parser trennt den
+Klammerzusatz nunmehr am Gedankenstrich (Muster KURZTITEL_TRENNER) und führt den
+Kurztitel als Kurzüberschrift des Gesetzes.
+
+
+Artikel 6
+Strukturgrenze bei unbalancierten Anführungszeichen
+
+Der Zitatextraktor (ZitatExtraktor) schlug den gesamten Folgetext einem Zitat zu,
+wenn im amtlichen Satz ein schließendes Anführungszeichen fehlte. Im 22. Rundfunk-
+änderungsgesetz (Artikel 2 Nr. 11) ist das der Fall; das offene Zitat verschlang
+dort die Artikel 3 bis 5, sodass überhaupt kein Änderungsbefehl mehr gefunden
+wurde. Ein Änderungsgesetz zitiert jedoch nie über eine Artikel-Überschrift
+hinweg. Der Extraktor schließt ein offenes Zitat deshalb vor einer Zeile, die nur
+aus „Artikel N“ besteht, und meldet dies als Warnung. Zitierte Paragraphen bleiben
+unberührt, weil das bayerische Landesrecht seine Normköpfe als „Art. N“ führt.
+
+
+Artikel 7
+Belegfall Telemedienzuständigkeitsgesetz
+
+Als weitere Beispieldaten treten die konsolidierte Vorfassung des TMZ-Gesetzes
+(sampledata/NRW/TMZ-Gesetz-alt.txt, kanonischer Klartext, Fassung vom 27. April
+2022 aus der Fassungshistorie von recht.nrw.de) und ein End-to-End-Akzeptanztest
+(EndToEndTest.tmzGesetzAcceptance) hinzu: Von den vier Befehlen des Artikels 3
+werden alle angewandt — die Neufassung der Gesetzesüberschrift, die Neufassung des
+§ 1 Absatz 2, die Fundstellen-Ersetzung im Satzteil vor Nummer 1 des § 2 und die
+Neufassung der Nummern 1 und 2 des § 2. Die Artikel 1, 2 und 4 desselben Heftes
+(WDR-Gesetz, Landesmediengesetz, Siebzehnter Rundfunkänderungsstaatsvertrag
+Ausführungsgesetz) werden zutreffend nicht gewählt.
+
+
 ════════════════════════════════════════════════════════════════════════════════
  Fassung vom 24. Juli 2026,
  zuletzt geändert durch die am 24. Juli 2026 vorgenommenen Änderungen
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
index e116056..dc7dac8 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
@@ -91,7 +91,23 @@
           aktuellesZitat.append(c);
         }
       } else if (tiefe > 0) {
-        aktuellesZitat.append(c);
+        if (c == '\n' && beginntArtikelUeberschrift(text, i + 1)) {
+          // Ein Änderungsgesetz zitiert nie über eine Artikel-Überschrift hinweg: Hier fehlt im
+          // amtlichen Satz ein schließendes Anführungszeichen (kommt vor, z.B. GV. NRW. 2026
+          // S. 202 Artikel 2 Nr. 11). Ohne diese Grenze verschlänge das offene Zitat alle
+          // folgenden Artikel und der Parser fände überhaupt keine Änderungsbefehle mehr.
+          warnungen.add(
+              "Zitat vor einer Artikel-Überschrift nicht geschlossen: …"
+                  + kontextAuszug(text, i)
+                  + "… — dort geschlossen.");
+          ausgabe.append('«').append(zitate.size()).append('»');
+          zitate.add(aktuellesZitat.toString());
+          aktuellesZitat.setLength(0);
+          tiefe = 0;
+          ausgabe.append(c);
+        } else {
+          aktuellesZitat.append(c);
+        }
       } else {
         ausgabe.append(c);
       }
@@ -131,6 +147,22 @@
     return FORTFUEHRUNGS_MARKER.matcher(fenster).find();
   }
 
+  /**
+   * Strukturgrenze eines Änderungsgesetzes: eine Zeile, die nur aus „Artikel N“ besteht. Bayerische
+   * Stammgesetze zitieren ihre Normköpfe als „Art. N“, nicht als „Artikel N“ — zitierter Inhalt
+   * läuft hier also nicht versehentlich auf.
+   */
+  private static final Pattern ARTIKEL_GRENZE = Pattern.compile("^Artikel[ \\t]+\\d+[a-z]?[ \\t]*$");
+
+  /** Wahr, wenn die bei {@code von} beginnende Zeile eine Artikel-Überschrift ist. */
+  private static boolean beginntArtikelUeberschrift(String text, int von) {
+    if (von >= text.length()) {
+      return false;
+    }
+    int ende = text.indexOf('\n', von);
+    return ARTIKEL_GRENZE.matcher(text.substring(von, ende < 0 ? text.length() : ende)).matches();
+  }
+
   private static String kontextAuszug(String text, int position) {
     var von = Math.max(0, position - 60);
     var bis = Math.min(text.length(), position + 20);
diff --git a/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java b/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java
index ada273c..a3397cf 100644
--- a/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java
+++ b/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java
@@ -41,6 +41,9 @@
   // geprüft, sodass spätere Fundstellen-Klammern („(BayRS V S. 595)“) nicht getroffen werden.
   private static final Pattern JURABK_ZEILE = Pattern.compile("^\\(([^()]+)\\)$");
 
+  /** Trennt im Klammerzusatz den Kurztitel von der Abkürzung („Kurztitel – Abk“). */
+  private static final Pattern KURZTITEL_TRENNER = Pattern.compile("\\s+[–—]\\s+");
+
   // Kopf der Druckfassung („BayJG: Bayerisches Jagdgesetz … (Art. 1–64)“), ggf. mit
   // umbrochenem Rest („1–64)“) auf der Folgezeile.
   private static final Pattern DRUCKKOPF = Pattern.compile("^\\S{1,20}: .+$");
@@ -95,10 +98,20 @@
     }
     var langue = zeilen.get(i++).strip();
     String jurabk = null;
+    String kurzue = null;
     if (i < zeilen.size()) {
       var m = JURABK_ZEILE.matcher(zeilen.get(i).strip());
       if (m.matches()) {
-        jurabk = m.group(1);
+        // Landesgesetze führen im Klammerzusatz häufig Kurztitel und Abkürzung nebeneinander
+        // („Telemedienzuständigkeitsgesetz – TMZ-Gesetz“, „Gemeindeordnung – GO –“). Das
+        // Änderungsgesetz zitiert dann den Kurztitel, nicht die Abkürzung.
+        var teile = KURZTITEL_TRENNER.split(m.group(1).strip(), 2);
+        if (teile.length == 2) {
+          kurzue = teile[0].strip();
+          jurabk = teile[1].strip().replaceAll("\\s*[–—-]\\s*$", "");
+        } else {
+          jurabk = m.group(1).strip();
+        }
         i++;
       }
     }
@@ -190,7 +203,7 @@
           "Kein „§ N“- oder „Art. N“-Normkopf gefunden — ist das eine konsolidierte Fassung im"
               + " kanonischen Klartextformat?");
     }
-    return new Gesetz(jurabk != null ? jurabk : langue, langue, null, normen, gliederungen);
+    return new Gesetz(jurabk != null ? jurabk : langue, langue, kurzue, normen, gliederungen);
   }
 
   /** Überspringt die Kopfzeile der Druckfassung samt umbrochenem Rest. */
diff --git a/src/main/resources/sampledata/Landesrecht-Beispiele.adoc b/src/main/resources/sampledata/Landesrecht-Beispiele.adoc
index 373f615..1d831ac 100644
--- a/src/main/resources/sampledata/Landesrecht-Beispiele.adoc
+++ b/src/main/resources/sampledata/Landesrecht-Beispiele.adoc
@@ -61,7 +61,10 @@
 |`NRW/GV-NRW-2026-S202_22-Rundfunkaenderungsgesetz.pdf` — GV. NRW. 2026 Nr. 7 vom 31.03.2026,
 S. 202 (22. Rundfunkänderungsgesetz)
 |Umfangreiches Mehrgesetz-Artikelgesetz (17 S.); „Die Inhaltsübersicht wird wie folgt
-geändert", „§ … (weggefallen)". Bereitgestellt aus dem amtlichen recht.nrw.de-PDF.
+geändert", „§ … (weggefallen)". Bereitgestellt aus dem amtlichen recht.nrw.de-PDF. *Unbalancierte
+Anführungszeichen* im amtlichen Satz (Artikel 2 Nr. 7 b und Nr. 11). Konsolidierte Fassungen sind
+über `recht.nrw.de/lrgv/gesetz/<TTMMJJJJ>-<Kurztitel-Slug>` frei und serverseitig gerendert
+abrufbar; der Datumspräfix ist der Gültigkeitsbeginn der jeweiligen Fassung.
 
 |Sachsen
 |`Sachsen/SaechsGVBl-2026-S134_AendG-SaechsBeamtVG_revosax.pdf` — SächsGVBl. S. 134
@@ -92,6 +95,11 @@
   (`EndToEndTest.kommunalrechtAendGSchleswigHolstein`): Artikel 1 trifft die Gemeindeordnung,
   Artikel 2 die Kreisordnung, je ein Neufassungsbefehl, kein unbekannter Befehl. Ein voller
   Akzeptanztest ist *nicht* möglich — siehe „Noch offen“.
+* *Nordrhein-Westfalen* ist umgesetzt: `NRW/TMZ-Gesetz-alt.txt` (Telemedienzuständigkeitsgesetz in
+  der Fassung vom 27.04.2022, aus der Fassungshistorie von recht.nrw.de) und
+  `EndToEndTest.tmzGesetzAcceptance` (Artikel 3 des 22. Rundfunkänderungsgesetzes; alle vier
+  Befehle angewandt, kein Rest). Das Ergebnis ist gegen die amtliche Fassung vom 01.04.2026
+  abgeglichen. Die übrigen Artikel (WDR-Gesetz, Landesmediengesetz, 17. RÄStV-AusfG) bleiben offen.
 * Baden-Württemberg (GBl 2026 Nr. 26): großes Anlage-lastiges Änderungsgesetz (§§ 4–57a + Anlagen
   1/3b/4b); Stammfassung/Akzeptanztest noch offen.
 
diff --git a/src/main/resources/sampledata/NRW/TMZ-Gesetz-alt.txt b/src/main/resources/sampledata/NRW/TMZ-Gesetz-alt.txt
new file mode 100644
index 0000000..74621d1
--- /dev/null
+++ b/src/main/resources/sampledata/NRW/TMZ-Gesetz-alt.txt
@@ -0,0 +1,13 @@
+Gesetz zur Regelung der Zuständigkeit für die Überwachung von Telemedien nach dem Telemediengesetz, dem Telekommunikation-Telemedien-Datenschutz-Gesetz und nach § 24 Absatz 3, § 104 Absatz 1, § 106 Absatz 3 und § 113 des Medienstaatsvertrages
+(Telemedienzuständigkeitsgesetz – TMZ-Gesetz)
+Vom 29. März 2007
+§ 1  Aufsicht bei Telemedien
+(1) Die Landesanstalt für Medien Nordrhein-Westfalen (im Folgenden LfM) ist die nach § 24 Absatz 3, § 104 Absatz 1 sowie § 106 Absatz 3 des Medienstaatsvertrages vom 14. bis 28. April 2020 (GV. NRW. S. 524) in der jeweils geltenden Fassung zuständige Aufsichtsbehörde für das gesamte Land Nordrhein-Westfalen, soweit Absatz 2 nichts Abweichendes bestimmt.
+(2) Die oder der Landesbeauftragte für Datenschutz und Informationsfreiheit, im Folgenden LDI, überwacht in ihrem oder seinem Bereich die Einhaltung der Bestimmungen des § 23 des Medienstaatsvertrages über den Datenschutz, der §§ 19 bis 25 des Telekommunikation-Telemedien-Datenschutz-Gesetzes vom 23. Juni 2021 (BGBl. I S. 1982) in der jeweils geltenden Fassung sowie sonstiger datenschutzrechtlicher Bestimmungen, soweit nicht die Zuständigkeit der oder des Datenschutzbeauftragten der LfM, der oder des Rundfunkbeauftragten für den Datenschutz des WDR, im Folgenden WDR-Rundfunkdatenschutzbeauftragte oder WDR-Rundfunkdatenschutzbeauftragter, oder einer anderen für die Datenschutzaufsicht beim öffentlich-rechtlichen Rundfunk zuständigen Stelle gesetzlich bestimmt ist oder ein Fall des § 113 Satz 3 des Medienstaatsvertrages vorliegt. Im Hinblick auf die Befugnisse der oder des LDI im Rahmen ihrer oder seiner Aufsichtstätigkeit über die Einhaltung der Bestimmungen nach dem Telekommunikation-Telemedien-Datenschutz-Gesetz findet Artikel 58 Absatz 1 bis 5 der Datenschutz-Grundverordnung vom 27. April 2016 (ABl. L 119 vom 4.5.2016, S. 1; L 314 vom 22.11.2016, S. 72; L 127 vom 23.5.2018, S. 2; L 74 vom 4.3.2021, S. 35) entsprechende Anwendung.
+(3) Die Bezirksregierung Düsseldorf ist für das gesamte Land Nordrhein-Westfalen zuständig für die Überwachung und Untersagung von Glücksspielen im Internet und der Werbung hierfür im Internet.
+§ 2  Zuständigkeit bei Ordnungswidrigkeiten
+Zuständige Verwaltungsbehörde im Sinne des § 36 Absatz 1 Nummer 1 des Gesetzes über Ordnungswidrigkeiten in der Fassung der Bekanntmachung vom 19. Februar 1987 (BGBl. I S. 602), das zuletzt durch Artikel 31 des Gesetzes vom 5. Oktober 2021 (BGBl. I S. 4607) geändert worden ist, ist in den Fällen des
+1. § 11 Absatz 1 und 2 des Telemediengesetzes die LfM,
+2. § 28 Absatz 1 Nummern 10 bis 13 des Telekommunikation-Telemedien-Datenschutz-Gesetzes die oder der Datenschutzbeauftragte der LfM, die oder der WDR-Rundfunkdatenschutzbeauftragte oder die oder der LDI, soweit die jeweilige Aufsichtszuständigkeit begründet ist.
+§ 3  Inkrafttreten
+Dieses Gesetz tritt am Tag nach der Verkündung in Kraft.
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
index d36341d..b89a367 100644
--- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java
+++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
@@ -482,4 +482,68 @@
     assertThat(kro.befehle()).hasSize(1);
     assertThat(kro.befehle().get(0).stelle().anzeigeText()).isEqualTo("§ 29a Absatz 1");
   }
+
+  /**
+   * Nordrhein-Westfalen: Artikel 3 des 22. Rundfunkänderungsgesetzes (GV. NRW. 2026 S. 202) ändert
+   * das Telemedienzuständigkeitsgesetz. Voller Akzeptanztest — alle vier Befehle werden angewandt;
+   * das Ergebnis stimmt mit der amtlichen Fassung vom 1. April 2026 (recht.nrw.de) überein.
+   */
+  @Test
+  void tmzGesetzAcceptance() throws Exception {
+    var alt = SAMPLEDATA.resolve("NRW/TMZ-Gesetz-alt.txt");
+    var pdf = SAMPLEDATA.resolve("NRW/GV-NRW-2026-S202_22-Rundfunkaenderungsgesetz.pdf");
+    assumeTrue(Files.exists(alt) && Files.exists(pdf), "TMZ-Gesetz-Beispieldaten fehlen");
+
+    var gesetz = new eu.mulk.aendggner.gesetz.land.LandesRechtLoader().load(alt);
+    // Der Klammerzusatz führt Kurztitel und Abkürzung nebeneinander; das Änderungsgesetz zitiert
+    // den Kurztitel („Das Telemedienzuständigkeitsgesetz vom 29. März 2007 …“).
+    assertThat(gesetz.jurabk()).isEqualTo("TMZ-Gesetz");
+    assertThat(gesetz.kurzue()).isEqualTo("Telemedienzuständigkeitsgesetz");
+    assertThat(gesetz.normen()).hasSize(3);
+    assertThat(gesetz.norm("§ 1").orElseThrow().absaetze()).hasSize(3);
+
+    var text = TextBereiniger.bereinige(new PatchTextExtraktor().extrahiere(pdf));
+    var parseErgebnis = new AenderungsgesetzParser().parse(text, gesetz, null);
+    // Das Heft ändert vier Gesetze; nur Artikel 3 trifft das TMZ-Gesetz.
+    assertThat(parseErgebnis.artikel()).containsExactly("3");
+    assertThat(parseErgebnis.befehle()).hasSize(4);
+    assertThat(parseErgebnis.befehle()).noneMatch(b -> b instanceof UnbekannterBefehl);
+
+    // Im amtlichen Satz fehlt bei Artikel 2 Nr. 11 das schließende Anführungszeichen. Ohne die
+    // Artikel-Grenze im ZitatExtraktor verschlänge dieses Zitat die Artikel 3 bis 5.
+    assertThat(parseErgebnis.warnungen())
+        .anyMatch(w -> w.startsWith("Zitat vor einer Artikel-Überschrift nicht geschlossen"));
+
+    var anwendung = BefehlAnwender.anwenden(gesetz, parseErgebnis.befehle());
+    assertThat(anwendung.anzahlAngewandt()).isEqualTo(4);
+    assertThat(anwendung.protokoll())
+        .noneMatch(a -> a.status() == BefehlAnwender.Status.MANUELL_PRUEFEN);
+
+    // Abgleich mit der amtlichen Fassung vom 01.04.2026:
+    var neu = anwendung.neu();
+    // 1. Die Gesetzesüberschrift ist neu gefasst.
+    assertThat(neu.langue())
+        .startsWith("Gesetz zur Regelung der Zuständigkeit für die Überwachung von Telemedien im")
+        .contains("Anwendungsbereich des Digitale-Dienste-Gesetzes");
+    // 2. § 1 Absatz 2 nennt nun die Verordnung (EU) 2016/679 statt der Datenschutz-Grundverordnung
+    //    und das Telekommunikation-Digitale-Dienste-Datenschutz-Gesetz.
+    var absatz2 = neu.norm("§ 1").orElseThrow().absaetze().get(1).text();
+    assertThat(absatz2)
+        .contains("Verordnung (EU) 2016/679")
+        .contains("Telekommunikation-Digitale-Dienste-Datenschutz-Gesetzes vom 23. Juni 2021 (BGBl."
+            + " I S. 1982; 2022 I S. 1045)")
+        .doesNotContain("WDR-Rundfunkdatenschutzbeauftragte");
+    // 3./4. § 2: Fundstellen-Ersetzung im Satzteil vor Nummer 1 und Neufassung der Nummern 1 und 2.
+    var paragraph2 = neu.norm("§ 2").orElseThrow().gesamtText();
+    assertThat(paragraph2)
+        .contains("Artikel 4 des Gesetzes vom 17. Juli 2025 (BGBl. 2025 I Nr. 163)")
+        .contains("§ 33 Absatz 1 und 2 Nummer 1 und 2 des Digitale-Dienste-Gesetzes")
+        .doesNotContain("§ 11 Absatz 1 und 2 des Telemediengesetzes");
+    // § 3 bleibt unberührt.
+    assertThat(neu.norm("§ 3").orElseThrow().gesamtText())
+        .isEqualTo(gesetz.norm("§ 3").orElseThrow().gesamtText());
+
+    var synopse = SynopseBuilder.baue(gesetz, anwendung, parseErgebnis.warnungen(), false);
+    assertThat(HtmlRenderer.rendere(synopse, "E2E-Test TMZ-Gesetz")).contains("§ 2");
+  }
 }
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktorTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktorTest.java
index 8194f6b..618d078 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktorTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktorTest.java
@@ -61,6 +61,39 @@
   }
 
   @Test
+  void schliesstOffenesZitatVorArtikelUeberschrift() {
+    // Fehlt im amtlichen Satz das schließende Anführungszeichen (GV. NRW. 2026 S. 202 Artikel 2
+    // Nr. 11), verschlänge das Zitat sonst alle folgenden Artikel und der Parser fände keinen
+    // einzigen Änderungsbefehl mehr.
+    var ergebnis =
+        ZitatExtraktor.extrahiere(
+            "12. Dem § 128 wird folgender Absatz angefügt:\n"
+                + "„(3) § 14 gilt nicht.\n"
+                + "Artikel 3\n"
+                + "§ 1 wird wie folgt gefasst: „(1) Neu.“");
+
+    assertThat(ergebnis.text())
+        .isEqualTo(
+            "12. Dem § 128 wird folgender Absatz angefügt:\n«0»\nArtikel 3\n"
+                + "§ 1 wird wie folgt gefasst: «1»");
+    assertThat(ergebnis.zitat(0)).isEqualTo("(3) § 14 gilt nicht.");
+    assertThat(ergebnis.zitat(1)).isEqualTo("(1) Neu.");
+    assertThat(ergebnis.warnungen()).hasSize(1);
+    assertThat(ergebnis.warnungen().get(0)).startsWith("Zitat vor einer Artikel-Überschrift");
+  }
+
+  @Test
+  void zitiertUeberParagraphenUeberschriftenHinweg() {
+    // Nur „Artikel N“ ist Strukturgrenze: Ein zitierter Paragraph („§ 19“ + Überschrift auf der
+    // Folgezeile) gehört vollständig ins Zitat.
+    var ergebnis = ZitatExtraktor.extrahiere("Es wird gefasst: „§ 19\nAußerkrafttreten\nText.“");
+
+    assertThat(ergebnis.text()).isEqualTo("Es wird gefasst: «0»");
+    assertThat(ergebnis.zitat(0)).isEqualTo("§ 19\nAußerkrafttreten\nText.");
+    assertThat(ergebnis.warnungen()).isEmpty();
+  }
+
+  @Test
   void stelltZitateWiederHer() {
     var original = "Das Wort „alt“ wird durch das Wort „neu“ ersetzt.";
     var ergebnis = ZitatExtraktor.extrahiere(original);
diff --git a/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java b/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java
index 3354255..b170c5f 100644
--- a/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java
+++ b/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java
@@ -161,4 +161,36 @@
     assertThat(gesetz.norm("§ 3").orElseThrow().weggefallen()).isTrue();
     assertThat(gesetz.gliederungen()).extracting(Gliederung::anzeigeText).containsExactly("I. Teil — Grundlagen der Gemeindeverfassung");
   }
+
+  @Test
+  void trenntKurztitelUndAbkuerzungImKlammerzusatz() {
+    // Landesgesetze führen im Klammerzusatz oft beides („Telemedienzuständigkeitsgesetz –
+    // TMZ-Gesetz“); das Änderungsgesetz zitiert den Kurztitel, nicht die Abkürzung.
+    var gesetz =
+        LandesRechtTextParser.parse(
+            """
+            Gesetz zur Regelung der Zuständigkeit für die Überwachung von Telemedien
+            (Telemedienzuständigkeitsgesetz – TMZ-Gesetz)
+            Vom 29. März 2007
+            § 1  Aufsicht bei Telemedien
+            (1) Die Landesanstalt für Medien ist zuständig.
+            """);
+
+    assertThat(gesetz.jurabk()).isEqualTo("TMZ-Gesetz");
+    assertThat(gesetz.kurzue()).isEqualTo("Telemedienzuständigkeitsgesetz");
+
+    // Ohne Trenner bleibt der Klammerzusatz die Abkürzung; ein nachgestellter Gedankenstrich
+    // („Gemeindeordnung – GO –“) gehört nicht zur Abkürzung.
+    var ohneKurztitel =
+        LandesRechtTextParser.parse(
+            "Gemeindeordnung für Schleswig-Holstein\n(GO)\n§ 1  Wesen\n(1) Text.\n");
+    assertThat(ohneKurztitel.jurabk()).isEqualTo("GO");
+    assertThat(ohneKurztitel.kurzue()).isNull();
+
+    var mitGedankenstrich =
+        LandesRechtTextParser.parse(
+            "Gemeindeordnung für Schleswig-Holstein\n(Gemeindeordnung – GO –)\n§ 1  Wesen\n(1) Text.\n");
+    assertThat(mitGedankenstrich.jurabk()).isEqualTo("GO");
+    assertThat(mitGedankenstrich.kurzue()).isEqualTo("Gemeindeordnung");
+  }
 }