diff --git a/OR_HTML_04/Operations_Research_mit_Python_Version_04.pdf b/OR_HTML_04/Operations_Research_mit_Python_Version_04.pdf
index 9d3ecdb..097e6bd 100644
Binary files a/OR_HTML_04/Operations_Research_mit_Python_Version_04.pdf and b/OR_HTML_04/Operations_Research_mit_Python_Version_04.pdf differ
diff --git a/OR_HTML_04/bilder_04/titelseite.svg b/OR_HTML_04/bilder_04/titelseite.svg
index b86cf11..be1ff69 100644
--- a/OR_HTML_04/bilder_04/titelseite.svg
+++ b/OR_HTML_04/bilder_04/titelseite.svg
@@ -2444,7 +2444,7 @@ z
-
+
+
@@ -2562,6 +2592,14 @@ z
+
+
+
+
+
+
+
+
diff --git a/OR_HTML_04/gesamtdokument.html b/OR_HTML_04/gesamtdokument.html
index 65e91bb..c269870 100644
--- a/OR_HTML_04/gesamtdokument.html
+++ b/OR_HTML_04/gesamtdokument.html
@@ -381,7 +381,7 @@
Mit Python planen, optimieren und entscheiden: von Personal, Schichten und Logistik über Energie, Ressourcen und Netzwerke bis zur Portfoliooptimierung an den Finanzmärkten.
Mit Python planen, optimieren und entscheiden: von Personal, Schichten und Logistik über Energie, Ressourcen und Netzwerke bis zur Portfoliooptimierung an den Finanzmärkten.
Autor / Herausgeber: Dieter Schlüter
<dieter(dot)schlueter(atsign)linix(dot)de>
-
Stand: 10. September 2026
+
Stand: 10. September 2026 v16.11
Über den Kurs
Vorwort
@@ -831,6 +831,8 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.
Die wirksamste Art, mit diesem Buch zu arbeiten, ist unbequem: Lesen Sie die Problemstellung, schließen Sie das Buch und versuchen Sie, das Modell selbst aufzuschreiben — Variablen, Zielfunktion, Nebenbedingungen. Vergleichen Sie erst dann. Die Abweichungen zwischen Ihrem Entwurf und dem Text sind genau die Stellen, an denen Sie etwas lernen. Wer stattdessen mitliest und nickt, hat am Ende des Kapitels das angenehme Gefühl, es verstanden zu haben — und steht beim eigenen Problem vor einem leeren Blatt.
Zweitens: Lassen Sie jedes Programm laufen und verändern Sie danach eine Zahl. Was passiert mit dem Vertretungsplan, wenn eine Lehrkraft ausfällt? Was mit dem Portfolio, wenn die Obergrenze von 20 % auf 10 % sinkt? Diese Experimente kosten Sekunden und bauen genau die Intuition auf, die man später beim Modellieren braucht.
Und drittens: Nehmen Sie die Übungen ernst. Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird.
+
Köln, im September 2026
+
Dieter Schlüter
diff --git a/Operations_Research_mit_Python_Version_04.md b/Operations_Research_mit_Python_Version_04.md
index b82503b..b117c2e 100644
--- a/Operations_Research_mit_Python_Version_04.md
+++ b/Operations_Research_mit_Python_Version_04.md
@@ -26,7 +26,7 @@ Autor / Herausgeber: Dieter Schlüter
-Stand: 10. September 2026
+Stand: 10. September 2026 v16.09
---
@@ -479,6 +479,18 @@ Zweitens: **Lassen Sie jedes Programm laufen und verändern Sie danach eine Zahl
Und drittens: **Nehmen Sie die Übungen ernst.** Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird.
+Köln, im September 2026
+
+```{=latex}
+\begin{flushright}
+\textit{Dieter Schlüter}
+\end{flushright}
+```
+
+```{=html}
+
Dieter Schlüter
+```
+
---
diff --git a/Operations_Research_mit_Python_Version_04.pdf b/Operations_Research_mit_Python_Version_04.pdf
index 9d3ecdb..097e6bd 100644
Binary files a/Operations_Research_mit_Python_Version_04.pdf and b/Operations_Research_mit_Python_Version_04.pdf differ
diff --git a/Operations_Research_mit_Python_Version_04/00_Vorwort_und_Lesehilfe.md b/Operations_Research_mit_Python_Version_04/00_Vorwort_und_Lesehilfe.md
index da185f0..aec2e3d 100644
--- a/Operations_Research_mit_Python_Version_04/00_Vorwort_und_Lesehilfe.md
+++ b/Operations_Research_mit_Python_Version_04/00_Vorwort_und_Lesehilfe.md
@@ -650,6 +650,18 @@ die Intuition auf, die man später beim Modellieren braucht.
Und drittens: **Nehmen Sie die Übungen ernst.** Sie sind nicht Beiwerk, sondern der Ort, an
dem aus Kenntnis Können wird.
+Köln, im {vorwort_datum}
+
+```{=latex}
+\begin{flushright}
+\textit{Dieter Schlüter}
+\end{flushright}
+```
+
+```{=html}
+
Dieter Schlüter
+```
+
---
*Weiter mit:* [dem Verzeichnis Notation und Abkürzungen](01_Notation_und_Abkuerzungen.md) — oder direkt zu [{ref:kap:einfuehrung}](10_Einfuehrung_OR.md), wenn Sie die Notation lieber nachschlagen, sobald sie auftaucht.
diff --git a/Operations_Research_mit_Python_Version_04/README.md b/Operations_Research_mit_Python_Version_04/README.md
index f4b88c4..73ecf42 100644
--- a/Operations_Research_mit_Python_Version_04/README.md
+++ b/Operations_Research_mit_Python_Version_04/README.md
@@ -157,4 +157,4 @@ Details zu den Lernpfaden stehen in [`00_Vorwort_und_Lesehilfe.md`](00_Vorwort_u
---
-*Autor / Herausgeber: Dieter Schlüter · Stand: 10. September 2026*
+*Autor / Herausgeber: Dieter Schlüter · Stand: 10. September 2026 v16.09*
diff --git a/Operations_Research_mit_Python_Version_04/build_version_04.py b/Operations_Research_mit_Python_Version_04/build_version_04.py
index c32027a..5f44a17 100644
--- a/Operations_Research_mit_Python_Version_04/build_version_04.py
+++ b/Operations_Research_mit_Python_Version_04/build_version_04.py
@@ -191,9 +191,22 @@ MONATE = ["Januar", "Februar", "März", "April", "Mai", "Juni",
def aktuelles_datum() -> str:
- """Heutiges Datum als '5. September 2026' (locale-unabhaengig)."""
+ """Heutiges Datum+Version als '5. September 2026 v11.55' (locale-unabhaengig).
+
+ Die Versionsnummer v. (24er Format, zweistellig) macht jeden
+ Uebersetzungslauf unterscheidbar - nicht nur einen pro Tag.
+ """
+ n = datetime.datetime.now()
+ return f"{n.day}. {MONATE[n.month - 1]} {n.year} v{n.hour:02d}.{n.minute:02d}"
+
+
+def aktuelles_monat_jahr() -> str:
+ """Heutiges Datum als 'September 2026' (locale-unabhaengig).
+
+ Fuer die Vorwort-Signatur 'Köln, im {vorwort_datum}'.
+ """
n = datetime.date.today()
- return f"{n.day}. {MONATE[n.month - 1]} {n.year}"
+ return f"{MONATE[n.month - 1]} {n.year}"
def pruefe_dateien() -> list[str]:
@@ -1100,7 +1113,7 @@ def erzeuge_titelseite() -> None:
# README.md wird direkt auf GitHub gerendert, deshalb steht dort kein
# Platzhalter '{datum}' (waere dort unpassend sichtbar), sondern ein lesbares
# Datum, das der Build bei jedem Lauf auf den aktuellen Stand bringt.
-README_RE = re.compile(r"Stand: \d+\. \w+ \d{4}")
+README_RE = re.compile(r"Stand: \d+\. \w+ \d{4}(?: v\d{2}\.\d{2})?")
def aktualisiere_readme_datum(datum: str) -> None:
@@ -1135,6 +1148,8 @@ def baue_markdown() -> str:
# Datum-Platzhalter 'Stand: {datum}' durch das heutige Datum ersetzen
# (nur in Dateien, die den Platzhalter enthalten - z. B. Vorwort).
inhalt = inhalt.replace("Stand: {datum}", f"Stand: {datum}")
+ # Vorwort-Signatur 'Köln, im {vorwort_datum}' dynamisch setzen.
+ inhalt = inhalt.replace("{vorwort_datum}", aktuelles_monat_jahr())
# Inhaltsverzeichnis vor dem Vorwort einfuegen (LaTeX-Rohblock)
if TOC_MARKE in inhalt and i == 0:
@@ -2275,6 +2290,7 @@ def baue_kapitel_seiten(html_verz: str, datei_seite: dict, labels: dict,
text = wandle_querverweise_seite(text, datei_seite, eintrag["seite"])
datum = aktuelles_datum()
text = text.replace("Stand: {datum}", f"Stand: {datum}")
+ text = text.replace("{vorwort_datum}", aktuelles_monat_jahr())
text = reflow_markdown(text)
text = resolve_numbering_seite(text, eintrag["seite"], labels, label_seite)
text = resolve_index(text)
diff --git a/bilder_04/erzeuge_titelseite.py b/bilder_04/erzeuge_titelseite.py
index 4aec669..fdee739 100644
--- a/bilder_04/erzeuge_titelseite.py
+++ b/bilder_04/erzeuge_titelseite.py
@@ -4,8 +4,8 @@
"""
Baut die Titelseite bilder_04/titelseite.svg (und die HTML-Kopie
OR_HTML_04/bilder_04/titelseite.svg) als SVG mit matplotlib. Das Datum im Fußband
-('Stand: ') wird dynamisch aus datetime.now() gesetzt, damit es nach
-jedem Build den aktuellen Stand zeigt.
+('Stand: v.') wird dynamisch aus datetime.now() gesetzt,
+damit es nach jedem Build den aktuellen Stand zeigt.
Die Koordinaten unten sind SVG-Punkte (595.44 x 841.68, A4 @ 72 dpi). Die
y-Achse wird invertiert (set_ylim(841.68, 0)), sodass y von oben zählt und
@@ -52,8 +52,7 @@ from matplotlib.patches import Circle, FancyBboxPatch, Rectangle
# Schreibvorgangs (auf die Mikrosekunde) in den SVG-Metadaten.
# Beides ist unsichtbar, macht aber jeden git-diff unlesbar und die beiden
# Kopien bilder_04/ und OR_HTML_04/bilder_04/ dauerhaft verschieden. Die Datei
-# aendert sich jetzt nur noch, wenn sich das SICHTBARE Datum im Fussband
-# aendert - also einmal pro Tag.
+# aendert sich jetzt bei jedem Lauf mit neuem Datum oder neuer Uhrzeit.
plt.rcParams["svg.hashsalt"] = "or-mit-python-v04"
# Hardcodierte deutsche Monatsnamen statt strftime("%B") - so ist das Datum
@@ -91,9 +90,13 @@ KARTEN = [
def datum_string() -> str:
- """Heutiges Datum als '5. September 2026' (locale-unabhängig)."""
+ """Heutiges Datum+Version als '5. September 2026 v11.55' (locale-unabhängig).
+
+ Die Versionsnummer v< Stunde>. (24er Format, zweistellig) macht
+ jeden Übersetzungslauf unterscheidbar — nicht nur einen pro Tag.
+ """
n = datetime.now()
- return f"{n.day}. {MONATE[n.month - 1]} {n.year}"
+ return f"{n.day}. {MONATE[n.month - 1]} {n.year} v{n.hour:02d}.{n.minute:02d}"
def _ring(ax, x, y, r):
diff --git a/bilder_04/titelseite.svg b/bilder_04/titelseite.svg
index b86cf11..be1ff69 100644
--- a/bilder_04/titelseite.svg
+++ b/bilder_04/titelseite.svg
@@ -2444,7 +2444,7 @@ z
-
+
+
@@ -2562,6 +2592,14 @@ z
+
+
+
+
+
+
+
+