aboutsummaryrefslogtreecommitdiff
path: root/README.adoc
blob: d3050ec135ca1230853b210d4b3c5ce635af3763 (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
= ÄndGgner -- Programmbibliothek zur Konsolidierung von Änderungsgesetzen des Bundes und der Länder
Matthias Andreas Benkard
// Meta
:experimental:
:data-uri:
:sectnums:
:toc:
:stem:
:toclevels: 2
:description: ÄndGgner Manual
:keywords: mulk
// Settings
:icons: font
:source-highlighter: pygments


== Resources

|===
|Resource |Links

|Public Artifact
|https://bintray.com/mulk/maven/aendggner[Bintray]

|Bug Tracker
|MantisBT
|===


[[building]]
== Building a JAR

To build an executable JAR at `target/aendggner-${REVISION}.jar`:

[source,shell script]
----
./mvnw package
----

`${REVISION}` defaults to `0.1.0-SNAPSHOT` unless you override it by
passing the `-Drevision` flag to `mvnw`.


== Running the Command Line Application

To run the command line application after <<building,building>> it:

[source,shell script]
----
./mvnw exec:java
----


[[usage]]
== Usage

ÄndGgner erzeugt aus einem Stammgesetz und einem Änderungsgesetz eine
zweispaltige HTML-Synopse (alte Fassung links, neue rechts, Änderungen
wortweise hervorgehoben).

Eingaben:

* Stammgesetz (Bundesrecht): XML im gii-norm-Format von
  https://www.gesetze-im-internet.de/[gesetze-im-internet.de]
* Stammgesetz (Landesrecht): konsolidierte Fassung als PDF oder als
  kanonischer Klartext im Format der `--extract-only`-Ausgabe. Eine Zeile
  „Inhaltsübersicht“ eröffnet darin die gleichnamige Norm, auf die die
  Angabe-Befehle zielen; ihre Zeilen tragen das Übersichtsformat
  „§ N | Titel“. Amtliche
  Satznummern und Fußnotenmarker stehen als Unicode-Superskripte im
  Text („¹Die freilebende Tierwelt …“, „Enteignung⁶)“); ob sie erhalten
  bleiben, ergibt sich aus der geladenen Stammfassung, nicht aus einer
  Länderkennung. Ebenso folgt das Zitiersigel (§ oder Art.) aus den
  Normköpfen der Stammfassung.
* Änderungsgesetz: BGBl-, GVBl- oder Drucksachen-PDF (Bundestag,
  Bundesrat, Landtage) oder Klartext

[source,shell script]
----
java -jar target/aendggner-0.1.0-SNAPSHOT.jar \
  stammgesetz.xml aenderungsgesetz.pdf -o synopse.html
----

Wichtige Optionen:

`-o, --output <file>`::
  Ausgabedatei (Default `synopse.html`; `-` = Standardausgabe).
`--vollstaendig`::
  Auch unveränderte Normen in die Synopse aufnehmen.
`--artikel <n>`::
  Nur diesen Artikel des Änderungsgesetzes anwenden (Default: alle
  Artikel, deren Einleitung das Stammgesetz nennt).
`--extract-only`::
  Nur den bereinigten Lineartext des Änderungsgesetzes ausgeben. Nützlich,
  wenn die PDF-Extraktion fehlerhaft ist: Text prüfen, von Hand
  korrigieren und als Klartextdatei wieder einspeisen.

Erkannt werden die gebräuchlichsten Änderungsbefehle des Handbuchs der
Rechtsförmlichkeit (Ersetzen, Neufassung, Einfügen, Anfügen, Aufheben,
Streichen, Umnummerierung) einschließlich zahlreicher Sonderformen:
Bereichs- und Koordinationsziele („Die Absätze 8 und 9 werden durch die
folgenden Absätze 8 bis 10 ersetzt“), strukturelle Streichungen ganzer
Einheiten („§ 9 wird gestrichen“), §- und Gliederungs-Umnummerierungen
(„§ 9a wird zu § 9“, „Der bisherige Abschnitt 2 wird zu Abschnitt 3“),
das Einfügen/Ersetzen ganzer §-Blöcke, Chapeau-Lokatoren („Im
Satzteil vor Nummer 1 …“), Änderungen an Anhängen und Anlagen („Der
Anhang wird wie folgt geändert: … Nach Nummer 2 wird die folgende
Nummer 2a eingefügt“), Angabe-Befehle auf die Inhaltsübersicht (gefasst,
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, 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“),
Verb-Rahmen, deren Unterpunkte allein die Fundstelle tragen („Es werden
ersetzt: … in § 35 Absatz 3 die Angabe „X“ jeweils durch die Angabe
„Y“,“) sowie die Neufassung der Gesetzesüberschrift.

Angewandt wird nicht stur in Dokumentreihenfolge: Umnummerierungen
beziehen sich stets auf die ursprüngliche Zählung, nicht auf den Stand
nach den vorangegangenen Punkten. Wer eine Bezeichnung räumt, kommt
deshalb vor den, der sie neu besetzt. Aus dieser einen Regel folgt die
absteigende Abarbeitung einer aufsteigenden Kaskade („Der bisherige
Absatz 3 wird Absatz 4“, „Der bisherige Absatz 4 wird Absatz 5“, …)
ebenso wie der Vorrang einer Umnummerierung vor der Einfügung, die deren
Bezeichnung neu vergibt. Verschoben wird dabei nur nach vorn, sodass
jede Folgeänderung hinter der Umnummerierung bleibt, auf deren neue
Bezeichnung sie zeigt. Die PDF-Aufbereitung toleriert dabei
Drucksachen-Artefakte (Seitenköpfe und -füße, Vorabfassungs-Wasserzeichen,
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
Zieltext nicht mehr existiert — landet mit Begründung im Abschnitt
*Manuell prüfen* der Synopse und wird niemals stillschweigend verworfen.

Für das bayerische Landesrecht versteht ÄndGgner die dortigen
Konventionen: Stammgesetze gliedern sich in Artikel („Art. 6 Abs. 2
Satz 1 Nr. 2“, durchgängig abgekürzt zitiert), Änderungsgesetze dagegen
in Paragraphen — auch mehrere Gesetze in einem GVBl-Heft, aus denen die
auf das Stammgesetz zielenden §§ (einschließlich „Weitere Änderung“)
anhand des Einleitungssatzes ausgewählt werden. Amtliche Satznummern
bleiben als Superskripte erhalten und dienen als exakte Satzgrenzen;
zusätzlich erkannt werden die bayerischen Befehlsformen („Fußnote 1
wird aufgehoben“, „In Satz 1 wird die Satznummerierung „1“ gestrichen“,
„Dem Wortlaut werden die folgenden Abs. 1 bis 4 vorangestellt“, „Der
bisherige Wortlaut wird Abs. 5“, Halbsatz-Ziele, Klauselketten mit
gemeinsamem Schlussverb) sowie das Fortführungszeichen des GVBl (jedes
neugefasste Aufzählungsglied öffnet erneut mit „). Meta-Änderungen an
Drucksachen (Änderungsanträge des Landtags) sind bewusst noch nicht
abgedeckt.

Die übrigen Länder gliedern ihre Stammgesetze wie der Bund in
Paragraphen; die Unterschiede liegen im Gesetzblatt-Satz und in
Befehlsidiomen. Belegt sind Sachsen (SächsBeamtVG), Niedersachsen
(NEFG) und Nordrhein-Westfalen (Telemedienzuständigkeitsgesetz,
Landesmediengesetz und — mit 101 Befehlen an 31 Normen der größte
Landesrechtsfall — das WDR-Gesetz) mit Akzeptanztests gegen die
amtlichen Nachfassungen; für Schleswig-Holstein und Berlin
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`.


== Running the Tests

To build and run the tests:

[source,shell script]
----
./mvnw verify
----