S09: Teilgebiet 01 Iteration C Foto-Einbindung umgesetzt. Header als 2-Spalten-Grid-Table in cv.md mit Strich-Verhaeltnis 112:60 (= 65,1%/34,9% Spaltenbreite, ca. 10,15/5,43 cm bei 16 cm Textbreite). Foto rechts oben, 4,06x4,06 cm, beide Dimensionen explizit im Markdown um Pandocs Default-Wrapper keepaspectratio mit height=textheight zu vermeiden, der die Layout-Box auf 24cm Hoehe streckt und die Tabellen-Zeile zerschiesst. DOCX-Header-Spacing per neuer 4. Modifikation in build/post-process-docx.py (process_header_table): findet erste Tabelle, setzt Heading1-spacing-before=0 und Foto-Paragraph spacing-before=100 (=5pt) plus jc=right. PDF-Layout via neuem Pandoc-Lua-Filter build/header-image-wrap.lua: wrappt das Header-Foto im LaTeX-Output mit hfill+raisebox(-height)[0pt][0pt]{...}, hfill schiebt rechtsbuendig in raggedright-p-Spalte, raisebox setzt Bild-Top auf Cell-Top und reportet null Hoehe an die Tabellen-Zeile. Filter prueft FORMAT=latex und Image-Pfad enthaelt foto, DOCX bleibt unberuehrt. Lua-Filter-Erste-Version (Image durch RawInline ersetzt mit gebackenem Pfad) hat Pandocs Image-Resource-Resolution gebrochen und LuaLaTeX scheiterte mit File foto.jpg not found, Fix: Filter gibt Lua-Liste zurueck mit Original-img-Element zwischen RawInline-Wrappern. Template-Hotfixes fuer PDF: renewcommand-nolinkurl-zu-Plaintext (verhindert at-xverbatim-Bruch in longtable-Minipage durch URL-Display-Text-Verbatim-Mode), titlespacing-section-before=0pt fuer H1-Top-Alignment. cv.md: Pipe-Alignment in Grid Table programmatisch via Python ljust und Pipe-Position-Eindeutigkeitscheck (Pandoc 3.x ist beim Grid-Table-Pipe-Alignment streng, Sandbox-Pandoc 2.9 ist toleranter und damit irrefuehrend). build.ps1 erweitert um lua-filter-Argument in PDF und DOCX, plus Read-Host-Wait-on-Error entfernt (blockiert AI-Agents und CI), durch Start-Sleep 3s am Ende ersetzt. header-image-wrap.lua als Pflichtdatei in Test-Path-Check aufgenommen. Vier weitere Edit-Tool-Truncation-Vorfaelle in S09 (cv.md, template.tex zweimal, build.ps1), Lehre verschaerft Edit-Tool fuer jede nicht-triviale Modifikation auf NTFS-Mount-Dateien meiden. Sandbox-NTFS-Stale-Read auf DOCX-Output (DOCX-Datei als not a zip file, Workaround DOCX im Sandbox neu generieren). Sandbox-NTFS-Mount kann auch Datei-Schreiben mit open(w) verweigern obwohl os.path.exists True liefert, Workaround tmp-Datei plus os.rename. Build und visuelle Bestaetigung durch Thomas erfolgt fuer DOCX und PDF. teilgebiete/01-lebenslauf.md um Iteration-C-Block ergaenzt und Naechste-Schritte-Liste auf S10-Plan umgestellt (1 DOCX-Heading-Farben pruefen, 2 Doublecheck der generierten Texte mindestens elektrischer-Gehaeuse ist sinnverkehrt, 3 Buzzword-Kompetenzen brainstormen mindestens Umgang mit quantisierten LLMs fehlt, 4 PDF-Spacings H1/H2/Kontaktdaten und hellgraue Trennlinien korrigieren, 5 Hyphenation-Feintuning, 6 Teilgebiet abschliessen). agent-prompt.md Aktueller-Stand-Block fuer S10 fortgeschrieben.

