diff --git a/.checkpoint-pending.txt b/.checkpoint-pending.txt index e6ee86d..61306dd 100644 --- a/.checkpoint-pending.txt +++ b/.checkpoint-pending.txt @@ -1,2 +1,2 @@ S08 -Teilgebiet 01 Iteration B4 fuer DOCX umgesetzt. Heading 1/2/3 in destengsblue (build/build-reference-docx.py Funktion set_heading_colors mit explizitem color val=0B5394, themeColor accent1 entfernt). Heading-Bottom-Borders direkt am Stil verworfen, weil Word die Border bei hanging-Indent linksbuendig statt zentriert rendert und der right-Indent sowohl Text als auch Border begrenzt. 21 Markdown-HRs aus cv.md entfernt - Quelle der wahrgenommenen Doppellinien war Pandocs DOCX-Konvertierung von --- Zeilen zu VML-rect mit o:hr=t (Embossed-Look). Tabellen-Strich-Zeilen blieben unangetastet. Zwischenfall: NTFS-Mount-Stale-Read der cv.md (20043 statt 20201 Bytes) haette fast die Live-Datei truncated, sofortige Wiederherstellung aus git show HEAD und HR-Removal erneut mit git-Version als Input. H2-Trennlinien via Post-Processing eingefuehrt (build/post-process-docx.py um Logik erweitert): nach jedem H2 wird ein leerer Trenn-Absatz mit linksbuendiger Bottom-Border eingefuegt, schwarz (000000), 8,6 cm Linienlaenge (right-Indent 4196 dxa), 1,25 pt Dicke (sz=10). Sandbox-Verifikation 7 H2 zu 7 Trenner. Visuelle Bestaetigung durch Thomas. teilgebiete/01-lebenslauf.md um Iteration-B4-Block ergaenzt (B4.1 Farben, B4.2 Heading-Border-Sackgasse, B4.3 HR-Removal inkl. Zwischenfall, B4.4 H2-Trennlinien) und Naechste-Schritte-Liste auf C/D verkuerzt. +Teilgebiet 01 Iterationen B5 (Trainings als Tabelle) und B6 (Bullet-Einzuege verkleinert) abgeschlossen. B5: Trainings-Bullet-Liste in cv.md durch Pandoc-Multiline-Tabelle ersetzt analog Ausbildung. B6: build/post-process-docx.py um dritte Modifikation erweitert die direkt die numbering.xml manipuliert weil Pandoc die Werte aus reference.docx ignoriert. Bullet-Einzuege auf E1 0,25/0,35 cm und E2 0,80/0,40 cm gesetzt. Word-Konvention dokumentiert: Einzug-links zeigt (left - hanging). teilgebiete/01-lebenslauf.md und agent-prompt.md fuer S09 fortgeschrieben. diff --git a/agent-prompt.md b/agent-prompt.md index 5b1d7d1..782ec1b 100644 --- a/agent-prompt.md +++ b/agent-prompt.md @@ -85,34 +85,34 @@ Setze zwischen sinnvollen Zwischenständen Checkpoints (z.B. nach "Marketing.md ## Aktueller Stand / Nächste Aufgabe -**Letzte Session:** S07 (2026-04-26) +**Letzte Session:** S08 (2026-04-26) -**Was wurde gemacht:** -- **PDF-Build-Fehler endgültig behoben.** Pandoc-3.x-`\def\LTcaptype{none}`-Bug ([Issue #11201](https://github.com/jgm/pandoc/issues/11201)). Fix: `\newcounter{none}` im Template. **Iteration A inhaltlich abgeschlossen.** -- **Build-UX-Fix:** `build/build.ps1` mit `Start-Sleep -Seconds 3` pro fehlschlagendem Schritt. -- **Iteration B durchgezogen — `reference.docx` programmatisch via `build/build-reference-docx.py`** (Python-Stdlib, holt Pandoc-Default-Reference, entpackt ZIP, modifiziert XML mit ElementTree, repackt). Inhalt: - - **B1 — Schriften, Tabellen:** Theme major+minor auf Calibri (Pandoc-3.x-Default war Aptos Display/Aptos), Stil `Table` mit `tblBorders=none` auf allen Sides. - - **B1.5 — Schriftgrößen analog PDF:** DocDefault Body 11 pt, Heading 1/2/3 auf 15/13/12 pt. - - **B2 — Header, Footer, Page-Setup:** Header (Name links, Lebenslauf rechts) ab Seite 2, leerer Header für Seite 1 via `titlePg`. Footer (Seite n / m) auf allen Seiten inkl. Seite 1 (zwei `footerReference`-Einträge, default + first auf gleicher rId). Page-Setup A4 mit 2.2/2.5 cm Rändern, Tab-Stop 9072 dxa. - - **B3 — Schusterjungen/Witwen-Schutz für Headings:** DocDefault `widowControl`, Heading 1/2/3 und `FirstParagraph` (für Kenntnisse-Subsection-Labels) mit `keepNext` + `keepLines`. -- **Iteration B3.5 — 3-3-Regel für Listen-Bullets** über neues Post-Processing-Skript `build/post-process-docx.py`. Erster Versuch (Compact-Stil mit keepNext) hat Listen komplett unteilbar gemacht — Folge: Job-Stationen begannen jedes Mal auf neuer Seite, ungenutzte Seitenenden. Auf Wunsch von Thomas Per-Bullet-Logik: bei Listen mit ≥ 6 Bullets bekommen die ersten 2 und die N-3-/N-2-Bullets `keepNext`, dazwischen darf getrennt werden (= mind. 3 Bullets vor und nach jedem Umbruch). Bei < 6 Bullets bleibt alles zusammen. `build.ps1` ruft das Skript automatisch nach DOCX-Build als Schritt [3/3] auf. Sandbox-Verifikation: 26 Listen, 184 Bullets, 93 keepNext-Markierungen, Pattern z.B. `KK......KK.` für 11-Bullet-Liste. Auf Thomas' System visuell bestätigt: Listen werden sauber an guten Stellen getrennt, keine ungenutzten Seitenenden mehr. +**Was wurde gemacht:** Iteration B fuer das DOCX abgeschlossen, plus zwei zusätzliche Anpassungen: +- **B4.1 — Heading-Farben in destengsblue** (`build/build-reference-docx.py` Funktion `set_heading_colors`, color val=`0B5394`, themeColor accent1 entfernt). H1, H2, H3 alle in destengsblue. +- **B4.2 — Heading-Trennlinien direkt am Stil verworfen.** Bottom-Border + Indent-Trick (`hanging`) erzeugte in Word linksbündige statt zentrierte Linien. Wichtige Lehre: Words `right`-Indent begrenzt sowohl Text als auch Border — eine Border *schmaler als der Heading-Text* ist über den Stil selbst nicht abbildbar. +- **B4.3 — Markdown-HRs aus cv.md entfernt** (21 alleinstehende `---`-Zeilen). Quelle der wahrgenommenen „Doppellinien": Pandoc-DOCX-Konvertierung von `---` zu VML-`` (Embossed-Look). Tabellen-Strich-Zeilen blieben unangetastet. **Vorfall:** Sandbox-NTFS-Stale-Read der cv.md (20043 statt 20201 Bytes) hätte fast die Live-Datei truncated, sofortige Wiederherstellung aus `git show HEAD` + HR-Removal erneut mit der git-Version als Input. +- **B4.4 — H2-Trennlinien via Post-Processing** (`build/post-process-docx.py` um Funktion erweitert): nach jedem H2-Absatz ein leerer Trenn-Absatz mit linksbündiger Bottom-Border, schwarz (`000000`), 8,6 cm Linienlänge (right-Indent 4196 dxa), 1,25 pt dick (sz=10). +- **B5 — Trainings als Tabelle** (cv.md): Trainings-Bullet-Liste durch Pandoc-Multiline-Tabelle ersetzt (analog Ausbildung), Inhalte normal nicht fett. +- **B6 — Bullet-Einzüge verkleinert** (`build/post-process-docx.py` modifiziert `numbering.xml` direkt; Pandoc IGNORIERT die `numbering.xml`-Werte der reference.docx, daher MUSS das im Post-Processing passieren). E1: Einzug 0,25 cm + Sondereinzug 0,35 cm (left=340/hanging=198 dxa); E2: Einzug 0,80 cm + Sondereinzug 0,40 cm (left=681/hanging=227 dxa). Word-Konvention: „Einzug links" = `(left - hanging)` = Bullet-Position; „Sondereinzug Hängend" = `hanging`. **Nächste Aufgabe:** Teilgebiet 01 — verbleibende Iterationen: -1. **B4 — Heading-Farben auf DesTEngS-Blau und/oder Trennlinien analog PDF.** Bringt das DOCX optisch näher ans PDF (für Direktverwendung; bei Consulting-Agenturen, die das Layout ohnehin überschreiben, eher Kosmetik). Erstes Aufgabe der nächsten Session. -2. **C — Foto-Einbindung** in cv.md mit Pandoc-Image-Syntax und Template-Anpassung für Position/Größe (z.B. oben rechts neben Name, ca. 3 cm). -3. **D — Hyphenation-Feintuning für PDF** — kurze Wortteile am Zeilenanfang mit höherer Penalty oder `\hyphenation`-Ausnahmen reduzieren. +1. **C — Foto-Einbindung** in cv.md mit Pandoc-Image-Syntax und Template-Anpassung für Position/Größe (z.B. oben rechts neben Name, ca. 3 cm). +2. **D — Hyphenation-Feintuning für PDF** — kurze Wortteile am Zeilenanfang mit höherer Penalty oder `\hyphenation`-Ausnahmen reduzieren. Nach D): Status von Teilgebiet 01 in `zentral-index.md` auf „abgeschlossen" setzen (R2-OK von Thomas). Anschließend nächstes Teilgebiet nach Priorität (laut Index Teilgebiet 02 „Zeugnis von ASMPT"). **Offene Punkte (unverändert seit S04):** Zuschnitt und Festpreise der KI-Produkte (marketing.md Abschnitt 2), KMU-Direkthonorarsatz festlegen (marketing.md Abschnitt 2), Vergütungsmodell-Wahl bei erstem konkreten Fall (Notiz in marketing.md Abschnitt 2). **Hinweise für die nächste Session:** -- **Sandbox-Pandoc ist 2.9.x, Thomas' System läuft Pandoc 3.x.** Output-Unterschiede zwischen den Versionen können Build-Probleme verursachen. Sandbox-Pandoc emittiert weder die calc-basierten Spaltenbreiten (`p{... * \real{...}}`) noch `\def\LTcaptype{none}` — beides Pandoc-3.x-Eigenheiten. Sandbox-Verifikation des kompletten Pipeline-Laufs mit `pandoc cv.md → PDF` deckt diese Bugs nicht ab. Bei Fehlern, die nur auf Thomas' System auftreten, **synthetisch das Pandoc-3.x-Output-Fragment in einer Mini-Tex-Datei nachbauen** und damit gegen das Template kompilieren. -- **Sandbox-Reads über den NTFS-Mount können stale/inkonsistent sein.** Wenn Sandbox-Reads Schäden zeigen, die unplausibel sind, **nicht panisch reagieren** — erst Thomas via PowerShell verifizieren lassen, bevor Reparaturmaßnahmen ergriffen werden. -- **Sandbox-Schreibvorgänge sind zuverlässig** (Write-Tool und Heredoc via Bash). Bei längeren Skript-Dateien (>100 Zeilen) bleibt Heredoc trotzdem die robustere Wahl. +- **Word-Indent-Konvention (S08-Lehre):** Word zeigt im Absatz-Dialog „Einzug links" als `(left - hanging)`, NICHT als `left`. „Sondereinzug Hängend" ist `hanging`. Daher gilt: `left = (gewünschter Einzug + gewünschter Hanging-Indent)` in dxa. +- **Word-Border-Limit (S08-Lehre):** Words paragraph-Border folgt den Indents; eine Border *schmaler als der Heading-Text* geht NICHT über `` auf dem Heading-Stil, weil der right-Indent auch den Text begrenzt. Lösung wenn nötig: separater Trenn-Absatz nach dem Heading via Post-Processing. +- **Pandoc IGNORIERT die `numbering.xml` der reference.docx (S08-Lehre).** Wer Bullet-Einzüge ändern will, muss das im Post-Processing tun, nicht in `build-reference-docx.py`. +- **Pandoc generiert für Markdown-`---` im DOCX VML-Horizontal-Lines (``)** — sehen aus wie Doppellinien (Embossed). Im PDF rendert Pandoc dieselbe Quelle als saubere zentrierte Halblinie. Wenn man saubere DOCX-Trennung braucht: HRs in cv.md entfernen oder Pandoc-Lua-Filter für DOCX-Build. +- **Sandbox-NTFS-Stale-Reads sind häufiger und kritischer als gedacht (S08-Lehre).** Sandbox kann auch git-Status, Datei-Existenz und Datei-Inhalte verzerrt sehen, ohne dass die echte Datei betroffen ist. **Bei jedem Sandbox-Schreiben auf eine grössere NTFS-Mount-Datei: ERST git-Version verifizieren und als Input verwenden, NICHT blind dem Sandbox-Read trauen.** Bei seltsamen git-status-Outputs aus der Sandbox: erst Thomas auf PowerShell `git status` ausführen lassen. +- **Edit-Tool truncated regelmäßig** (mehrfach in S07 und S08 erlebt — Skript-Dateien, `.checkpoint-pending.txt`, `agent-prompt.md`, `teilgebiete/01-lebenslauf.md`). Faustregel: Bei jedem Edit auf NTFS-Mount-Datei nach `Edit` mit `wc -c` und `tail -c 80` verifizieren. Bei längeren Edits oder wenn das Risiko hoch ist: lieber per Heredoc/Python aus der git-Version neu schreiben. +- **Sandbox-Pandoc ist 2.9.x, Thomas' System läuft Pandoc 3.x.** Output-Unterschiede zwischen den Versionen können Build-Probleme verursachen. Sandbox-Pandoc emittiert weder die calc-basierten Spaltenbreiten (`p{... * \real{...}}`) noch `\def\LTcaptype{none}` — beides Pandoc-3.x-Eigenheiten. Bei Fehlern, die nur auf Thomas' System auftreten, **synthetisch das Pandoc-3.x-Output-Fragment in einer Mini-Tex-Datei nachbauen** und damit gegen das Template kompilieren. - **Sandbox kann nichts an `.git/` schreiben** (NTFS-Permission-Issue): Lock-Files, korrupte Index — alles muss von PowerShell aus repariert werden. - **`checkpoint.ps1` ist robust** gegen Anführungszeichen, Pipes, Whitespace-Anomalien und Index-Lock-Reste. `.checkpoint-pending.txt` darf ganz normal Sonderzeichen enthalten. - **`build.ps1` pausiert bei Fehler 3 Sekunden pro fehlgeschlagenem Schritt.** Nicht überrascht sein, wenn ein fehlerhafter Lauf entsprechend länger braucht. - **`build/build-reference-docx.py` muss VOR `build.ps1` manuell aufgerufen werden, wenn `templates/reference.docx` neu gebaut werden soll.** Das Skript ist nicht in `build.ps1` integriert (würde jeden Build verlangsamen und Pandoc-Default-Reference jedes Mal neu ziehen). Wenn jemand die `reference.docx` von Hand in Word editiert, gehen die Änderungen beim nächsten Skript-Lauf verloren — Stile gehören also ins Skript, nicht in Word. -- **Edit-Tool kann Dateien beim Schreiben über den NTFS-Mount truncatieren** (mehrfach in S07 erlebt am Python-Skript und an `build.ps1`). `mcp__workspace__bash` mit `cat <<'EOF' > path` ist die zuverlässige Alternative für längere Dateien (>~150 Zeilen). Nach jedem Edit auf NTFS-Mount-Datei: `wc -l` und `tail -c 60` zur Verifikation. -- **DOCX-Pipeline ist jetzt 3-stufig:** (1) `build/build-reference-docx.py` baut die `reference.docx` (manuell aufrufen, wenn Stile geändert werden sollen), (2) `build/build.ps1` baut PDF und DOCX, (3) `build/post-process-docx.py` wird automatisch aus `build.ps1` aufgerufen für die 3-3-Listen-Bullet-Regel. Wer das Bullet-Verhalten ändern will, fasst das Post-Processing-Skript an, nicht die reference.docx. +- **DOCX-Pipeline ist jetzt 3-stufig mit drei Post-Processing-Modifikationen:** (1) `build/build-reference-docx.py` baut die `reference.docx` (manuell aufrufen, wenn Stile geändert werden sollen), (2) `build/build.ps1` baut PDF und DOCX, (3) `build/post-process-docx.py` wird automatisch aus `build.ps1` aufgerufen und macht: 3-3-Listen-Bullet-Regel, H2-Trennlinien-Einfügung, Bullet-Einzug-Anpassung in `numbering.xml`. Wer das Bullet-Verhalten oder Trennlinien ändern will, fasst das Post-Processing-Skript an. diff --git a/artefakte/01-lebenslauf/build/__pycache__/post-process-docx.cpython-310.pyc b/artefakte/01-lebenslauf/build/__pycache__/post-process-docx.cpython-310.pyc index 26f7bf2..b7068b6 100644 Binary files a/artefakte/01-lebenslauf/build/__pycache__/post-process-docx.cpython-310.pyc and b/artefakte/01-lebenslauf/build/__pycache__/post-process-docx.cpython-310.pyc differ diff --git a/artefakte/01-lebenslauf/build/post-process-docx.py b/artefakte/01-lebenslauf/build/post-process-docx.py index b3e6193..3e8fbc9 100644 --- a/artefakte/01-lebenslauf/build/post-process-docx.py +++ b/artefakte/01-lebenslauf/build/post-process-docx.py @@ -4,32 +4,32 @@ post-process-docx.py ==================== Wird auf das von Pandoc erzeugte DOCX angewendet, NACH `build.ps1`. Macht -zwei XML-Modifikationen, die ein Stil oder die `reference.docx` nicht +drei XML-Modifikationen, die ein Stil oder die `reference.docx` nicht abbilden koennen: 1. 3-3-Regel fuer Listen-Bullets (B3.5): - Eine Liste ist eine Sequenz aufeinanderfolgender Absaetze mit -Eigenschaft im Body (nicht innerhalb von Tabellen-Zellen). - Bei einer Liste mit weniger als 6 Bullets: alle Bullets bekommen - (Liste bleibt unteilbar - bei <6 ist die 3-3-Regel - sowieso nur durch Zusammenhalten aller erfuellbar). + . - Bei einer Liste mit 6 oder mehr Bullets: die ersten 2 und die drittletzten und vorletzten Bullets bekommen . - Damit gilt: nach Bullet 1 darf nicht getrennt werden (1+2+3 zusammen), - und nach Bullet N-3 darf nicht getrennt werden (N-2+N-1+N zusammen). - Trennen ist erlaubt zwischen den Bullets in der Mitte. Bullets in Tabellen-Zellen werden uebersprungen. 2. H2-Trennlinie (S08): - Nach jedem H2-Absatz wird ein leerer Trenn-Absatz eingefuegt. - Trenn-Absatz: linksbuendige Bottom-Border, schwarz (000000), - 1,25 pt (sz=10), 8,6 cm Linienlaenge (right-Indent 4196 dxa bei - 9072 dxa Textbreite). - - Run-Properties auf sz=2 (1 pt), damit der Absatz selbst minimale - Hoehe hat. - - Ein schmaler-als-Heading-Border ist ueber den Heading-Stil selbst - nicht moeglich, weil Words right-Indent sowohl Text als auch - Border begrenzt. Deshalb separater Trenn-Absatz. + 1,25 pt (sz=10), 8,6 cm Linienlaenge. + +3. Bullet-Einzuege (S08): + - Pandoc erzeugt fuer alle Bullet-Listen abstractNum-Eintraege mit + festen Defaults (E1 left/hanging=480 dxa, E2 left=1200/hanging=480 dxa). + Pandoc IGNORIERT die numbering.xml-Werte der reference.docx. + - Im Post-Processing wird numbering.xml so modifiziert, dass alle + abstractNum-Eintraege die kompakteren Wunschwerte bekommen. + - Word-Konvention: "Einzug links" (im Absatz-Dialog) zeigt + (left - hanging) = Bullet-Position; "Sondereinzug Haengend" = hanging. + Daher rechnen wir: left = (gewuenschter Einzug + gewuenschter Hanging) in dxa. Voraussetzungen: nur Python-Stdlib. """ @@ -47,11 +47,6 @@ DOCX_FILE = BASE_DIR / "output" / "Lebenslauf_Dr-Ing_Thomas_Langer.docx" W_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" -# H2-Trenn-Absatz: linksbuendige Bottom-Border, schwarz, 8,6 cm lang, 1,25 pt dick. -# Textbreite = PAGE_W - MARGIN_LEFT - MARGIN_RIGHT = 11906 - 1417 - 1417 = 9072 dxa -# 8,6 cm = 8,6 * 567 dxa/cm = 4876 dxa -# right-Indent = 9072 - 4876 = 4196 dxa -# Border sz ist in 1/8 pt: 1,25 pt * 8 = 10 H2_SEP_XML = ( '' '' @@ -67,6 +62,23 @@ H2_SEP_XML = ( H2_STYLE_RE = re.compile(r'') +# Bullet-Einzuege (1 cm = 567 dxa) +# Word zeigt "Einzug links" = (left - hanging), "Sondereinzug Haengend" = hanging. +# E1: Einzug 0,25 cm + Sondereinzug 0,35 cm -> hanging=198, left=142+198=340 +# E2: Einzug 0,80 cm + Sondereinzug 0,40 cm -> hanging=227, left=454+227=681 +# E3+: proportional zur E2 (jeweils +0,55 cm fuer Einzug), hanging analog E2 +BULLET_INDENTS = { + 0: {"left": 340, "hanging": 198}, + 1: {"left": 681, "hanging": 227}, + 2: {"left": 993, "hanging": 227}, + 3: {"left": 1305, "hanging": 227}, + 4: {"left": 1617, "hanging": 227}, + 5: {"left": 1929, "hanging": 227}, + 6: {"left": 2241, "hanging": 227}, + 7: {"left": 2553, "hanging": 227}, + 8: {"left": 2865, "hanging": 227}, +} + def log(msg): print(f"[post-process-docx] {msg}", flush=True) @@ -80,8 +92,6 @@ def has_keep_next(p_xml): return " in das pPr-Element ein. Falls kein pPr existiert, - wird es angelegt. Idempotent.""" if has_keep_next(p_xml): return p_xml if "" in p_xml: @@ -98,8 +108,6 @@ TBL_OPEN = "" TBL_CLOSE = "" def process_document_xml(xml): - """Tokenisiert den Body, wendet 3-3-Regel auf Bullet-Listen an und - fuegt nach jedem H2-Heading einen Trenn-Absatz ein.""" out = [] bullet_run = [] table_depth = 0 @@ -165,6 +173,42 @@ def process_document_xml(xml): flush_run() return "".join(out), stats +def process_numbering_xml(xml): + """In allen abstractNum-Eintraegen die Bullet-Einzuege ersetzen.""" + import xml.etree.ElementTree as ET + W = "{%s}" % W_NS + ET.register_namespace("w", W_NS) + root = ET.fromstring(xml) + + stats = {"abstractNums": 0, "lvls_modified": 0} + + for absnum in root.findall(W+"abstractNum"): + stats["abstractNums"] += 1 + for lvl in absnum.findall(W+"lvl"): + ilvl_str = lvl.get(W+"ilvl") + try: + ilvl = int(ilvl_str) + except (TypeError, ValueError): + continue + target = BULLET_INDENTS.get(ilvl) + if target is None: + continue + pPr = lvl.find(W+"pPr") + if pPr is None: + pPr = ET.SubElement(lvl, W+"pPr") + ind = pPr.find(W+"ind") + if ind is None: + ind = ET.SubElement(pPr, W+"ind") + ind.set(W+"left", str(target["left"])) + ind.set(W+"hanging", str(target["hanging"])) + if W+"firstLine" in ind.attrib: + del ind.attrib[W+"firstLine"] + stats["lvls_modified"] += 1 + + XML_DECL = '\n' + new_xml = XML_DECL + ET.tostring(root, encoding="unicode") + return new_xml, stats + def main(): if not DOCX_FILE.exists(): sys.stderr.write(f"FEHLER: {DOCX_FILE} existiert nicht. " @@ -176,11 +220,16 @@ def main(): members = {name: z.read(name) for name in z.namelist()} doc_xml = members["word/document.xml"].decode("utf-8") - new_xml, stats = process_document_xml(doc_xml) + new_doc_xml, doc_stats = process_document_xml(doc_xml) + members["word/document.xml"] = new_doc_xml.encode("utf-8") - if new_xml == doc_xml: - log(" keine Aenderung") - members["word/document.xml"] = new_xml.encode("utf-8") + num_stats = {"abstractNums": 0, "lvls_modified": 0} + if "word/numbering.xml" in members: + num_xml = members["word/numbering.xml"].decode("utf-8") + new_num_xml, num_stats = process_numbering_xml(num_xml) + members["word/numbering.xml"] = new_num_xml.encode("utf-8") + else: + log(" Hinweis: word/numbering.xml nicht im DOCX (keine Listen?)") with zipfile.ZipFile(DOCX_FILE, "w", zipfile.ZIP_DEFLATED) as z: order = sorted(members.keys(), @@ -188,12 +237,14 @@ def main(): for name in order: z.writestr(name, members[name]) - log(f" Listen gefunden: {stats['lists']}") - log(f" Bullets in Listen: {stats['bullets_in_lists']}") - log(f" keepNext gesetzt: {stats['bullets_keepnext']}") - log(f" Bullets in Tabellen uebersprungen: {stats['skipped_in_tables']}") - log(f" H2-Headings gefunden: {stats['h2_headings']}") - log(f" H2-Trenn-Absaetze eingefuegt: {stats['separators_added']}") + log(f" Listen gefunden: {doc_stats['lists']}") + log(f" Bullets in Listen: {doc_stats['bullets_in_lists']}") + log(f" keepNext gesetzt: {doc_stats['bullets_keepnext']}") + log(f" Bullets in Tabellen uebersprungen: {doc_stats['skipped_in_tables']}") + log(f" H2-Headings gefunden: {doc_stats['h2_headings']}") + log(f" H2-Trenn-Absaetze eingefuegt: {doc_stats['separators_added']}") + log(f" numbering.xml abstractNum-Eintraege: {num_stats['abstractNums']}") + log(f" numbering.xml lvls modifiziert: {num_stats['lvls_modified']}") log("Fertig.") return 0 diff --git a/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.docx b/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.docx index 30769ce..39e0959 100644 Binary files a/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.docx and b/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.docx differ diff --git a/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.pdf b/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.pdf index 3eacf59..ba208f6 100644 --- a/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.pdf +++ b/artefakte/01-lebenslauf/output/Lebenslauf_Dr-Ing_Thomas_Langer.pdf @@ -169,16 +169,16 @@ endobj endobj 78 0 obj -<< /S /GoTo /D (none.1) >> +<< /S /GoTo /D (none.2) >> endobj -80 0 obj +81 0 obj (\376\377\000K\000e\000n\000n\000t\000n\000i\000s\000s\000e) endobj -81 0 obj -<< /S /GoTo /D [ 82 0 R /Fit ] >> +82 0 obj +<< /S /GoTo /D [ 83 0 R /Fit ] >> endobj -85 0 obj +86 0 obj << /Filter /FlateDecode /Length 3132 >> stream x[͎# S"_am[- {K^?HQ\vLgQv#V?ˋj%ؤaýG_/{Z;oϟ_s?׃ufq<} @@ -195,31 +195,31 @@ r y脟^]»];3q1̌=l2Ve͔/Xd}lvF^Jm@'UD;^mnE[m߫aLsQ"TGHaCMmIJDۖs9175|lvO3V+Pi@tęy/$Rڑɲz"Uw#b%}8|Pv@G Og L"Tkl?IM o> -endobj -90 0 obj -[ 83 0 R ] -endobj 83 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> +<< /Type /Page /Contents 86 0 R /Resources 85 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 90 0 R /Annots 91 0 R >> endobj -86 0 obj -<< /D [ 82 0 R /XYZ 69.866 813.476 null ] >> -endobj -2 0 obj -<< /D [ 82 0 R /XYZ 70.866 779.528 null ] >> -endobj -6 0 obj -<< /D [ 82 0 R /XYZ 70.866 743.931 null ] >> -endobj -16 0 obj -<< /D [ 82 0 R /XYZ 70.866 403.899 null ] >> +91 0 obj +[ 84 0 R ] endobj 84 0 obj -<< /Font << /F39 87 0 R /F27 88 0 R >> /ProcSet [ /PDF /Text ] >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> endobj -95 0 obj +87 0 obj +<< /D [ 83 0 R /XYZ 69.866 813.476 null ] >> +endobj +2 0 obj +<< /D [ 83 0 R /XYZ 70.866 779.528 null ] >> +endobj +6 0 obj +<< /D [ 83 0 R /XYZ 70.866 743.931 null ] >> +endobj +16 0 obj +<< /D [ 83 0 R /XYZ 70.866 403.899 null ] >> +endobj +85 0 obj +<< /Font << /F39 88 0 R /F27 89 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +96 0 obj << /Filter /FlateDecode /Length 3940 >> stream xڵ\ɎW$T2lm0'`_&dTʙ6ٙ-E-._7ߟ~z*Ktʙ˷tC\ŋ%8w B,V˷_B()kH[t=a}nZK˟J3%#^)%:0dxYh kO)۷_M2~ޭ>k{_K7>I:azF/#XH: @@ -237,22 +237,22 @@ mO[ 4XJ"']ӣkZد_g[D/Rp%ys~P: Gr1BlB^z `4+[w{JLS1·mw^AL?+r_[..d!!9ɼi5L3w]? C endstream endobj -94 0 obj -<< /Type /Page /Contents 95 0 R /Resources 93 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 89 0 R /Annots 97 0 R >> +95 0 obj +<< /Type /Page /Contents 96 0 R /Resources 94 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 90 0 R /Annots 98 0 R >> endobj -97 0 obj -[ 92 0 R ] -endobj -92 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> -endobj -96 0 obj -<< /D [ 94 0 R /XYZ 69.866 813.476 null ] >> +98 0 obj +[ 93 0 R ] endobj 93 0 obj -<< /Font << /F27 88 0 R /F39 87 0 R >> /ProcSet [ /PDF /Text ] >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> endobj -101 0 obj +97 0 obj +<< /D [ 95 0 R /XYZ 69.866 813.476 null ] >> +endobj +94 0 obj +<< /Font << /F27 89 0 R /F39 88 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +102 0 obj << /Filter /FlateDecode /Length 3596 >> stream x\K-0m[- {K~HV,R, x-Yϯju.?)˺|uWKpZ,_ߕBP @@ -282,22 +282,22 @@ o^ ګ,ܫ,o@) Txe۸#km|7`,~ O}!t կN@<;^%_$MGWxg% ԫvY<ҹ|nuAm%fA8Ɉ~CQ_=;-8{ > +101 0 obj +<< /Type /Page /Contents 102 0 R /Resources 100 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 90 0 R /Annots 104 0 R >> endobj -103 0 obj -[ 98 0 R ] -endobj -98 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> -endobj -102 0 obj -<< /D [ 100 0 R /XYZ 69.866 813.476 null ] >> +104 0 obj +[ 99 0 R ] endobj 99 0 obj -<< /Font << /F27 88 0 R /F39 87 0 R >> /ProcSet [ /PDF /Text ] >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> endobj -107 0 obj +103 0 obj +<< /D [ 101 0 R /XYZ 69.866 813.476 null ] >> +endobj +100 0 obj +<< /Font << /F27 89 0 R /F39 88 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +108 0 obj << /Filter /FlateDecode /Length 3841 >> stream xڽ\Ɏ$WLdpKP@uV,MɆu"\2+k42Ve/#%._7Q~}˧ruYo2|!.⭽x!˯W!Bos?oe;o_$/o_@ď*?㿤}Q`ĵ|'ǏM{|0ץ!|,|~X^e_~zjooG9L_~hoom Ee៉d+JV~EV㳔m3 h,*7uU&FK2i)M{O5- #aJ)7CuKǥ@M"„.,* $ PyzyZXSgyʠ8lVLUUZlaYg@H<\zb{tYGë< sO - @@ -311,25 +311,25 @@ U[ s㕢6==k'%Vi|ym 8B{͛KTߵ&vval`@Sv/Cp,Q;oYv7*ŭ2l!jt8g #7Ƭ"<$dC5?^]'p;x[σul&j#Jaؘp\z z{4y͞HhP4ݾ?F\ endstream endobj -106 0 obj -<< /Type /Page /Contents 107 0 R /Resources 105 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 89 0 R /Annots 109 0 R >> +107 0 obj +<< /Type /Page /Contents 108 0 R /Resources 106 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 90 0 R /Annots 110 0 R >> endobj -109 0 obj -[ 104 0 R ] -endobj -104 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> -endobj -108 0 obj -<< /D [ 106 0 R /XYZ 69.866 813.476 null ] >> -endobj -50 0 obj -<< /D [ 106 0 R /XYZ 70.866 293.162 null ] >> +110 0 obj +[ 105 0 R ] endobj 105 0 obj -<< /Font << /F27 88 0 R /F39 87 0 R >> /ProcSet [ /PDF /Text ] >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> endobj -113 0 obj +109 0 obj +<< /D [ 107 0 R /XYZ 69.866 813.476 null ] >> +endobj +50 0 obj +<< /D [ 107 0 R /XYZ 70.866 293.162 null ] >> +endobj +106 0 obj +<< /Font << /F27 89 0 R /F39 88 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +114 0 obj << /Filter /FlateDecode /Length 3599 >> stream xڽ\ˮ$ ߯ࢁۏk$3JoEG(T{g/Ɔ1ֹ^RbKM/+'.Tן]V4ѭvy1-Zoo?Rn|~*lNBN;[~`gkeUζ\+Ä}hZ<; @@ -355,88 +355,101 @@ j ::LݜHo endstream endobj -112 0 obj -<< /Type /Page /Contents 113 0 R /Resources 111 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 89 0 R /Annots 116 0 R >> -endobj -116 0 obj -[ 110 0 R ] -endobj -110 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> -endobj -114 0 obj -<< /D [ 112 0 R /XYZ 69.866 813.476 null ] >> -endobj -111 0 obj -<< /Font << /F27 88 0 R /F44 115 0 R /F39 87 0 R >> /ProcSet [ /PDF /Text ] >> -endobj -120 0 obj -<< /Filter /FlateDecode /Length 3048 >> -stream -xڽ[Ɏ$ WT=BY dsqZHT, j2;B+E>>Ju._^~}ef| %*59 .)A)pרwwKjwN+jo&?~OuK___OjH2ǫI}Cir2?wZ -?`g/ח[q|{:39k_&QYgi|ImBpck}U7BsM"Fiv=y@Tjt W9 n5xz2ky!i,ڹ)'hQY4pC }T͸ 6cWKL#~rV*M5p+}-̮B} >Bۤ)mSI38ʮ6dSSGam t&u5I&rɓPtgk У~UeHZ)̞y׊-HQuYd憡h#SE @ mtpmw܆Oft}ht$'xkiLhg_6׵ F}v/~xmIy\+GU" H<֕56W=BAt7iIMʆራtlW42 z뷐@5 )}C gw`݀d@Q34畈͐1qU"߇SpLנ&]oEs0o^ߛmr1:r '<ӊ^?A= -P5'p7vJ_g-n;fW]g^5WoEc;B{&a} \G1.THi1F-]8L3g 94H:8! Rh%.I؆" 3IiTXcQ)|m&"Yn£_CqeQwSM \sco(S0rb{e\j# tW$9-$>]LQseۯ~@ -|\65B:3$2 ȦĴ>y}4dhQJM2EFM,H{%;OJ}Tr P 0?L`Y4M:/`KXR֤ǁ -StfHKK,- m =tۤxhmHȞP}]`4`Rh,4.|/n0:GV3Z$D+ $>`$ 5 cnqUPax>C*Eq?63.m hz(lj8mTX7Oiԣe0еos3`gw-&hN'Q%qUwun]4f|^R<3ޤ5 -b؂AR[TС$ڷڇf -'<%9ܺpwGtGl],eB=]ϝk\K,ŵBވ`FO&Γ[88}ԝrg3Iaıw!i\Y[XOCYÎj:Y4-WB -͠s9%h7P+xNǕ=^}:0xX;xܤᮓ쿬ԯ - 4QÓiEDS-= > -endobj -122 0 obj -[ 117 0 R ] +113 0 obj +<< /Type /Page /Contents 114 0 R /Resources 112 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 90 0 R /Annots 117 0 R >> endobj 117 0 obj +[ 111 0 R ] +endobj +111 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> endobj +115 0 obj +<< /D [ 113 0 R /XYZ 69.866 813.476 null ] >> +endobj +112 0 obj +<< /Font << /F27 89 0 R /F44 116 0 R /F39 88 0 R >> /ProcSet [ /PDF /Text ] >> +endobj 121 0 obj -<< /D [ 119 0 R /XYZ 69.866 813.476 null ] >> -endobj -75 0 obj -<< /D [ 119 0 R /XYZ 70.866 510.077 null ] >> -endobj -118 0 obj -<< /Font << /F27 88 0 R /F39 87 0 R >> /ProcSet [ /PDF /Text ] >> -endobj -126 0 obj -<< /Filter /FlateDecode /Length 2923 >> +<< /Filter /FlateDecode /Length 2989 >> stream -xڭ[Ɏ$7W] -@|nO6a|R"KFUF:"("M-Ǔ釧IL^{{ yV ENǷRj%rs鷻M}z8)S^oFZO'xRGҗ5L -?Af -鷳uF8k9 vb?*ɤgiJ @ )- P҉8B_ p]e5ﳚ`ǀtzv-}їVڢ2Ol5o3WeY'q@m;fѲX޴ݐSJ`,wWNf%aM6 -Ԩ$D-_E 70~?k(٨o&0X/]MC>ተBE}f:6Û8x0 &vam?pʳ&b;V=2_Rߦ*QX&T~%P8uF08?Ehm 8K[p6R 7iܭ7zjXmh!Y5=g"cg(85%;Jᔖ}Y%+@ܝ4R'6]l$$+^D0+rHĕwm-}xtE25SWV@mn9cce 'O$Ɉ|I;~Yr FߒROx[[^E fSͣL22@SEoA@m1eIBKki⹑cE WAݧ~>e~`vYVlI`TZM4"6 ~0̘{PM0hq"Vx=Iy@SZLj+Ȉ"1F☨3~72Oc2Vo0i_yiG?Ƹٯ!{ T4}B \>@vx ?BHŭ3>*gy$=krJX hԁAIІPunM{.BBvlyОMP~Lt6w z+=%KPD+7 qAu[EMD}Ma>XCOBI?@[cW3i+Rq \t}V-bd{T;ӟ ++9l)_dTdLZ F\ Jx=T1*2XRNվHvҡqd iaDfVmwH4 0+;%"]?+1[A -b4-6+Š:6)_c0.Ǻ͕<(n:;sVx, i.B^0@v-w^iH.CAfJD6r&mv9I,APV cAsd6r.Yɇ+V xAw -4ۜjdi*V qT1DrKS.bي x5 Ӛ6-6euQby.E&XO<)Vmy,UUzAQwʊO-7Z{~<; PЖ}꩚AK -( u.,r#6FԚMCX0#cw -oު٬y )I+հr%C䅳Ыx$\I2ƂbX|Y-Ff %,H6bUq t 709Yo]wVޯ$H~b;ۚ7鋷j$N!o|Ek5jHs M'ļF6s$&u;#`4 Vm e nijTd/rR `6Y 9Nj/jGP5*ؤ 1Ҹ #!TPvD9/BVƑ]0JiB LrCklz\dz[AҼ`cO ݌,ŔF{a7ք[o_`'Eg+m CN$'R/wK蓜DII~{jn<ǭPB$u]j{qȍrݦ].x6V^Y*58IQF4?8܄ +x[n$ +=Ry`N6< AF.J5Ԇ1X\ɐyQoO +_ߟ~ypko/xB]D&Rw*vWkw*^g62kz'}3>#& euFىL`g/ӿƣO߾?Gz5M2s ~LΚ>1vd0iV?٤gi'g 8Z*cC=++x$<4-l$|>#P~i%аkoH/ri=h3mﹼysOZ,GvnJaV5"nL[e< 0vE2 5dt([ }\󒅢,5pe+s-̮B}9e)isԪCY*\K0@0iIl7H +4ww=jWP*J`۸V o_ w4P ee7J.7̋ +oCOLJt:ZhAx  +VF\FvJq;EEf ]KD#3QľQ*O9=nZjEຐύ \-lrW#MW};Nrي=00Vna+tDtWQ7;NkD|s5Sx +r[w'qWY,9[Ywrb{@}˰w hX'V\\ŤVoH!Ar'e6_[Km<~g*}HMcyiY2 8^`C?Q[du3Ce;D&d3UAӔ7L$‰ "ñ,, TX;ܶ*L1ā#,s4'U]?7vۘxgm0ȞbP}]EmJ"pRHb2Ɠ˵Zk|J| 3%=`m!AJ L$3`OcBI߆x8fCMeuqҾs~nAڗpY ۂC;Jve4e}'QTi\UJm5n)@ xU tK w+? #0A;RsZ Dٷ:v +, 9<sGjh\.=B=0]fX̝H,ŵ.RΟ,D9,Nξ`G"uK>LEA98V$WiV6>|~d9dV몰XΦ$\6^;Tr _X̑rnCQNm=^\Iu`ye;])y): ~=ln2o{,E9ahp4jYY.)kNjѻV&q(,r?e +@ +sLNSo-iRтJ/\ a&BXH-x՘8N;ջB"[~<`㗞XaY7h<E,$ōd٘,Dz9 [M5`EFlzamuQ>[ft^J0lv1[mSh- S(P;CE dpztE҉fQ*-2!swSdbV$V-yA8 +Ql^ ;Ȗ\9L +y>nii^gO I=-k%o} btƓZʼn,ΈصXbhfF;<_GNrMޣy)J|LZOR"t6X8IW5Ti+0L%h6 ?7,L0o/RZE7Ll_JYWoS7oӏ5^T&oO)WКQC-S) %zh!KtjIzNCqz`'5',ױEcuFm_ L/eH_\ubֈ obyO,:DSWEy۰u.k W +Fkٵ1nhlV Bu{,Rwu+}"Evt87#|ưk]/[?1b ;j59ci[a%WZeSʡEޓ%(qͯ!Kcdt +9nYK21/ '&Pr sKN4-@wBI endstream endobj -125 0 obj -<< /Type /Page /Contents 126 0 R /Resources 124 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 89 0 R /Annots 128 0 R >> -endobj -128 0 obj -[ 123 0 R ] +120 0 obj +<< /Type /Page /Contents 121 0 R /Resources 119 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 90 0 R /Annots 123 0 R >> endobj 123 0 obj +[ 118 0 R ] +endobj +118 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> endobj +122 0 obj +<< /D [ 120 0 R /XYZ 69.866 813.476 null ] >> +endobj +75 0 obj +<< /D [ 120 0 R /XYZ 70.866 508.858 null ] >> +endobj +79 0 obj +<< /D [ 120 0 R /XYZ 70.866 346.515 null ] >> +endobj +119 0 obj +<< /Font << /F27 89 0 R /F39 88 0 R >> /ProcSet [ /PDF /Text ] >> +endobj 127 0 obj -<< /D [ 125 0 R /XYZ 69.866 813.476 null ] >> +<< /Filter /FlateDecode /Length 2958 >> +stream +xڭ[Ɏ$7WTX$ՀocɆ}>/BJbɨjcPB"GRN㛀OOqN9sM$O^LSbJ>~= AԬwItn~W~O•w49B2GiϿ}&&oPN[~q>k{ۯ "dO)vTSLfA u5u0 +=9FaZ˪-TqtQ!lEQy+FvllѠru[Q'$U[5p[q)Ha'8B]ٞq }9W=n*o +Hꓷ:>J-*'SuR|^l|3+㙟U=@SwLf,Jwe{],s +ڃpbl3 H> +endobj +129 0 obj +[ 124 0 R ] endobj 124 0 obj -<< /Font << /F27 88 0 R /F39 87 0 R >> /ProcSet [ /PDF /Text ] >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> endobj -132 0 obj +128 0 obj +<< /D [ 126 0 R /XYZ 69.866 813.476 null ] >> +endobj +125 0 obj +<< /Font << /F27 89 0 R /F39 88 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +133 0 obj << /Filter /FlateDecode /Length 847 >> stream xڥVn0 )QGI]m[nEOz.{Q"eKv @@ -445,31 +458,31 @@ xڥV ؕaw۹KesS!ۼG c>=Q?ϛIY~0CK}VE) hdىqaⲾlhF {M#H4Bq#N/_P :ו483'aAG鬹6koݗT9 endstream endobj -131 0 obj -<< /Type /Page /Contents 132 0 R /Resources 130 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 89 0 R /Annots 133 0 R >> -endobj -133 0 obj -[ 129 0 R ] -endobj -129 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> -endobj -91 0 obj -<< /D [ 131 0 R /XYZ 69.866 813.476 null ] >> -endobj -130 0 obj -<< /Font << /F27 88 0 R /F39 87 0 R >> /ProcSet [ /PDF /Text ] >> +132 0 obj +<< /Type /Page /Contents 133 0 R /Resources 131 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 90 0 R /Annots 134 0 R >> endobj 134 0 obj +[ 130 0 R ] +endobj +130 0 obj +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 517.436 29.433 525.406 43.381 ]/A << /S /GoTo /D (page.8) >> >> +endobj +92 0 obj +<< /D [ 132 0 R /XYZ 69.866 813.476 null ] >> +endobj +131 0 obj +<< /Font << /F27 89 0 R /F39 88 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +135 0 obj [ 1 [ 583 ] 3 [ 572 488 ] 6 [ 511 307 508 ] 11 [ 565 264 ] 14 [ 519 264 848 565 550 572 ] 21 [ 364 ] 23 [ 320 ] 30 [ 623 ] 34 [ 565 ] 42 [ 784 ] 44 [ 679 588 ] 48 [ 577 557 ] 56 [ 600 ] 60 [ 600 ] 62 [ 600 ] 67 [ 600 ] 90 [ 273 ] 92 [ 293 ] 112 [ 328 328 ] ] endobj -136 0 obj +137 0 obj << /Filter /FlateDecode /Length 23 >> stream xڋIA@*_| endstream endobj -137 0 obj +138 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2729 >> stream xڥW PSpiKKFPkT\qC+U`  H#Z,.VEťEOVkf:әwgns_rXΎaYV<}n@IfIa^ ap\]ȑ*~؟RFz*8Ny^Y*31+)0B'g3`;IWHJ14g.^mܣUyɪdU!,.42A5jxM @@ -482,10 +495,10 @@ B* (:TxAe+ATx2|pz$\[ZVVDVHfmT+g1'i2#e[Gv"w0qsFRSw-e3!<~$.$b)&Pp4q6Tl*Eo?mGg/[C5XKͬzW"&[9|8o'Z3XPm|gI:m]9CYⷻ!|QZYpKKb&&9NX28{TYg\J5L& t>55(H~ޞg)ln^o^c2ǥC 8H%M\uAMeSŞe+qk sj++2RE!\ARyÿM>q߉n!zI+,Ƞjb_y ϸLQa+۽^;:YL,A]/B~nr:zl%Cde+Sފ#`Ձn^@#؎}E^:Ŕ'M0 |0wnꭌtCOc}ROK_[9, endstream endobj -135 0 obj -<< /Type /FontDescriptor /FontName /SSHRCC+IBMPlexSans-Italic /Flags 4 /FontBBox [ -245 -245 1180 1120 ] /Ascent 1025 /CapHeight 698 /Descent -275 /ItalicAngle -12 /StemV 91 /XHeight 516 /FontFile3 137 0 R /CIDSet 136 0 R >> +136 0 obj +<< /Type /FontDescriptor /FontName /SSHRCC+IBMPlexSans-Italic /Flags 4 /FontBBox [ -245 -245 1180 1120 ] /Ascent 1025 /CapHeight 698 /Descent -275 /ItalicAngle -12 /StemV 91 /XHeight 516 /FontFile3 138 0 R /CIDSet 137 0 R >> endobj -138 0 obj +139 0 obj << /Filter /FlateDecode /Length 496 >> stream xڅы0WkڴEawq5%p䫻p\&d:)ùjGζ5#)ߪ6ID-ڽidI=Ųu`Ņߢk%quxG?òXmNt}ue]ޮOV?)qv7Q?tu_Y9ʛ &W6?Z0;A3U~ g;0\^΅>4t&[zsɇQdj}d.퉜#ƃٌ):ޫ3Bl񕵻bLFQVLL M_q1We> -endobj -139 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /SSHRCC+IBMPlexSans-Italic /FontDescriptor 135 0 R /W 134 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +116 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /SSHRCC+IBMPlexSans-Italic /DescendantFonts [ 140 0 R ] /ToUnicode 139 0 R >> endobj 140 0 obj -[ 1 [ 534 ] 3 [ 580 503 580 549 324 528 ] 11 [ 568 250 250 527 272 873 568 560 580 580 367 487 351 568 492 768 507 499 464 641 653 621 671 583 559 695 707 400 510 634 501 812 707 708 606 708 640 581 572 678 609 891 613 593 580 600 ] 59 [ 600 600 600 600 600 600 600 600 600 ] 80 [ 694 891 399 ] 86 [ 588 780 ] 89 [ 565 272 ] 92 [ 292 272 292 ] 101 [ 474 ] 103 [ 475 ] 112 [ 335 335 ] 118 [ 383 ] 122 [ 927 ] 142 [ 600 ] 157 [ 396 ] 194 [ 567 ] 200 [ 534 ] 314 [ 560 ] 344 [ 640 ] 355 [ 568 ] 476 [ 708 ] 515 [ 678 ] ] -endobj -142 0 obj -<< /Filter /FlateDecode /Length 44 >> -stream -xڋ`xpH71pis / -endstream -endobj -143 0 obj -<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 5351 >> -stream -xڭY \SW1T -U\pa,`vjZu*պ# -\ -b|7¼w:s^_ 7{" -J&qӦ x=$"2#%7:arTiQ)H)iL$vDS`R||?(J6㽭t#WV;D,-{૒_5v]B%%,[JHZKNIM_"ݰLgHխHK{R ,LXK_☕ej\8mn̨tdM]!+s.8#Cyc.+eyJVvJH]$ސ4!#8ِzrʲ+VR%䔂)b)'')ՋMGxJCB\(WJKP%R:j F ^ܩj(5NyPj$EFSc8jΩΛTUT_֫WM'Ĩju:VJ}N7n*Wط{I}WʏM++ -\zJJYQ%i$On'Sّۆю*XmJp]} -ZUS$bA|{? ^@=HR8۝1E U_Lpmٳ+ŷIΊ3Gy3QMc]r_i9& 5s4 W:Z-𷟂/=E>,6cjj;0=_y\0-^5Jnf97򏮝63# SsҫOdkϸk }ѷ wtXlX[EޏHm7kK -v"DKmdsZ+N"&i5YEFX:JGeyc#ZGb0 -pB@ REc~?b[ -*<;[2H hhE 0\&2AsA>VV5ӮgCȽb47[J ܏Q|Ӭ2+`7& 8UP;\{YRG@v[˒wYI^aGZeT2q=&5+5mNJ}<{:iꌥѮ~a{Func̍ğZŋbWIYsj4p7}9 wKrGyڟpdӑ *A&I~*onE̢L; u9 -6aHrMʘxh 16 nϧU5+L?`N:=IL4.l}fdOt3OٳDF5Kn)E[€;,71 oN -1 Y_YVZd" |V ?9؋~K7@vEl&B5&dLЕ>P){/z -"͒wsM.]lzZ=Ę QPZzz3*hMukV?BY01OnIrҩda -x{pONl”PD1 'UI Ii è - مV9sjztBr2Ѣ2. baPm;(/ćjC'-a?\DՍf,#ok8jX!"a -^*,QaQ'U+ȮיaC\DcvX fl5nvYU04l5BJsi@iGcjl>͚,A>ѯ27 Agzv"X|hFM%yƦq5JRRf"v<p"t7ۛmzoWxIIs]`kK5mz_ xR =C(XыV¿QF\l -k +N!?N2Aޭ,1LS+8sht"~=Fbfke^pbI!2݄^+&CXm -bOiɋ2q鎹 [`l+atkb`7 -GTUBd' {-%X(,Uݥt.UUYFTk]wp9Y Ũ|zE]*j]$pm >#`o)e5t[% y\!":|PhU -הCVpɪ ^9{Vk#kK}M;,Q>0]co.ƪ6uy.$ cOxW  O "QϷKx\M*zL4ge擴>򽡅`bTN*L>a С.{K=HSD) ߂aI B"PHf Ukda V ^qc;W&G>VfWR,y7# N7K%5kb?IIYZcT_/ɡXӿ\ rC?]0sz}ZǿȎ{Vp$P"ФZ%1 Sl -| .0@dqctA&yȥHHXzNr;5kFvʜ3+/-pv4e=DHFQYG7.~w⡊y"Y nw@4ܤC{lYu+#.όN.ͣ?P5M c̛;ld̑I=-ri<6 ؇œ`h:3f:ёiIdۃɲ}.WmX/kvO *#I CCЎʐԥK]PQ ;rdɻrO- ~{΢%0 d.\I^1ߊ~]u수Xέژ:9|6 ] ݉a -[NG{<'GU|NTsRr:(6п$>=Y5;`P}rBܩـV=UX֖|unIr OePQ iȍN#Ȇ5Oeә狅易Q8 e.@1'y!dT3R]SbnrRN(z3"߉̙ab{uem-U EYh¸s$49,fx Ń{.ä 1ĽgM_0=]H:y6D(Ĝ'ۿu} hIB*ૡJk -ax?ǷIJ /0 r›DB Ä,ʗr{_=2^;/4v؃C%'[.kA}TPTa$N?FDoxKU |ؒE {dmmqlU>=-M`{:l7j%AV\* {~yJ͖V9;fD5Kȥ"Mȣ 5/kc; {rSoȺ,8 Tnҩ"KR5wŠ;Om9_◧%%8]cΗ0=H+_Ep0V[@ Ym&a7a~c~U4U1{w0t,j?A bNf"1~LZCxu8){k#B\n͑mfmaϽP)fcYn6\+K//AjL_;5R.=#p|}EF -Ǿ|cL1pX{…IA 6Ȑ4S`W䷋žܐK<@\ AJ`d'Ov6a.Ž%'njY R0 ZUrWgII owRQ䠍~եB#D)Vm G,܊Oh?wlW=o{YϖIIfv2y y"XK7dQ8L}vߞ=PXG@Z(W+KshL`Yk⌈ӄyts-(W 'j%mu.\:%R`Tv9_˭ 1-?ν6v;5FInst{g` γw,:U@Q˵j6AL& -K+K}gfo]w -endstream +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /SSHRCC+IBMPlexSans-Italic /FontDescriptor 136 0 R /W 135 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj 141 0 obj -<< /Type /FontDescriptor /FontName /KKCYEW+IBMPlexSans /Flags 4 /FontBBox [ -260 -245 1241 1119 ] /Ascent 1025 /CapHeight 698 /Descent -275 /ItalicAngle 0 /StemV 91 /XHeight 516 /FontFile3 143 0 R /CIDSet 142 0 R >> +[ 1 [ 534 ] 3 [ 580 503 580 549 324 528 ] 11 [ 568 250 250 527 272 873 568 560 580 580 367 487 351 568 492 768 507 499 464 641 653 621 671 583 559 695 707 400 510 634 501 812 707 708 606 708 640 581 572 678 609 891 613 593 580 600 ] 59 [ 600 600 600 600 600 600 600 600 600 ] 80 [ 694 891 399 ] 86 [ 588 ] 89 [ 565 272 ] 92 [ 292 272 292 ] 101 [ 474 ] 103 [ 475 ] 112 [ 335 335 ] 118 [ 383 ] 122 [ 927 ] 142 [ 600 ] 157 [ 396 ] 194 [ 567 ] 200 [ 534 ] 314 [ 560 ] 344 [ 640 ] 355 [ 568 ] 476 [ 708 ] 515 [ 678 ] ] endobj -144 0 obj -<< /Filter /FlateDecode /Length 736 >> +143 0 obj +<< /Filter /FlateDecode /Length 44 >> stream -xu]k@+f/ -5e"BMZ&c7dm`qdϾ=-E2n_ .:;uU\F<5ut8O٢*ۋxQCNU_M[Y}spw,OgR5[5n{cVi0SuYM&^T(6o}붋j]G>w9)\SVosnyy6"h2[wO:1}EZ/?_;'gI̼.~]\4ϻIm+㑜xҐ ! hY(F@S -Jk(n4PIP3HAs$pH8$I$ ~?y 'o!$~ ~?_τ,( Y~, -?C!ϐEgȢ3dQ( Vz3Zgk -?i,~?i,~?$8hitHp!dM2&AIf٧gݒ̲Ok#!,;trG[w6m0Ggr(S -^+NO'\g9zΧ[I͓7ҲS.νp| -{sa5?4M7WXe'd~zzGs +xڋ`xpH71pi< . endstream endobj -88 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /KKCYEW+IBMPlexSans /DescendantFonts [ 145 0 R ] /ToUnicode 144 0 R >> +144 0 obj +<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 5333 >> +stream +xڭY \SW1T7bqddV%"*X4V ԥϩѺUgZ; . PpAm y_}vPP24)!edx.gf%$-NOJ'/L_n\7sYɋԘ9DoH(%+;%yމ`ZlLLy;9eK(QrJAC ՙRRBuQjS<ޠzP=)-zQ))=ՇrRoRT??5H <(Oj05Rèj$5|є?@ j,LPT$5b *EͦRyT&.MGRTO6M$A.'`+@>Im}*uܡ^Wʋaw.t)8fSvef3ٽ.\flw9rcxnjk:v|ډN]:/\tW(SUkZFUGTճ.uXBS=XޯnFqw1| +_yG%o<뱢O]SaP!+Bid*^&pVj6o>fR9 ]D̚jNΦw{Qp()DA"Wqy2jˋ.})c3wAǕ{g=û /بA69[u +S+XPN[|#1!S\D5W/0=Wql0&4Hn5&95OS#t3wٖ+enkN }ѷ w +tXX[CޏH-7kJ +/!ĞaRW%TvAe2Kʊmp`,4-'Eba:*s;tQW]{~/P@W -P4yx3ꎠ;(3 1ˀʁX(QCe :#LncUc0 +x߿ Mfx[5Xb{a%oZĿyA-67oxk̓N7ꞗDjX}oa!=7,UCB\(b▧fiӶ,޳Lcc-XVB3 7,,XUf㠔'-wG 3N0撋*e+ɈʉOL7{ hnkI% +%"}?nB7{7~_WK/]),g37/'p^vR~ ƛ|Ј'F瞾F*}Nm`'17 ~`*\hKb AҝYcos}Kwv޴rA0r/w |5[UQxW^P2mѹnjQ0N?onbq=#}EmUV+ᎷK9E&0F{:Yls> 5Q2_*˚*cQ&(3Ď"eCdǍ[kݲGz*A%p*!J2̿ l#mZglI&ؚϚD\J8"FlT݀rԩsN!ELZOOsSڒUU2)KֹLwIn]&^AWeF66)c܄{N% QhÉKI:~,)I6`RMRmFziytafx#dQJ[Q[ی+8=Ĩ"2&&6Uhd;s*dX9 y0->{Avܽ2+Pv7"v8<.9zQSreQ=mP +nJ|>/ 6qD"$4R3?q gUܳɟ |0|O6Hr!h DtЩ:&V{GݐF:͏ H}!J7k+Zb,cmŮhXHQͷ- +#Zy}#w<@QK06~ɖ9 v[VKPƃXF28*{;J.U\UY&Tc] ep9Y +Ĩ|z{4*{Ptra㱫 Br~okcMeGv(ttb`k _!륂pɪjM.96c%✋`Cu+>0{ Ǯuz +RZ5ۥ*048!>Ļa3RUp|}9|yOHS㈆QL6O|'@74lHƒ :5~֮ptQK8A2p= /  +t?Z. I$hUs%ж2`?w:t;itX,YGq:HZǪVꤺ:Y]8wWeĚur!7z?`O: besNG Q AT+&;F~]o%0.qN$f@3 cf@i)_L~!]PihlhbO0Y RQl.a[,WK@ԏi`d}z'('LIO>z1\uzCώ,~rO-*δh|\aJtpq&]Ztj;~d$z%SLlK35dn,wOC fW]u@ ӆDL {]NL{t¯.ZOz^b=}~y"\tn+݈[ I]?_hT\5%Gv#3~7uFW~ro߃ ̥ޘEfwp){(~>-9{ggl@AI*{p0 p x7'RW>lkVt(y*֐N&IIv 66lp(V]' +_.6#?U%YWD./ov|BZ xY=ٶk9ݕ(pӷ-:BJf~Սv@NJ^ת!_-yr/M\fnj(-)*sdvH;W&"\qsaa+@[ ?M:w,oD}{߫~ݮ߆+<5`w>uG0&5 }d`g1'gpC ^;E}0AʃGssdI~ =xS:MBT WKKRrR ck+|Kz %%\埞3Cw+,Q~±;v?T(UL1.Vw:~wR0 2&M?8T?}T+`W 6_ý<@\5AJ`8!'OvVaLJ?;R0EUr{YY =o_5RQLG~ՐCDˮl31ے'wOop?7g{]{LIvaw2 +y y!X뚸> endobj 145 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /KKCYEW+IBMPlexSans /FontDescriptor 141 0 R /W 140 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +<< /Filter /FlateDecode /Length 732 >> +stream +xu_k@G)f +5/i(ݶTwW݀&(~9c nqd~^/=/E:/M}tqqãs+Ϋxn|rUyU=\uĽGI\_ُ`1uUyv݂ 柮i˺:YUL]FK A7eU4!xFR|߼<[T:[lgOMᚲzu~u}G(ܦ{j׏Ήa(pB|u;> endobj 146 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /LLEUTO+IBMPlexSans /FontDescriptor 142 0 R /W 141 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +147 0 obj [ 1 [ 569 ] 3 [ 608 517 608 562 361 552 ] 11 [ 596 286 286 577 303 894 596 564 608 608 404 504 383 596 538 841 ] 28 [ 534 518 685 667 651 697 607 585 719 724 432 559 696 530 819 724 714 656 ] 47 [ 674 624 584 694 650 973 ] 55 [ 607 600 ] 59 [ 600 600 600 600 600 600 ] 66 [ 600 600 ] 80 [ 721 ] 82 [ 403 ] 86 [ 588 780 ] 90 [ 310 ] 92 [ 330 310 ] 101 [ 535 ] 103 [ 539 ] 112 [ 338 338 ] 118 [ 460 ] 194 [ 647 ] 200 [ 569 ] 314 [ 564 ] 344 [ 692 ] 355 [ 596 ] 515 [ 694 ] ] endobj -148 0 obj +149 0 obj << /Filter /FlateDecode /Length 39 >> stream xڋ?o`Xp70`2E ' endstream endobj -149 0 obj +150 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 4888 >> stream xڝ9 TW4U)[6U ;ŀj ʾ:PGKF%n b0q4&5.xPx8?9Ι8Mzw @@ -597,10 +602,10 @@ ZQG + endstream endobj -147 0 obj -<< /Type /FontDescriptor /FontName /OANFAB+IBMPlexSans-Bold /Flags 4 /FontBBox [ -307 -275 1332 1150 ] /Ascent 1025 /CapHeight 698 /Descent -275 /ItalicAngle 0 /StemV 103 /XHeight 525 /FontFile3 149 0 R /CIDSet 148 0 R >> +148 0 obj +<< /Type /FontDescriptor /FontName /OANFAB+IBMPlexSans-Bold /Flags 4 /FontBBox [ -307 -275 1332 1150 ] /Ascent 1025 /CapHeight 698 /Descent -275 /ItalicAngle 0 /StemV 103 /XHeight 525 /FontFile3 150 0 R /CIDSet 149 0 R >> endobj -150 0 obj +151 0 obj << /Filter /FlateDecode /Length 690 >> stream x}]kPE+<kW4aR06v$'+0LGPsr1ǫo"D߆ŵթ$U]~9msSe[׉dڔEwopݥEK^%q~Nb9,?l'O¡} E*82?\U m2O@ѥ^|2oFm0H%"F?cм=;n}fb]soS(n#`>3z?-W9|k'Yeٕ.!s1K> -endobj -151 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /OANFAB+IBMPlexSans-Bold /FontDescriptor 147 0 R /W 146 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> -endobj -89 0 obj -<< /Type /Pages /Count 8 /Kids [ 82 0 R 94 0 R 100 0 R 106 0 R 112 0 R 119 0 R 125 0 R 131 0 R ] >> +88 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /OANFAB+IBMPlexSans-Bold /DescendantFonts [ 152 0 R ] /ToUnicode 151 0 R >> endobj 152 0 obj -<< /Type /Outlines /First 3 0 R /Last 79 0 R /Count 1 >> +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /OANFAB+IBMPlexSans-Bold /FontDescriptor 148 0 R /W 147 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -79 0 obj -<< /Title 80 0 R /A 78 0 R /Parent 44 0 R /Prev 76 0 R >> +90 0 obj +<< /Type /Pages /Count 8 /Kids [ 83 0 R 95 0 R 101 0 R 107 0 R 113 0 R 120 0 R 126 0 R 132 0 R ] >> +endobj +153 0 obj +<< /Type /Outlines /First 3 0 R /Last 80 0 R /Count 1 >> +endobj +80 0 obj +<< /Title 81 0 R /A 78 0 R /Parent 44 0 R /Prev 76 0 R >> endobj 76 0 obj -<< /Title 77 0 R /A 74 0 R /Parent 44 0 R /Prev 72 0 R /Next 79 0 R >> +<< /Title 77 0 R /A 74 0 R /Parent 44 0 R /Prev 72 0 R /Next 80 0 R >> endobj 72 0 obj << /Title 73 0 R /A 71 0 R /Parent 44 0 R /Prev 47 0 R /Next 76 0 R >> @@ -659,7 +664,7 @@ endobj << /Title 48 0 R /A 46 0 R /Parent 44 0 R /Next 72 0 R /First 51 0 R /Last 69 0 R /Count -7 >> endobj 44 0 obj -<< /Title 45 0 R /A 43 0 R /Parent 41 0 R /First 47 0 R /Last 79 0 R /Count -4 >> +<< /Title 45 0 R /A 43 0 R /Parent 41 0 R /First 47 0 R /Last 80 0 R /Count -4 >> endobj 41 0 obj << /Title 42 0 R /A 40 0 R /Parent 38 0 R /First 44 0 R /Last 44 0 R /Count -1 >> @@ -698,102 +703,103 @@ endobj << /Title 8 0 R /A 5 0 R /Parent 3 0 R /First 10 0 R /Last 10 0 R /Count -1 >> endobj 3 0 obj -<< /Title 4 0 R /A 1 0 R /Parent 152 0 R /First 7 0 R /Last 7 0 R /Count -1 >> -endobj -153 0 obj -<< /Names [ (Doc-Start) 2 0 R (none.1) 75 0 R (page.1) 86 0 R (page.2) 96 0 R (page.3) 102 0 R (page.4) 108 0 R (page.5) 114 0 R (page.6) 121 0 R (page.7) 127 0 R (page.8) 91 0 R (section*.1) 6 0 R (section*.2) 16 0 R (section*.3) 50 0 R ] /Limits [ (Doc-Start) (section*.3) ] >> +<< /Title 4 0 R /A 1 0 R /Parent 153 0 R /First 7 0 R /Last 7 0 R /Count -1 >> endobj 154 0 obj -<< /Dests 153 0 R >> +<< /Names [ (Doc-Start) 2 0 R (none.1) 75 0 R (none.2) 79 0 R (page.1) 87 0 R (page.2) 97 0 R (page.3) 103 0 R (page.4) 109 0 R (page.5) 115 0 R (page.6) 122 0 R (page.7) 128 0 R (page.8) 92 0 R (section*.1) 6 0 R (section*.2) 16 0 R (section*.3) 50 0 R ] /Limits [ (Doc-Start) (section*.3) ] >> endobj 155 0 obj -<< /Type /Catalog /Pages 89 0 R /Outlines 152 0 R /Names 154 0 R /PageMode/UseOutlines /OpenAction 81 0 R >> +<< /Dests 154 0 R >> endobj 156 0 obj -<< /Author(\376\377\000D\000r\000.\000-\000I\000n\000g\000.\000\040\000T\000h\000o\000m\000a\000s\000\040\000L\000a\000n\000g\000e\000r)/Title(\376\377\000L\000e\000b\000e\000n\000s\000l\000a\000u\000f\000\040\000D\000r\000.\000-\000I\000n\000g\000.\000\040\000T\000h\000o\000m\000a\000s\000\040\000L\000a\000n\000g\000e\000r)/Subject()/Creator(\376\377\000P\000a\000n\000d\000o\000c\000\040\000+\000\040\000L\000u\000a\000L\000a\000T\000e\000X)/Keywords() /Producer (LuaTeX-1.24.0) /CreationDate (D:20260426202917+02'00') /ModDate (D:20260426202917+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.24.0 (MiKTeX 26.2)) >> +<< /Type /Catalog /Pages 90 0 R /Outlines 153 0 R /Names 155 0 R /PageMode/UseOutlines /OpenAction 82 0 R >> +endobj +157 0 obj +<< /Author(\376\377\000D\000r\000.\000-\000I\000n\000g\000.\000\040\000T\000h\000o\000m\000a\000s\000\040\000L\000a\000n\000g\000e\000r)/Title(\376\377\000L\000e\000b\000e\000n\000s\000l\000a\000u\000f\000\040\000D\000r\000.\000-\000I\000n\000g\000.\000\040\000T\000h\000o\000m\000a\000s\000\040\000L\000a\000n\000g\000e\000r)/Subject()/Creator(\376\377\000P\000a\000n\000d\000o\000c\000\040\000+\000\040\000L\000u\000a\000L\000a\000T\000e\000X)/Keywords() /Producer (LuaTeX-1.24.0) /CreationDate (D:20260426213236+02'00') /ModDate (D:20260426213236+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.24.0 (MiKTeX 26.2)) >> endobj xref -0 157 +0 158 0000000000 65535 f 0000000020 00000 n 0000016450 00000 n -0000063710 00000 n +0000063724 00000 n 0000000065 00000 n 0000000266 00000 n 0000016510 00000 n -0000063616 00000 n +0000063630 00000 n 0000000312 00000 n 0000000399 00000 n -0000063520 00000 n +0000063534 00000 n 0000000445 00000 n 0000000548 00000 n -0000063422 00000 n +0000063436 00000 n 0000000595 00000 n 0000000827 00000 n 0000016570 00000 n -0000063324 00000 n +0000063338 00000 n 0000000874 00000 n 0000001316 00000 n -0000063226 00000 n +0000063240 00000 n 0000001363 00000 n 0000002095 00000 n -0000063128 00000 n +0000063142 00000 n 0000002142 00000 n 0000002669 00000 n -0000063030 00000 n +0000063044 00000 n 0000002716 00000 n 0000003178 00000 n -0000062932 00000 n +0000062946 00000 n 0000003225 00000 n 0000003952 00000 n -0000062834 00000 n +0000062848 00000 n 0000003999 00000 n 0000004558 00000 n -0000062736 00000 n +0000062750 00000 n 0000004605 00000 n 0000005132 00000 n -0000062638 00000 n +0000062652 00000 n 0000005179 00000 n 0000005636 00000 n -0000062540 00000 n +0000062554 00000 n 0000005683 00000 n 0000006155 00000 n -0000062442 00000 n +0000062456 00000 n 0000006202 00000 n 0000006688 00000 n -0000062331 00000 n +0000062345 00000 n 0000006735 00000 n 0000006998 00000 n -0000029618 00000 n -0000062257 00000 n +0000029620 00000 n +0000062271 00000 n 0000007045 00000 n 0000007969 00000 n -0000062170 00000 n +0000062184 00000 n 0000008016 00000 n 0000008794 00000 n -0000062083 00000 n +0000062097 00000 n 0000008841 00000 n 0000009856 00000 n -0000061996 00000 n +0000062010 00000 n 0000009903 00000 n 0000010557 00000 n -0000061909 00000 n +0000061923 00000 n 0000010604 00000 n 0000011265 00000 n -0000061822 00000 n +0000061836 00000 n 0000011312 00000 n 0000011938 00000 n -0000061748 00000 n +0000061762 00000 n 0000011985 00000 n 0000012457 00000 n -0000061661 00000 n +0000061675 00000 n 0000012504 00000 n 0000012582 00000 n -0000037424 00000 n -0000061574 00000 n +0000037367 00000 n +0000061588 00000 n 0000012625 00000 n 0000012698 00000 n -0000061500 00000 n +0000037429 00000 n +0000061514 00000 n 0000012741 00000 n 0000012819 00000 n 0000016082 00000 n @@ -801,78 +807,78 @@ xref 0000016631 00000 n 0000012869 00000 n 0000016389 00000 n -0000060952 00000 n -0000053989 00000 n -0000061309 00000 n +0000060966 00000 n +0000054003 00000 n +0000061323 00000 n 0000016214 00000 n -0000042277 00000 n +0000042317 00000 n 0000020893 00000 n 0000021102 00000 n 0000020734 00000 n 0000016713 00000 n 0000021041 00000 n 0000020866 00000 n -0000025025 00000 n -0000025236 00000 n +0000025026 00000 n +0000025237 00000 n 0000024862 00000 n 0000021184 00000 n -0000025173 00000 n -0000024997 00000 n -0000029406 00000 n -0000029680 00000 n -0000029241 00000 n -0000025318 00000 n -0000029555 00000 n -0000029377 00000 n -0000033609 00000 n -0000033821 00000 n -0000033444 00000 n -0000029763 00000 n -0000033758 00000 n -0000046458 00000 n -0000033580 00000 n -0000037212 00000 n -0000037486 00000 n -0000037047 00000 n -0000033917 00000 n -0000037361 00000 n -0000037183 00000 n -0000040739 00000 n -0000040951 00000 n -0000040574 00000 n -0000037569 00000 n -0000040888 00000 n -0000040710 00000 n -0000042128 00000 n -0000042339 00000 n -0000041963 00000 n -0000041034 00000 n -0000042099 00000 n -0000042422 00000 n -0000045638 00000 n -0000042698 00000 n -0000042803 00000 n -0000045880 00000 n -0000046616 00000 n -0000046820 00000 n -0000052938 00000 n -0000047355 00000 n -0000047481 00000 n -0000053171 00000 n -0000054139 00000 n -0000054336 00000 n -0000059941 00000 n -0000054826 00000 n -0000054947 00000 n -0000060180 00000 n -0000061107 00000 n -0000061426 00000 n -0000063804 00000 n -0000064101 00000 n -0000064139 00000 n -0000064265 00000 n +0000025174 00000 n +0000024998 00000 n +0000029408 00000 n +0000029682 00000 n +0000029243 00000 n +0000025320 00000 n +0000029557 00000 n +0000029379 00000 n +0000033611 00000 n +0000033823 00000 n +0000033446 00000 n +0000029765 00000 n +0000033760 00000 n +0000046498 00000 n +0000033582 00000 n +0000037155 00000 n +0000037491 00000 n +0000036990 00000 n +0000033919 00000 n +0000037304 00000 n +0000037126 00000 n +0000040779 00000 n +0000040991 00000 n +0000040614 00000 n +0000037574 00000 n +0000040928 00000 n +0000040750 00000 n +0000042168 00000 n +0000042379 00000 n +0000042003 00000 n +0000041074 00000 n +0000042139 00000 n +0000042462 00000 n +0000045678 00000 n +0000042738 00000 n +0000042843 00000 n +0000045920 00000 n +0000046656 00000 n +0000046860 00000 n +0000052956 00000 n +0000047391 00000 n +0000047517 00000 n +0000053189 00000 n +0000054153 00000 n +0000054350 00000 n +0000059955 00000 n +0000054840 00000 n +0000054961 00000 n +0000060194 00000 n +0000061121 00000 n +0000061440 00000 n +0000063818 00000 n +0000064131 00000 n +0000064169 00000 n +0000064295 00000 n trailer -<< /Size 157 /Root 155 0 R /Info 156 0 R /ID [ ] >> +<< /Size 158 /Root 156 0 R /Info 157 0 R /ID [ ] >> startxref -64925 +64955 %%EOF diff --git a/artefakte/01-lebenslauf/output/build.log b/artefakte/01-lebenslauf/output/build.log index ef5aea3..c4903ee 100644 --- a/artefakte/01-lebenslauf/output/build.log +++ b/artefakte/01-lebenslauf/output/build.log @@ -1,4 +1,4 @@ -===== Build gestartet: 2026-04-26 20:29:14 ===== +===== Build gestartet: 2026-04-26 21:32:33 ===== Source: Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\source\cv.md Template-TEX: Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\templates\template.tex Reference: Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\templates\reference.docx @@ -6,17 +6,19 @@ Output-Dir: Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslau --- Pandoc -> PDF (LuaLaTeX) --- Cmd: pandoc --from=markdown+smart --pdf-engine=lualatex --template=Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\templates\template.tex --resource-path=Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\source --output=Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\output\Lebenslauf_Dr-Ing_Thomas_Langer.pdf Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\source\cv.md -PDF OK: Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\output\Lebenslauf_Dr-Ing_Thomas_Langer.pdf (66.6 KB) +PDF OK: Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\output\Lebenslauf_Dr-Ing_Thomas_Langer.pdf (66.7 KB) --- Pandoc -> DOCX --- Cmd: pandoc --from=markdown+smart --reference-doc=Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\templates\reference.docx --resource-path=Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\source --output=Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\output\Lebenslauf_Dr-Ing_Thomas_Langer.docx Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\source\cv.md -DOCX OK: Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\output\Lebenslauf_Dr-Ing_Thomas_Langer.docx (21.9 KB) +DOCX OK: Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\output\Lebenslauf_Dr-Ing_Thomas_Langer.docx (22 KB) --- Post-Process DOCX --- [post-process-docx] Verarbeite: Q:\DesTEngS\Pro\Git\marketing\claude_cowork\artefakte\01-lebenslauf\output\Lebenslauf_Dr-Ing_Thomas_Langer.docx -[post-process-docx] Listen gefunden: 27 -[post-process-docx] Bullets in Listen: 186 -[post-process-docx] keepNext gesetzt: 95 +[post-process-docx] Listen gefunden: 26 +[post-process-docx] Bullets in Listen: 180 +[post-process-docx] keepNext gesetzt: 91 [post-process-docx] Bullets in Tabellen uebersprungen: 0 [post-process-docx] H2-Headings gefunden: 7 [post-process-docx] H2-Trenn-Absaetze eingefuegt: 7 +[post-process-docx] numbering.xml abstractNum-Eintraege: 2 +[post-process-docx] numbering.xml lvls modifiziert: 18 [post-process-docx] Fertig. -===== Build beendet: 2026-04-26 20:29:20, Exit-Code 0 ===== +===== Build beendet: 2026-04-26 21:32:39, Exit-Code 0 ===== diff --git a/artefakte/01-lebenslauf/source/cv.md b/artefakte/01-lebenslauf/source/cv.md index 602acd0..0daf2d5 100644 --- a/artefakte/01-lebenslauf/source/cv.md +++ b/artefakte/01-lebenslauf/source/cv.md @@ -206,12 +206,19 @@ Juni 1986 **Abitur** am Oberstufenzentrum Elektrotechnik in Berlin ## Trainings -- Dez. 2016 — Ansys SIwave Training -- Juni 2016 — Keysight High Speed Digital class using ADS -- Jan. 2008 — Gustav Käser, „Management" -- Juni 2007 — Die Akademie, „Führung und Organisation 1" -- Apr. 2006 — Die Akademie, „Gedächtnis- und Konzentrationstraining" -- Mai 2000 — Seminar „Persönlichkeitsentwicklung im Team" +---------- ---------------------------------------------------------------------- +Dez. 2016 Ansys SIwave Training + +Juni 2016 Keysight High Speed Digital class using ADS + +Jan. 2008 Gustav Käser, „Management" + +Juni 2007 Die Akademie, „Führung und Organisation 1" + +Apr. 2006 Die Akademie, „Gedächtnis- und Konzentrationstraining" + +Mai 2000 Seminar „Persönlichkeitsentwicklung im Team" +---------- ---------------------------------------------------------------------- ## Kenntnisse diff --git a/changelog.md b/changelog.md index 711a473..fd96d39 100644 --- a/changelog.md +++ b/changelog.md @@ -46,3 +46,4 @@ Chronologisches Log aller Entscheidungen und Prozessereignisse. 2026-04-26 13:29 | S07 | Teilgebiet 01 Iteration B (Iterationen B1, B1.5, B2) durchgezogen. Neue Datei build/build-reference-docx.py baut templates/reference.docx programmatisch aus Pandocs Default-Reference (Python-Stdlib only, kein pip; pandoc --print-default-data-file zur Laufzeit, ZIP entpacken, ElementTree-XML-Anpassungen, repacken). B1: Theme major+minor und alle direkten Schrift-Refs in styles.xml auf Calibri umgestellt (Code-Schriften wie Consolas bleiben), Tabellen-Default-Stil mit tblBorders=none auf allen Sides. B1.5: Body-DocDefault 11 pt, Heading 1/2/3 auf 15/13/12 pt analog PDF. B2: header1.xml (Default ab Seite 2 mit Name links und Lebenslauf rechts), header2.xml (leer fuer Seite 1 via titlePg), footer1.xml (rechts Seite n / m mit PAGE/NUMPAGES-Feldern, doppelt referenziert als default und first damit Seite 1 trotz titlePg den Footer hat). Page-Setup explizit in sectPr: A4 mit 2.2 cm oben/unten und 2.5 cm links/rechts analog PDF, Tab-Stop am rechten Textrand 9072 dxa. Beziehungen mit dynamisch naechster freier rId in document.xml.rels, Content-Types-Overrides in [Content_Types].xml, sectPr regex-ersetzt idempotent. Sandbox-End-to-End mit Pandoc 2.9 verifiziert (sectPr und Header/Footer im generierten DOCX vorhanden). Auf Thomas System: DOCX visuell bestaetigt. teilgebiete/01-lebenslauf.md um vollstaendigen Iteration-B-Block ergaenzt, Naechste-Schritte-Liste auf B3, B4, C, D umstrukturiert. agent-prompt.md Aktueller-Stand-Abschnitt fortgeschrieben mit Hinweisen zur reference-docx-Pipeline (manuell vor build.ps1 aufrufen, nicht von Hand in Word editieren) und zur Edit-Tool-Truncation auf dem NTFS-Mount. Build-UX-Fix in build.ps1 mit 3-Sekunden-Pause pro fehlgeschlagenem Schritt war ebenfalls Teil dieser Session. 2026-04-26 16:40 | S07 | Iteration B3 und B3.5 fuer Teilgebiet 01 abgeschlossen. B3 in build/build-reference-docx.py ergaenzt: DocDefault widowControl plus keepNext und keepLines auf Heading 1/2/3 und FirstParagraph (Pandoc-Stil fuer ersten Absatz nach einem Heading, deckt die fett formatierten Kenntnisse-Subsection-Labels KI Software-Design Methodik IT etc ab). Erster Versuch Compact-Stil mit keepNext hat Listen komplett unteilbar gemacht (Job-Stationen begannen jedes Mal auf einer neuen Seite, ungenutzte Seitenenden) und wurde verworfen. Auf Wunsch von Thomas auf 3-3-Regel umgestellt: bei Listen mit mindestens 6 Bullets duerfen Trennungen passieren, aber mindestens 3 Bullets bleiben jeweils zusammen vor und nach dem Umbruch. Bei kuerzeren Listen alles zusammen. Da das stilbasiert nicht abbildbar ist (alle Bullets haben pStyle Compact), neues Post-Processing-Skript build/post-process-docx.py: scannt das fertige DOCX, findet Sequenzen aufeinanderfolgender Bullets mit numPr-Eigenschaft ausserhalb von Tabellen-Zellen, setzt keepNext auf den ersten 2 und den N-3 N-2 Bullets jeder Liste mit n groesser gleich 6 (bei n kleiner 6 alle keepNext). build.ps1 erweitert auf 3 Schritte und ruft das Post-Processing-Skript automatisch nach erfolgreichem DOCX-Build auf, mit Console-Output und Log-Statistiken (Anzahl Listen Bullets keepNext-Markierungen). Sandbox-Verifikation 26 Listen 184 Bullets 93 keepNext, Pattern fuer 11-Bullet-Liste KK......KK.. Auf Thomas System visuell bestaetigt: Listen werden an guten Stellen getrennt, keine ungenutzten Seitenenden, keine einzelnen Bullets allein am Seitenrand. teilgebiete/01-lebenslauf.md um B3- und B3.5-Bloecke ergaenzt sowie Naechste-Schritte-Liste auf B4 C D umstrukturiert. agent-prompt.md Aktueller-Stand-Abschnitt fortgeschrieben mit B3 und B3.5, Hinweis auf 3-stufige DOCX-Pipeline und Edit-Tool-Truncation an build.ps1 ergaenzt. Naechste Session startet mit B4 (Heading-Farben oder Trennlinien analog PDF). 2026-04-26 20:35 | S08 | Teilgebiet 01 Iteration B4 fuer DOCX umgesetzt. Heading 1/2/3 in destengsblue (build/build-reference-docx.py Funktion set_heading_colors mit explizitem color val=0B5394, themeColor accent1 entfernt). Heading-Bottom-Borders direkt am Stil verworfen, weil Word die Border bei hanging-Indent linksbuendig statt zentriert rendert und der right-Indent sowohl Text als auch Border begrenzt. 21 Markdown-HRs aus cv.md entfernt - Quelle der wahrgenommenen Doppellinien war Pandocs DOCX-Konvertierung von --- Zeilen zu VML-rect mit o:hr=t (Embossed-Look). Tabellen-Strich-Zeilen blieben unangetastet. Zwischenfall: NTFS-Mount-Stale-Read der cv.md (20043 statt 20201 Bytes) haette fast die Live-Datei truncated, sofortige Wiederherstellung aus git show HEAD und HR-Removal erneut mit git-Version als Input. H2-Trennlinien via Post-Processing eingefuehrt (build/post-process-docx.py um Logik erweitert): nach jedem H2 wird ein leerer Trenn-Absatz mit linksbuendiger Bottom-Border eingefuegt, schwarz (000000), 8,6 cm Linienlaenge (right-Indent 4196 dxa), 1,25 pt Dicke (sz=10). Sandbox-Verifikation 7 H2 zu 7 Trenner. Visuelle Bestaetigung durch Thomas. teilgebiete/01-lebenslauf.md um Iteration-B4-Block ergaenzt (B4.1 Farben, B4.2 Heading-Border-Sackgasse, B4.3 HR-Removal inkl. Zwischenfall, B4.4 H2-Trennlinien) und Naechste-Schritte-Liste auf C/D verkuerzt. +2026-04-26 21:50 | S08 | Teilgebiet 01 Iterationen B5 (Trainings als Tabelle) und B6 (Bullet-Einzuege verkleinert) abgeschlossen. B5: Trainings-Bullet-Liste in cv.md durch Pandoc-Multiline-Tabelle ersetzt analog Ausbildung. B6: build/post-process-docx.py um dritte Modifikation erweitert die direkt die numbering.xml manipuliert weil Pandoc die Werte aus reference.docx ignoriert. Bullet-Einzuege auf E1 0,25/0,35 cm und E2 0,80/0,40 cm gesetzt. Word-Konvention dokumentiert: Einzug-links zeigt (left - hanging). teilgebiete/01-lebenslauf.md und agent-prompt.md fuer S09 fortgeschrieben. diff --git a/teilgebiete/01-lebenslauf.md b/teilgebiete/01-lebenslauf.md index aa379be..17cfe25 100644 --- a/teilgebiete/01-lebenslauf.md +++ b/teilgebiete/01-lebenslauf.md @@ -198,6 +198,24 @@ Die in S04 mit docx-js erstellte Version hatte strukturelle typographische Mäng **Warum kein Heading-Stil-Border:** Words `right`-Indent gilt sowohl für Text als auch für Border. Eine Border *schmaler als der Heading-Text* ist über den Stil selbst nicht abbildbar, weil Indent den Text mitkürzt. Lösung: separater Trenn-Absatz nach dem Heading. Die Underline-Alternative (Linie genau in Heading-Text-Breite) wurde verworfen, weil sie wie ein unterstrichener Text wirkt und nicht wie ein Trenner. +## Iteration B5 (S08) — Trainings als Tabelle + +**Anforderung:** Die Trainings-Sektion war als Bullet-Liste im Format `- Datum — Beschreibung` formatiert. Auf Wunsch von Thomas analog zur Ausbildungs-Sektion als Multiline-Tabelle umgestaltet, damit beide Sektionen visuell konsistent sind. + +**Umsetzung:** Trainings-Bullet-Liste in `source/cv.md` durch eine Pandoc-Multiline-Tabelle mit Strich-Verhältnis 10:70 ersetzt (gleiches Format wie Ausbildung). Datum in Spalte 1, Inhalt in Spalte 2. Inhalte normal (nicht fett), nach kurzem Feedback-Zyklus mit Thomas. Mai-2000-Eintrag braucht 4 Padding-Leerzeichen statt 3, weil „Mai 2000" 8 Zeichen lang ist (alle anderen 9). Sandbox-Verifikation: 1 → 2 Tabellen im DOCX, 1 → 2 longtables im LaTeX. Visuell durch Thomas bestätigt. + +## Iteration B6 (S08) — Bullet-Einzüge verkleinern + +**Anforderung:** Pandoc-Default-Bullet-Einzüge waren großzügig — Thomas wollte das kompakter, um Platzverschwendung zu reduzieren. Konkrete Wunschwerte: E1 Einzug 0,25 cm + Sondereinzug 0,35 cm; E2 Einzug 0,80 cm + Sondereinzug 0,40 cm. + +**Umsetzung-Pfad:** Pandoc generiert die `numbering.xml` selbst und IGNORIERT die Werte aus der `reference.docx`. Daher kann das nicht über `build-reference-docx.py` geregelt werden, sondern muss im Post-Processing nach dem Pandoc-Build stattfinden. `build/post-process-docx.py` um eine dritte Modifikation erweitert: Funktion `process_numbering_xml` parst die `numbering.xml` aus dem DOCX, iteriert alle `` und ersetzt für jedes `` (ilvl 0–8) die ``-Werte aus einer Konstanten-Tabelle `BULLET_INDENTS`. + +**Word-Konvention (wichtig — kostete eine Iteration):** Word zeigt im Absatz-Dialog „Einzug links" als `(left - hanging)` (= Bullet-Position) und „Sondereinzug Hängend" als `hanging`. Daher rechnen wir: `left = (gewünschter Einzug + gewünschter Hanging-Indent)` in dxa. Bei E1 mit 0,25 + 0,35 cm ergibt sich also `left = 340 dxa`, `hanging = 198 dxa`. Erster Versuch hatte `left = 142 dxa` gesetzt — Word zeigte dadurch Einzug `-0,1 cm`, weil das Mental-Modell die Word-Logik vertauscht hatte. Korrigiert in zweiter Iteration. + +**Sandbox-Verifikation:** 2 abstractNum-Einträge in `numbering.xml` (Pandoc nutzt 990 für „plain" und 991 für „bullet" Listen), 18 lvls insgesamt modifiziert. Auf Thomas' System visuell bestätigt: Word zeigt jetzt für E1 Einzug 0,25 cm + Sondereinzug 0,35 cm, für E2 Einzug 0,80 cm + Sondereinzug 0,40 cm. Kein Bullet klebt am Text. + +**Hinweis (S08):** Pandoc verwendet im DOCX-Output `o` als E2-Bullet-Marker (nicht `–` wie im PDF-LaTeX-Pfad). Das ist kein Problem — beide Marker passen mit dem Sondereinzug 0,4 cm. + ## Nächste Schritte 1. **Iteration C — Foto-Einbindung:** Portraitfoto in `source/cv.md` einbetten (Pandoc-Image-Syntax), Position und Größe im Template absichern (z.B. oben rechts neben Name, ca. 3 cm). @@ -213,7 +231,7 @@ Die in S04 mit docx-js erstellte Version hatte strukturelle typographische Mäng - `artefakte/01-lebenslauf/templates/template.tex` — Pandoc-LaTeX-Template für LuaLaTeX (Iteration A inkl. Pandoc-3.x-Hotfix `\newcounter{none}`). - `artefakte/01-lebenslauf/templates/reference.docx` — Pandoc-Reference-Doc, **automatisch erzeugt** durch `build/build-reference-docx.py`. Nicht von Hand editieren — Änderungen würden beim nächsten Skript-Lauf überschrieben. - `artefakte/01-lebenslauf/build/build-reference-docx.py` — Python-Skript zum Bauen der `reference.docx` (Iterationen B1, B1.5, B2, B3, B4.1 Heading-Farben). Manuell aufrufen, wenn Stile geändert werden sollen, danach normalen `build.ps1` laufen. -- `artefakte/01-lebenslauf/build/post-process-docx.py` — Python-Skript für DOCX-Post-Processing (B3.5 Listen-Bullet-Schutz und B4.4 H2-Trennlinien). Wird automatisch von `build.ps1` als Schritt [3/3] aufgerufen. +- `artefakte/01-lebenslauf/build/post-process-docx.py` — Python-Skript für DOCX-Post-Processing (B3.5 Listen-Bullet-Schutz, B4.4 H2-Trennlinien, B6 Bullet-Einzüge). Wird automatisch von `build.ps1` als Schritt [3/3] aufgerufen. - `artefakte/01-lebenslauf/build/build.ps1` — PowerShell-Build-Skript (PDF + DOCX + Post-Process) mit 3-Sekunden-Pause bei Fehler. - `artefakte/01-lebenslauf/output/` — erzeugte Ausgaben plus `build.log`.