Files
marketing_claude/artefakte/01-lebenslauf/templates/template.tex
tlg b26cfd0ab3 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.
2026-04-27 18:51:18 +02:00

185 lines
6.8 KiB
TeX

%% template.tex — Pandoc-LaTeX-Template für den DesTEngS-Lebenslauf
%% Engine: LuaLaTeX (wegen fontspec + OpenType-Schrift IBM Plex Sans)
%% Status: zweite Iteration mit typographischen Tiefen-Eingriffen.
\documentclass[11pt,a4paper]{article}
%% Section-Nummerierung deaktivieren (CV soll keine 1.2.3-Nummern haben)
\setcounter{secnumdepth}{0}
%% === Schrift ================================================================
\usepackage{fontspec}
\setmainfont{IBM Plex Sans}
\setsansfont{IBM Plex Sans}
\setmonofont{IBM Plex Mono}
\renewcommand{\familydefault}{\sfdefault}
%% === Sprache und Mikrotypographie ===========================================
\usepackage{microtype}
\usepackage{polyglossia}
\setdefaultlanguage{german}
%% === Geometrie ==============================================================
\usepackage[a4paper,
top=2.2cm, bottom=2.2cm, left=2.5cm, right=2.5cm,
headheight=16pt, headsep=0.6cm,
footskip=1.0cm]{geometry}
%% === Absatz-Layout ==========================================================
%% CV-Stil: keine Erstzeilen-Einrückung, stattdessen Vertikalabstand
\setlength{\parindent}{0pt}
\setlength{\parskip}{0.5em plus 0.2em minus 0.1em}
%% === Widow/Orphan-Kontrolle (strikt) ========================================
\widowpenalty=10000
\clubpenalty=10000
\displaywidowpenalty=10000
\brokenpenalty=10000
\raggedbottom
%% === Hyphenation tunen ======================================================
%% Hoehere Penalty: lieber leichte Ueberlaenge als unschoene Trennungen
\hyphenpenalty=500
\exhyphenpenalty=500
\tolerance=400
\emergencystretch=2em
%% === Farbe ==================================================================
\usepackage{xcolor}
\definecolor{destengsblue}{HTML}{0B5394}
\definecolor{rulegray}{HTML}{BFBFBF}
%% === Hyperlinks =============================================================
%% URLs blau, interne Links (\pageref u.ae.) schwarz
\usepackage[hidelinks]{hyperref}
\hypersetup{
colorlinks=true,
linkcolor=black,
urlcolor=destengsblue,
citecolor=destengsblue,
pdfauthor={Dr.-Ing. Thomas Langer},
pdftitle={Lebenslauf Dr.-Ing. Thomas Langer},
pdfcreator={Pandoc + LuaLaTeX},
}
%% Pandoc emittiert fuer href-Links, deren Display-Text wie eine URL aussieht
%% (z.B. eine E-Mail-Adresse als Display und mailto:Adresse als Ziel),
%% \nolinkurl{...} um den Text in Verbatim-Mode zu rendern. Verbatim-Mode
%% bricht in fragilen Kontexten wie `longtable`-Minipage mit
%% ! Paragraph ended before \@xverbatim was complete.
%% ab. Da wir im CV (Sans-Serif durchgehend) kein Verbatim-Mode-Rendering
%% fuer URLs brauchen, redefinieren wir \nolinkurl{} zu Plain-Text-Output.
\renewcommand{\nolinkurl}[1]{#1}
%% === Bilder =================================================================
\usepackage{graphicx}
%% === Listen =================================================================
\usepackage{enumitem}
\setlist{nosep, leftmargin=1.2em, topsep=0.2em, partopsep=0pt, parsep=0pt, itemsep=0.15em}
%% Level 1: gefuellter Bullet
\setlist[itemize,1]{label=\textbullet}
%% Level 2: Endstrich (textopenbullet ist in Plex Sans nicht enthalten)
\setlist[itemize,2]{label=\textendash, leftmargin=2.0em}
%% === Tabellen ===============================================================
%% Pandoc emittiert fuer Markdown-Tabellen eine longtable mit booktabs-Linien
%% (\toprule, \bottomrule). Im CV werden Tabellen rahmenlos als Layout-Werkzeug
%% eingesetzt (z.B. Ausbildung als 2-Spalten-Layout: Datum links, Inhalt rechts).
%%
%% Pandoc 3.x emittiert Spaltenbreiten als calc-Ausdruck der Form
%% p{(\columnwidth - 2\tabcolsep) * \real{0.8554}}
%% sowie >{\raggedright\arraybackslash}p{...}-Praeambeln. Dafuer brauchen wir
%% das array-Paket (\arraybackslash), das calc-Paket (Multiplikation in
%% Laengenarithmetik) und das Pandoc-Hilfsmakro \real, das in unserem Template
%% selbst providet werden muss, weil wir den Pandoc-Default-Header nicht nutzen.
\usepackage{array}
\usepackage{calc}
\usepackage{booktabs}
\usepackage{longtable}
\providecommand{\real}[1]{#1}
%% Pandoc 3.x emittiert fuer unnummerierte Tabellen `\def\LTcaptype{none}`
%% ohne den Counter `none` zu definieren. Pandocs eigene Default-Vorlage
%% definiert ihn (commit d835461 in Pandoc 3.8.2.1), Custom-Templates muessen
%% das selbst tun, sonst bricht LuaLaTeX mit
%% ! LaTeX Error: No counter 'none' defined.
%% in der Tabellen-Spaltenangabe ab. Siehe github.com/jgm/pandoc/issues/11201.
\newcounter{none}
%% Linienbreiten auf 0pt: \toprule/\midrule/\bottomrule rendern unsichtbar.
\setlength{\heavyrulewidth}{0pt}
\setlength{\lightrulewidth}{0pt}
\setlength{\cmidrulewidth}{0pt}
%% Kein Vertikalabstand um die Linien.
\setlength{\aboverulesep}{0pt}
\setlength{\belowrulesep}{0pt}
%% Vertikalabstand vor/nach longtable reduzieren (Default ist \bigskipamount).
\setlength{\LTpre}{0.4em}
\setlength{\LTpost}{0.4em}
%% === Schusterjungen-Schutz ==================================================
\usepackage{needspace}
%% === Abschnitte =============================================================
\usepackage{titlesec}
%% H1 (\section): gross, blau, mit Trennlinie. Im CV nur einmal (Name oben).
\titleformat{\section}
{\Large\bfseries\color{destengsblue}}
{}{0em}
{}
[\vspace{-0.3em}{\color{rulegray}\titlerule[0.4pt]}]
%% H2 (\subsection): mittelgross, blau, mit Trennlinie.
%% Hauptabschnitte (Kontaktdaten, Zusammenfassung, Stationen, Ausbildung, Kenntnisse)
\titleformat{\subsection}
{\large\bfseries\color{destengsblue}}
{}{0em}
{}
[\vspace{-0.3em}{\color{rulegray}\titlerule[0.3pt]}]
%% H3 (\subsubsection): normal-fett, jeweils Stations-Titel.
%% needspace verhindert Fast-Schusterjunge: kein Pagebreak, wenn weniger
%% als 6 Zeilen Platz; nopagebreak nach: Titel und erste Liste bleiben zusammen.
\titleformat{\subsubsection}
{\needspace{6\baselineskip}\normalsize\bfseries}
{}{0em}
{}
[\nopagebreak]
\titlespacing*{\section}{0pt}{0pt}{0.5em}
\titlespacing*{\subsection}{0pt}{1.0em}{0.4em}
\titlespacing*{\subsubsection}{0pt}{0.7em}{0.2em}
%% === Kopf- und Fusszeile ====================================================
\usepackage{fancyhdr}
\usepackage{lastpage}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[L]{\small Dr.-Ing. Thomas Langer}
\fancyhead[R]{\small Lebenslauf}
\fancyfoot[R]{\small \thepage\,/\,\pageref{LastPage}}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\headrule}{\color{rulegray}\hrule height 0.4pt}
%% Erste Seite ohne Header
\fancypagestyle{firstpage}{%
\fancyhf{}%
\fancyfoot[R]{\small \thepage\,/\,\pageref{LastPage}}%
\renewcommand{\headrulewidth}{0pt}%
}
%% === Pandoc-Hilfen ==========================================================
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
%% Lange URL-Zeilen brechen
\usepackage{xurl}
%% === Dokument ===============================================================
\begin{document}
\thispagestyle{firstpage}
$body$
\end{document}