This commit is contained in:
tlg
2026-04-27 18:51:18 +02:00
parent 93bf43301e
commit b26cfd0ab3
13 changed files with 3438 additions and 764 deletions

View File

@@ -253,11 +253,48 @@ Die in S04 mit docx-js erstellte Version hatte strukturelle typographische Mäng
**Build und visuelle Bestätigung durch Thomas (S09):** `build.ps1` ausgeführt; alle Links in DOCX und PDF wie gewünscht klickbar. TÜV-Klick zeigt erwartungsgemäß die Word-Fehlermeldung — der Display-Text warnt den Empfänger vorab, manuelles Copy-Paste in den Browser funktioniert.
## Iteration C (S09) — Foto-Einbindung via Grid Table
**Ziel:** Foto rechts oben auf Höhe Name + Kontaktdaten, 4,06 × 4,06 cm, eckig, nur Seite 1, einheitlich in DOCX und PDF.
**Layout-Pfad:** Grid Table im `cv.md` als 2-Spalten-Header. Linke Zelle: H1 (Name) + H2 (Kontaktdaten) + Bullet-Liste der Kontaktdaten. Rechte Zelle: Foto-Image. Spalten-Verhältnis 65,1% / 34,9% (Strich-Anzahl 112:60), entspricht ca. 10,15 cm linke / 5,43 cm rechte Spalte.
**C1 — Pipe-Alignment-Strenge in Pandoc 3.x:** Erste Grid-Table-Variante hatte inkonsistente Pipe-Positionen, weil ich die Cell-Inhalte nicht genau auf die Strich-Breiten gepaddet habe. Pandoc 2.9 (Sandbox) parst das tolerant als Tabelle, Pandoc 3.x (Thomas) erkennt das nicht als Grid Table und fällt auf Plain-Text-Rendering der Pipes zurück (DOCX-Output war reiner Text). Fix: Tabelle programmatisch in Python aufbauen mit `ljust(LEFT_W)`/`ljust(RIGHT_W)` und Eindeutigkeits-Check der Pipe-Positionen pro Zeile. Lehre: Pandoc 3.x Grid Tables verlangen exakt konsistente Pipe-Positionen in allen Zeilen.
**C2 — DOCX-Spacing für H1 und Foto via Post-Processing:** Pandoc emittiert für H1 Default-Spacing-before = 18 pt, das Foto landet ohne Spacing auf Cell-Top. Resultat: H1-Top liegt 0,7 cm unter Foto-Top. Thomas hat in Word experimentiert und gewünscht: H1-spacing-before = 0 pt, Foto-spacing-before = 5 pt, dazu Foto-Paragraph horizontal rechtsbündig (`<w:jc w:val="right"/>`). Da Pandoc das Image als „Mit Text in Zeile" einbettet (nicht als Floating Image), kann es nur über die umgebende Paragraph-Eigenschaft ausgerichtet werden. Umgesetzt als vierte Modifikation in `build/post-process-docx.py` (Funktion `process_header_table`): findet die erste Tabelle, modifiziert die `<w:pPr>` der Heading1- und der Drawing-tragenden Paragraphen.
**C3 — Foto-Größe 4,5 → 4,06 cm und Pandoc-Default-Image-Bug:** Bei der Größenänderung mit `{width=4.06cm}` allein emittierte Pandoc 3.x `\includegraphics[width=4.06cm,height=\textheight,keepaspectratio]`. Das `height=\textheight` ist Pandocs Default für Single-Width-Specs. Mit `keepaspectratio` rendert das Bild zwar visuell auf 4,06 cm × 4,06 cm, aber die Image-Box hat layoutmäßig `\textheight` (~24 cm) Höhe — und LaTeX zieht die Tabellen-Zeile auf 24 cm Höhe auf, was den ganzen Header-Layout zerschießt (Foto oben, Text unten — beobachtet von Thomas). Fix: beide Dimensionen explizit in der Markdown-Image-Syntax: `{width=4.06cm height=4.06cm}`. Pandoc emittiert dann `\includegraphics[width=4.06cm,height=4.06cm]` ohne textheight-Anteil — saubere Box-Höhe.
**C4 — PDF-Layout via Lua-Filter:** Selbst nach C3 saß das Foto im PDF in der falschen vertikalen Position (oben aus der Cell herausragend). Ursache: Pandoc 3.x emittiert für die rechte Cell mit nur einem Image-Element KEINEN `\begin{minipage}`-Wrapper (im Gegensatz zu Pandoc 2.9), das Image landet direkt in der `p{calc...}`-Spalte. In dieser p-Spalte wirkt eine implizite `\parbox[t]`-Logik: die Baseline des Images (= unterer Bildrand) wird auf die Cell-Top-Linie gesetzt, das Bild ragt also nach OBEN aus der Cell heraus. **Fix:** Pandoc-Lua-Filter `build/header-image-wrap.lua`, der das Header-Foto im LaTeX-Output mit `\hfill\raisebox{-\height}[0pt][0pt]{...}` umschließt: `\hfill` schiebt das Bild rechtsbündig in der `\raggedright`-p-Spalte, `\raisebox{-\height}[0pt][0pt]` setzt die Bild-Top auf die Baseline (= Cell-Top) und reportet null Höhe an die Tabellen-Zeile, damit die Zeilenhöhe von der linken Zelle bestimmt wird. Filter-Trigger: nur bei `FORMAT="latex"` und nur für `img.src` mit „foto" im Namen. DOCX bleibt unberührt; das DOCX-Post-Processing macht das Pendant per `<w:jc>` und `<w:spacing>`.
**C4a — Lua-Filter-Erste-Version (Image durch RawInline ersetzt) → Image-not-found:** Die erste Filter-Version hat das gesamte Image-Element durch ein einzelnes `RawInline` ersetzt, mit dem Image-Pfad gebacken in den raw-LaTeX-String. Folge: Pandoc sah kein Image-Element mehr im AST und triggerte seine Resource-Path-Resolution nicht. LuaLaTeX scheiterte mit `! Package luatex.def Error: File 'foto-wrba_2026_6782_1.jpg' not found: using draft setting.` Korrektur in der zweiten Version: Filter gibt eine Lua-**Liste** zurück, in der das Original-`img`-Element zwischen den beiden RawInline-Wrappern erhalten bleibt. So läuft Pandocs Image-Resource-Resolution weiterhin.
**C4b — `\nolinkurl{}` in `longtable`-Minipage → `\@xverbatim`-Fehler:** Pandoc emittiert für href-Links, deren Display-Text einer URL ähnelt (z.B. eine E-Mail-Adresse als Display und mailto:Adresse als Ziel), `\nolinkurl{...}` für Verbatim-Mode-Rendering. In einer `longtable`-Minipage bricht das mit `! Paragraph ended before \@xverbatim was complete.` ab. Fix: `\renewcommand{\nolinkurl}[1]{#1}` direkt nach `\hypersetup{}` im Template — URL-Display-Text wird normaler Text statt Verbatim-Mode. Im CV mit Sans-Schrift sowieso erwünscht (kein Monospace-Display für E-Mail).
**C4c — `\titlespacing*{\section}` für H1-Top-Alignment:** Default-`\titlespacing*{\section}{0pt}{1.4em}{0.5em}` (zweite Zahl = before-space) lässt H1 um 1,4 em unter der Cell-Top beginnen. Cv.md hat nur ein einziges H1 (Header-Name), daher unschädlich, das vor-Spacing global auf 0 zu setzen: `\titlespacing*{\section}{0pt}{0pt}{0.5em}`. H1 startet jetzt direkt am Cell-Top, parallel zum Foto-Top.
**C5 — Spaltenbreiten 112:60:** Strich-Verhältnis ergibt 65,12% / 34,88% ≈ 10,15 / 5,43 cm bei 16 cm Textbreite. Thomas-Wunsch war exakt 10,66 / 5,73 cm (= 65,04% / 34,96%); meine kompakteste Variante mit Image-Markdown-Mindestbreite 60 Zeichen liegt 0,5 cm linke Spalte zu schmal vs. Wunsch, ist aber funktional korrekt: H1 in einer Zeile, E-Mail in einer Zeile, Foto-Rechtsrand bündig mit Textbereich-Rand. Thomas hat das so akzeptiert.
**Build-System-Verbesserungen (S09):**
- `build/build.ps1` um `--lua-filter=$luaFilter` in PDF- und DOCX-Pandoc-Calls erweitert.
- `Read-Host`-Wait-on-Error aus `build.ps1` entfernt — das blockierte AI-Agents/CI-Aufrufe. Stattdessen `Start-Sleep -Seconds 3` am Ende bei Fehler, was menschliche Lesezeit ermöglicht und nicht blockt.
- `header-image-wrap.lua` als Pflichtdatei in den `Test-Path`-Check aufgenommen.
**Edit-Tool-Truncation-Vorfälle in S09 (vier weitere):** beim Initial-Edit der Grid Table in cv.md, bei der `\renewcommand{\nolinkurl}`-Insertion in template.tex, beim Einbau des Read-Host-Blocks in build.ps1, und nochmals bei der Dezimalpunkt-Korrektur. **Lehre verschärft: Edit-Tool für JEDE nicht-triviale Modifikation auf NTFS-Mount-Dateien meiden, generell Python-aus-git-HEAD- oder Python-aus-Disk-Pattern bevorzugen.**
**Sandbox-NTFS-Stale-Read auf DOCX-Output:** Beim Versuch, das von Thomas erzeugte DOCX im Sandbox zu inspizieren, lieferte der Sandbox-Read das DOCX als „File is not a zip file" zurück (End-of-central-directory fehlte). Workaround: DOCX in der Sandbox aus cv.md neu generieren statt das Live-File zu lesen.
**Build und visuelle Bestätigung durch Thomas (S09):** DOCX und PDF zeigen Foto rechts oben, korrekt ausgerichtet, korrekt bemessen. Layout aus Thomas' Sicht akzeptiert.
## 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).
2. **Iteration D — Hyphenation-Feintuning für PDF:** Kurze Wortteile am Zeilenanfang mit höherer Penalty oder gezielten `\hyphenation`-Ausnahmen reduzieren. Iterativ.
3. Teilgebiet nach erfolgreichem Output und Freigabe durch Thomas abschließen (R2-OK von Thomas: Status auf „abgeschlossen" im zentral-index.md).
1. **DOCX-Mängel beheben:** Blau-Ton der Headings ist nicht DesTEngS-Blau (Soll-Wert `#0B5394`). Heading-Stile in `build/build-reference-docx.py` prüfen, ob die `set_heading_colors`-Funktion auf dem Stil greift oder ob Word den Theme-Color trotzdem als Aptos-Default rendert.
2. **Doublecheck der neu generierten Texte:** Mindestens „elektrischer Gehäuse" ist sinnverkehrt (vermutlich aus den V9/V10-Iterationen entstanden). cv.md komplett auf Sinn- und Sprachfehler durchgehen.
3. **Buzzword-Kompetenzen-Brainstorm:** Kenntnisse-Abschnitt erweitern. Mindestens „Umgang mit quantisierten LLMs" fehlt noch. Weitere KI-relevante Begriffe für das Agentur-Keyword-Matching identifizieren.
4. **PDF-Mängel beheben:** Abstände zwischen H1, H2 „Kontaktdaten" und der Kontaktdaten-Bullet-Liste stimmen nicht (Folge der `\titlespacing*{\section}{0pt}{0pt}{0.5em}`-Änderung). Hellgraue Trennlinien (rulegray, `#BFBFBF`) sind inakzeptabel — Farbe oder Linienführung überdenken.
5. **Iteration D — Hyphenation-Feintuning für PDF:** Kurze Wortteile am Zeilenanfang mit höherer Penalty oder gezielten `\hyphenation`-Ausnahmen reduzieren. Iterativ.
6. Teilgebiet nach erfolgreichem Output und Freigabe durch Thomas abschließen (R2-OK von Thomas: Status auf „abgeschlossen" im zentral-index.md).
## Artefakte