TOC: Titel/Untertitel unlisted, 'Über den Kurs' als Teil 0 vor Vorwort

- Titel und Untertitel im Vorwort von {-} auf {.unlisted .unnumbered}
  umgestellt: verschwinden aus dem Inhaltsverzeichnis, bleiben sichtbar
- '# Über den Kurs {-}' als neue Oberüberschrift vor dem Vorwort
  eingefügt — gruppiert im TOC als 'Teil 0' den gesamten Front Matter
- TOC_MARKE auf '# Über den Kurs {-}' gesetzt, damit \tableofcontents
  davor eingefügt wird
- verschiebe_toc_vor_vorwort(): Anker auf <h1 id="über-den-kurs">
  umgestellt (Pandoc behält das ü in der ID)
- pruefe_titeltexte(): ohne_marke() generalisiert von {-} auf beliebige
  Attributblöcke {…}, sonst schlägt --check bei .unlisted .unnumbered fehl
This commit is contained in:
dschlueter 2026-09-09 22:25:12 +02:00
commit 1070baad7a
7 changed files with 23 additions and 18 deletions

View file

@ -14,9 +14,9 @@
---
# Optimierte Entscheidungsfindung mit Python {-}
# Optimierte Entscheidungsfindung mit Python {.unlisted .unnumbered}
## Von der mathematischen Modellierung zu praktischen intelligenten Lösungen für Betrieb, Technik und Finanzmärkte {-}
## Von der mathematischen Modellierung zu praktischen intelligenten Lösungen für Betrieb, Technik und Finanzmärkte {.unlisted .unnumbered}
**Ein praxisorientiertes Kompendium für Entscheider** mit Constraint Programming, Vektor-
und Matrixmethoden sowie HiGHS, SciPy, Google OR-Tools und CVXPY.
@ -31,6 +31,8 @@ Stand: {datum}
---
# Über den Kurs {-}
## Vorwort {-}
Dieses Buch hat ein einziges Ziel: **Sie sollen am Ende in der Lage sein, ein reales

View file

@ -167,7 +167,7 @@ KEINE_KAPITELDATEIEN: set[str] = {
# Das Inhaltsverzeichnis wird unmittelbar vor dieser Ueberschrift eingefuegt -
# also direkt nach dem Titelblock, noch vor dem Vorwort.
TOC_MARKE = "## Vorwort {-}"
TOC_MARKE = "# Über den Kurs {-}"
# Basis-Defaults fuer den PDF-Bau (Schriften, Geometrie, Praeambel). Bevorzugt
# wird die Kopie IM Repository: Nur so kann ein frischer Klon ein PDF bauen -
@ -469,10 +469,10 @@ def pruefe_titeltexte() -> list[str]:
zeilen = f.read().split("\n")
# Gesucht werden die '#'- und '##'-Ueberschrift und die beiden Absaetze
# danach. Der '{-}'-Zusatz (Pandoc: nicht nummerieren) gehoert nicht zum
# Text.
# danach. Ein Attributblock wie '{-}' oder '{.unlisted .unnumbered}' (Pandoc:
# nicht nummerieren / nicht ins Inhaltsverzeichnis) gehoert nicht zum Text.
def ohne_marke(text: str) -> str:
return re.sub(r"\s*\{-\}\s*$", "", text)
return re.sub(r"\s*\{[^}]*\}\s*$", "", text)
gefunden: dict[str, tuple[int, str]] = {}
absaetze: list[tuple[int, str]] = []
@ -1542,14 +1542,14 @@ def verschiebe_toc_vor_vorwort(pfad: str) -> None:
html = f.read()
nav_match = re.search(r'<nav id="TOC"[^>]*>.*?</nav>\n?', html, re.DOTALL)
vorwort_anker = '<h2 class="unnumbered" id="vorwort">'
if not nav_match or vorwort_anker not in html:
print("WARNUNG: TOC oder Vorwort-Anker nicht gefunden - Verschiebung uebersprungen.")
kurs_anker = '<h1 class="unnumbered" id="über-den-kurs">'
if not nav_match or kurs_anker not in html:
print("WARNUNG: TOC oder 'Über den Kurs'-Anker nicht gefunden - Verschiebung uebersprungen.")
return
nav_block = nav_match.group(0)
ohne_nav = html[:nav_match.start()] + html[nav_match.end():]
einfuege_pos = ohne_nav.index(vorwort_anker)
einfuege_pos = ohne_nav.index(kurs_anker)
neu = ohne_nav[:einfuege_pos] + nav_block + ohne_nav[einfuege_pos:]
with open(pfad, "w", encoding="utf-8") as f: