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

@ -375,8 +375,8 @@
<figcaption>Titelseite — Optimierte Entscheidungsfindung mit Python · Dieter Schlüter</figcaption>
</figure>
<hr />
<h1 class="unnumbered" id="optimierte-entscheidungsfindung-mit-python">Optimierte Entscheidungsfindung mit Python</h1>
<h2 class="unnumbered" id="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</h2>
<h1 class="unlisted unnumbered" id="optimierte-entscheidungsfindung-mit-python">Optimierte Entscheidungsfindung mit Python</h1>
<h2 class="unlisted unnumbered" id="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</h2>
<p><strong>Ein praxisorientiertes Kompendium für Entscheider</strong> mit Constraint Programming, Vektor- und Matrixmethoden sowie HiGHS, SciPy, Google OR-Tools und CVXPY.</p>
<p>Mit Python planen, optimieren und entscheiden: von <strong>Personal, Schichten und Logistik</strong> über <strong>Energie, Ressourcen und Netzwerke</strong> bis zur <strong>Portfoliooptimierung an den Finanzmärkten</strong>.</p>
<p>Autor / Herausgeber: Dieter Schlüter</p>
@ -385,9 +385,8 @@
<hr />
<nav id="TOC" role="doc-toc">
<ul>
<li><a href="#optimierte-entscheidungsfindung-mit-python" id="toc-optimierte-entscheidungsfindung-mit-python">Optimierte Entscheidungsfindung mit Python</a>
<li><a href="#über-den-kurs" id="toc-über-den-kurs">Über den Kurs</a>
<ul>
<li><a href="#von-der-mathematischen-modellierung-zu-praktischen-intelligenten-lösungen-für-betrieb-technik-und-finanzmärkte" id="toc-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</a></li>
<li><a href="#vorwort" id="toc-vorwort">Vorwort</a></li>
<li><a href="#ziel-der-masterclass" id="toc-ziel-der-masterclass">Ziel der Masterclass</a>
<ul>
@ -1363,6 +1362,7 @@
</ul></li>
</ul>
</nav>
<h1 class="unnumbered" id="über-den-kurs">Über den Kurs</h1>
<h2 class="unnumbered" id="vorwort">Vorwort</h2>
<p>Dieses Buch hat ein einziges Ziel: <strong>Sie sollen am Ende in der Lage sein, ein reales Entscheidungsproblem aus Ihrem eigenen Umfeld in ein mathematisches Modell zu übersetzen, es in Python zu lösen und das Ergebnis jemandem zu erklären, der kein Mathematiker ist.</strong></p>
<p>Dieses Kompendium versteht sich als <strong>Arbeitsbuch</strong>. Das zeigt sich an drei Stellen:</p>

View file

@ -104,14 +104,15 @@
<figcaption>Titelseite — Optimierte Entscheidungsfindung mit Python · Dieter Schlüter</figcaption>
</figure>
<hr />
<h1 class="unnumbered" id="optimierte-entscheidungsfindung-mit-python">Optimierte Entscheidungsfindung mit Python</h1>
<h2 class="unnumbered" id="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</h2>
<h1 class="unlisted unnumbered" id="optimierte-entscheidungsfindung-mit-python">Optimierte Entscheidungsfindung mit Python</h1>
<h2 class="unlisted unnumbered" id="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</h2>
<p><strong>Ein praxisorientiertes Kompendium für Entscheider</strong> mit Constraint Programming, Vektor- und Matrixmethoden sowie HiGHS, SciPy, Google OR-Tools und CVXPY.</p>
<p>Mit Python planen, optimieren und entscheiden: von <strong>Personal, Schichten und Logistik</strong> über <strong>Energie, Ressourcen und Netzwerke</strong> bis zur <strong>Portfoliooptimierung an den Finanzmärkten</strong>.</p>
<p>Autor / Herausgeber: Dieter Schlüter</p>
<p>&lt;dieter(dot)schlueter(atsign)linix(dot)de&gt;</p>
<p>Stand: 9. September 2026</p>
<hr />
<h1 class="unnumbered" id="über-den-kurs">Über den Kurs</h1>
<h2 class="unnumbered" id="vorwort">Vorwort</h2>
<p>Dieses Buch hat ein einziges Ziel: <strong>Sie sollen am Ende in der Lage sein, ein reales Entscheidungsproblem aus Ihrem eigenen Umfeld in ein mathematisches Modell zu übersetzen, es in Python zu lösen und das Ergebnis jemandem zu erklären, der kein Mathematiker ist.</strong></p>
<p>Dieses Kompendium versteht sich als <strong>Arbeitsbuch</strong>. Das zeigt sich an drei Stellen:</p>

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.
@ -36,6 +36,8 @@ Stand: 9. September 2026
\clearpage
```
# Über den Kurs {-}
## Vorwort {-}
Dieses Buch hat ein einziges Ziel: **Sie sollen am Ende in der Lage sein, ein reales Entscheidungsproblem aus Ihrem eigenen Umfeld in ein mathematisches Modell zu übersetzen, es in Python zu lösen und das Ergebnis jemandem zu erklären, der kein Mathematiker ist.**

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: