[[00-Start|← Zurück zum Projektstart]]
# Word-Export: Build-Pipeline
Erzeugt aus den Markdown-Notizen dieses Ordners zwei Word-Dateien für die externe
Weitergabe. Die `.docx` sind **bewusst nicht eingecheckt** – sie lassen sich jederzeit
aus den Notizen neu erzeugen.
| Datei | Inhalt |
|---|---|
| `Coole-Senioren-Gesamtdokumentation.docx` | Alle Notizen + Anhang PV-Kalkulation (**intern**, vollständig) |
| `Coole-Senioren-Gesamtdokumentation-oeffentlich.docx` | dieselbe, aber **anonymisiert** – siehe „Zwei Fassungen" |
| `09-CS-Final.docx` | Nur das kundenverständliche Dokument |
## Zwei Fassungen: intern und öffentlich
Das PDF liegt öffentlich im Google Drive und ist vom
[Obeco-Blog](https://www.obeco.de/blog/coole-senioren-klimatisierung-fuer-30-pflegezimmer.html)
aus verlinkt. Die vollständige Adresse eines Pflegeheims mit Demenzstation gehört dort
nicht hin – zusammen mit der Bewohnerumlage und dem Entwurfsstatus wäre die Einrichtung
sonst eindeutig identifizierbar, obwohl die Umlage rechtlich noch nicht bestätigt ist.
`--public` ersetzt deshalb die Adresse durch die Region:
| Intern | Öffentlich |
|---|---|
| `Josefshausstraße 9, 56428 Dernbach (Westerwald)` | `Westerwald` |
| `Dernbach/Westerwald` | `Westerwald` |
Die **Region bleibt erhalten** – die PV-Ertragsrechnung (846 kWh/kWp/Jahr aus dem
Solarkataster) braucht sie, die Hausnummer nicht. Sonst sind beide Fassungen identisch;
der Unterschied beträgt genau vier Textstellen.
> [!warning] Die Sperre ist hart
> Bei `--public` bricht das Skript ab, wenn „Josefshaus", „56428" oder „Dernbach" im
> Ergebnis auftauchen – auch aus neu hinzugekommenen Notizen. Umgekehrt bricht es ab,
> wenn „Westerwald" gar nicht mehr vorkommt (dann hätte die Anonymisierung ins Leere
> gegriffen). Neue identifizierende Angaben gehören in die Listen `ANON`/`VERBOTEN`.
## Voraussetzungen
- **Pandoc** (`C:\Program Files\Pandoc\pandoc.exe`, getestet mit 3.10)
- **Python 3** – bei Unicode-Fehlern in der Konsole: `PYTHONIOENCODING=utf-8` voranstellen
## Aufruf
```bash
# 1) Markdown zusammenbauen -> _build/out/cs-gesamt.md + cs-final.md
PYTHONIOENCODING=utf-8 python "40 Projekte/CooleSenioren/_build/build_cs.py"
# 1b) Öffentliche Fassung (anonymisiert) -> out/cs-gesamt-oeffentlich.md
PYTHONIOENCODING=utf-8 python "40 Projekte/CooleSenioren/_build/build_cs.py" --public
# 2) Gesamtdokumentation
"/c/Program Files/Pandoc/pandoc" "40 Projekte/CooleSenioren/_build/out/cs-gesamt.md" \
-o "40 Projekte/CooleSenioren/Coole-Senioren-Gesamtdokumentation.docx" \
--reference-doc="40 Projekte/CooleSenioren/_build/reference-footer.docx" \
--toc \
--metadata title="Coole Senioren" \
--metadata subtitle="Klimatisierung aller 30 Bewohnerzimmer – Gesamtdokumentation" \
--metadata author="Joachim Berger, Obeco" \
--metadata date="Stand: 16.07.2026" \
--metadata lang="de-DE" \
--metadata toc-title="Inhaltsverzeichnis"
# 2b) Inhaltsverzeichnis hinter die erste Notiz schieben (Pflichtschritt, siehe unten)
PYTHONIOENCODING=utf-8 python "40 Projekte/CooleSenioren/_build/place_toc.py" \
"40 Projekte/CooleSenioren/Coole-Senioren-Gesamtdokumentation.docx"
# 3) Einzeldokument
"/c/Program Files/Pandoc/pandoc" "40 Projekte/CooleSenioren/_build/out/cs-final.md" \
-o "40 Projekte/CooleSenioren/09-CS-Final.docx" \
--reference-doc="40 Projekte/CooleSenioren/_build/reference-footer.docx" \
--metadata title="Coole Senioren" \
--metadata subtitle="Das Wichtigste in Kürze" \
--metadata author="Joachim Berger, Obeco" \
--metadata date="Stand: 16.07.2026"
```
> [!warning] Word muss die Zieldatei geschlossen haben
> Ist die `.docx` in Word geöffnet, bricht Pandoc mit `permission denied` ab. Erkennbar
> an der Lockdatei `~$ole-Senioren-Gesamtdokumentation.docx` im Projektordner.
## Was `build_cs.py` aus den Notizen entfernt
Vorgaben für die externe Weitergabe – alles Nutzerentscheidungen:
| Was | Warum |
|---|---|
| Navigations-Kopfzeile (alles vor der H1) | Vault-Navigation, im Word sinnlos |
| Status-Block + Änderungshistorie + Footer | interne Arbeitsstände |
| Abschnitt `## Quellen` | Nutzervorgabe |
| Inline-Marker `[1]`, `[3][4]` | würden nach Wegfall der Quellen ins Leere zeigen |
| Erledigte Punkte `- [x]` inkl. Folgezeilen | nur Offenes soll ins Word |
| Wikilinks `[[Ziel\|Label]]` | zu `Label` bzw. `Ziel` aufgelöst |
`- [x]`-Punkte stehen seit dem 16.07.2026 ohnehin nicht mehr in den Notizen (sie wurden
dort gelöscht); die Funktion bleibt als **Sicherheitsnetz** aktiv, falls wieder welche
dazukommen.
## Eingebaute Prüfungen
Das Skript bricht **hart ab**, statt eine kaputte Datei zu erzeugen:
- Wikilink-Reste (`[[` / `]]`) im Ergebnis
- Notiz ohne Status-Block (Struktur unerwartet)
- Markdown-Link mit Zahlen-Label (`[2](url)`) – wäre kein Quellenmarker
- Quellen-Abschnitte gefunden ≠ **9** (eine je Notiz; Zahl anpassen, wenn Notizen dazukommen)
- Übrig gebliebene `[n]`-Marker oder Prosa-Verweise auf „Quelle […]"
- Leerer `## Offene …`-Abschnitt (entstünde, wenn alle Punkte erledigt sind)
## Reihenfolge
`MAIN` in `build_cs.py` bestimmt die Reihenfolge – sie weicht **bewusst** von der
Dateinummerierung ab: `09-CS-Final` steht als kundenverständlicher Einstieg **vorne**,
danach `00-Start` und die Detailnotizen, am Ende der Anhang PV-Kalkulation.
Das fertige Dokument hat damit diesen Aufbau:
| Reihenfolge | Inhalt |
|---|---|
| 1 | Titelseite (Titel, Untertitel, Verfasser, Stand) |
| 2 | **Coole Senioren – Klimaanlagen für alle Bewohnerzimmer** (`09-CS-Final`) |
| 3 | Inhaltsverzeichnis |
| 4 | Projekt-Start und Detailnotizen |
| 5 | Anhang PV-Kalkulation |
## place_toc.py – warum ein Extraschritt nötig ist
Pandoc setzt das `--toc`-Verzeichnis **fest** hinter die Titelseite; für den docx-Writer
gibt es keine Option zur Platzierung. Nutzervorgabe ist aber, dass die
kundenverständliche Notiz **vor** dem Verzeichnis steht. `place_toc.py` verschiebt den
`<w:sdt>`-Block deshalb nachträglich hinter den ersten Seitenumbruch und hängt einen
weiteren Umbruch an, damit das Verzeichnis eine eigene Seite bekommt.
> [!tip] Seitenzahlen stimmen trotzdem
> Das TOC-Feld trägt `w:dirty="true"` – Word baut das Verzeichnis beim Öffnen neu auf.
> Das Verschieben verfälscht die Seitenzahlen also nicht.
Das Skript ist **nicht idempotent** und bricht bewusst ab, wenn das Verzeichnis schon
verschoben wurde – so kann ein versehentlicher zweiter Lauf das Dokument nicht zerlegen.
Es läuft nur für die Gesamtdokumentation; `09-CS-Final.docx` hat kein Inhaltsverzeichnis.
## reference-footer.docx
Pandocs Standardvorlage, ergänzt um eine zentrierte Fußzeile „Seite X von Y"
(`PAGE`/`NUMPAGES`-Felder). Ist eingecheckt (Ausnahme in `.gitignore`), muss also
normalerweise nicht neu gebaut werden. Falls doch: `python _build/make_ref.py`.
Das Skript injiziert ins OOXML: `word/footer1.xml`, einen Override in
`[Content_Types].xml`, eine Relationship in `word/_rels/document.xml.rels` und die
`<w:footerReference>` als erstes Kind des `<w:sectPr>`.
Verfasser und Titel kommen **nicht** aus der Vorlage, sondern über `--metadata` beim
Pandoc-Aufruf (siehe oben).
## Prosa-Umformulierungen
Die Liste `PROSA` in `build_cs.py` ersetzt Formulierungen, die beim reinen Löschen der
Quellennummer zerbrechen würden – aktuell: „Quelle [2] nennt" → „Eine Marktrecherche
nennt". Bei neuen Prosa-Verweisen auf Quellen dort ergänzen, sonst schlägt die Prüfung an.
---
**Status:** Aktiv
**Version:** 1.2
**Letzte Aktualisierung:** 16.07.2026 16:15 Uhr
### Änderungshistorie
| Version | Datum | Uhrzeit | Änderung |
|---|---|---|---|
| 1.0 | 16.07.2026 | 11:58 | Erstfassung – Build-Pipeline aus dem Temp-Ordner in den Vault übernommen und dokumentiert (Nutzervorgabe); Pfade in `build_cs.py`/`make_ref.py` auf skriptrelative Auflösung umgestellt, Zwischenstufen nach `_build/out/` (gitignored), `reference-footer.docx` als Ausnahme in `.gitignore` eingecheckt |
| 1.1 | 16.07.2026 | 12:10 | **Nutzervorgabe:** Inhaltsverzeichnis steht jetzt hinter der Notiz „Coole Senioren – Klimaanlagen für alle Bewohnerzimmer" statt davor – neues Skript `place_toc.py` als Pflichtschritt 2b ergänzt (Pandoc kann die TOC-Position im docx nicht steuern). Dabei ergänzt: `toc-title=Inhaltsverzeichnis` und `lang=de-DE`, die Überschrift lautete bisher englisch „Table of Contents" |
| 1.2 | 16.07.2026 | 16:15 | **Nutzervorgabe:** Schalter `--public` ergänzt – erzeugt eine anonymisierte Fassung für die öffentliche Weitergabe (Adresse des Heims → Region „Westerwald"). Anlass: Das PDF liegt öffentlich freigegeben im Google Drive und ist seit heute vom Obeco-Blog aus verlinkt. Harte Prüfung gegen identifizierende Reste eingebaut |
---
[[00-Start|← Zurück zum Projektstart]] | [[Impressum|Impressum]] | [[Datenschutzerklärung|Datenschutz]]