Vorwort-Signatur (Köln, Datum + Dieter Schlüter) und Versionsnummer v<Std>.<Min> im Stand-Datum
- Vorwort endet mit „Köln, im <aktueller Monat> <Jahr>“ und rechtsbuendigem
Autornamen (LaTeX flushright + HTML text-align:right)
- Stand-Datum auf Titelseite und Website um Versionsnummer erweitert:
„Stand: 10. September 2026 v16.09“ — v<Stunde>.<Minute> macht jeden
Uebersetzungslauf unterscheidbar
- erzeuge_titelseite.py: datum_string() um Versionsnummer erweitert
- build_version_04.py: aktuelles_datum() um Versionsnummer erweitert,
README_RE-Regex fuer Versionsnummer angepasst
- neues Platzhalter-System {vorwort_datum} analog zu {datum}
This commit is contained in:
parent
3a8cab87c2
commit
81ddb02d5c
12 changed files with 139 additions and 16 deletions
BIN
OR_HTML_04/Operations_Research_mit_Python_Version_04.pdf
generated
BIN
OR_HTML_04/Operations_Research_mit_Python_Version_04.pdf
generated
Binary file not shown.
40
OR_HTML_04/bilder_04/titelseite.svg
generated
40
OR_HTML_04/bilder_04/titelseite.svg
generated
|
|
@ -2444,7 +2444,7 @@ z
|
|||
</g>
|
||||
</g>
|
||||
<g id="text_14">
|
||||
<!-- Stand: 10. September 2026 -->
|
||||
<!-- Stand: 10. September 2026 v16.09 -->
|
||||
<g style="fill: #c7d2fe" transform="translate(71.4528 818.05749) scale(0.12 -0.12)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
|
|
@ -2535,6 +2535,36 @@ Q 1497 4750 2381 4750
|
|||
Q 2619 4750 2861 4703
|
||||
Q 3103 4656 3366 4563
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-39" d="M 703 97
|
||||
L 703 672
|
||||
Q 941 559 1184 500
|
||||
Q 1428 441 1663 441
|
||||
Q 2288 441 2617 861
|
||||
Q 2947 1281 2994 2138
|
||||
Q 2813 1869 2534 1725
|
||||
Q 2256 1581 1919 1581
|
||||
Q 1219 1581 811 2004
|
||||
Q 403 2428 403 3163
|
||||
Q 403 3881 828 4315
|
||||
Q 1253 4750 1959 4750
|
||||
Q 2769 4750 3195 4129
|
||||
Q 3622 3509 3622 2328
|
||||
Q 3622 1225 3098 567
|
||||
Q 2575 -91 1691 -91
|
||||
Q 1453 -91 1209 -44
|
||||
Q 966 3 703 97
|
||||
z
|
||||
M 1959 2075
|
||||
Q 2384 2075 2632 2365
|
||||
Q 2881 2656 2881 3163
|
||||
Q 2881 3666 2632 3958
|
||||
Q 2384 4250 1959 4250
|
||||
Q 1534 4250 1286 3958
|
||||
Q 1038 3666 1038 3163
|
||||
Q 1038 2656 1286 2365
|
||||
Q 1534 2075 1959 2075
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-53"/>
|
||||
|
|
@ -2562,6 +2592,14 @@ z
|
|||
<use xlink:href="#DejaVuSans-30" transform="translate(1195.263672 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(1258.886719 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(1322.509766 0)"/>
|
||||
<use xlink:href="#DejaVuSans-20" transform="translate(1386.132812 0)"/>
|
||||
<use xlink:href="#DejaVuSans-20" transform="translate(1417.919922 0)"/>
|
||||
<use xlink:href="#DejaVuSans-76" transform="translate(1449.707031 0)"/>
|
||||
<use xlink:href="#DejaVuSans-31" transform="translate(1508.886719 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(1572.509766 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(1636.132812 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(1667.919922 0)"/>
|
||||
<use xlink:href="#DejaVuSans-39" transform="translate(1731.542969 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_15">
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 88 KiB |
4
OR_HTML_04/gesamtdokument.html
generated
4
OR_HTML_04/gesamtdokument.html
generated
|
|
@ -381,7 +381,7 @@
|
|||
<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><dieter(dot)schlueter(atsign)linix(dot)de></p>
|
||||
<p>Stand: 10. September 2026</p>
|
||||
<p>Stand: 10. September 2026 v16.09</p>
|
||||
<hr />
|
||||
<nav id="TOC" role="doc-toc">
|
||||
<ul>
|
||||
|
|
@ -2081,6 +2081,8 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
|
|||
<p>Die wirksamste Art, mit diesem Buch zu arbeiten, ist unbequem: <strong>Lesen Sie die Problemstellung, schließen Sie das Buch und versuchen Sie, das Modell selbst aufzuschreiben</strong> — 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.</p>
|
||||
<p>Zweitens: <strong>Lassen Sie jedes Programm laufen und verändern Sie danach eine Zahl.</strong> 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.</p>
|
||||
<p>Und drittens: <strong>Nehmen Sie die Übungen ernst.</strong> Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird.</p>
|
||||
<p>Köln, im September 2026</p>
|
||||
<p style="text-align: right;"><em>Dieter Schlüter</em></p>
|
||||
<hr />
|
||||
<h1 id="notation-und-abkürzungen">Notation und Abkürzungen</h1>
|
||||
<p>Dieses Kapitel ist zum Nachschlagen gedacht, nicht zum Durchlesen. Schlagen Sie hier nach, sobald Ihnen ein Symbol oder ein Kürzel begegnet, das Sie nicht sicher zuordnen können.</p>
|
||||
|
|
|
|||
2
OR_HTML_04/index.html
generated
2
OR_HTML_04/index.html
generated
|
|
@ -115,7 +115,7 @@
|
|||
<p class="hero-anwendungen">Mit Python planen, optimieren und entscheiden: von Personal, Schichten und Logistik über Energie, Ressourcen und Netzwerke bis zur Portfoliooptimierung an den Finanzmärkten.</p>
|
||||
<p class="hero-autor">Autor / Herausgeber: Dieter Schlüter<br>
|
||||
<dieter(dot)schlueter(atsign)linix(dot)de><br>
|
||||
Stand: 10. September 2026</p>
|
||||
Stand: 10. September 2026 v16.11</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="einstieg">
|
||||
|
|
|
|||
4
OR_HTML_04/vorwort.html
generated
4
OR_HTML_04/vorwort.html
generated
|
|
@ -110,7 +110,7 @@
|
|||
<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><dieter(dot)schlueter(atsign)linix(dot)de></p>
|
||||
<p>Stand: 10. September 2026</p>
|
||||
<p>Stand: 10. September 2026 v16.11</p>
|
||||
<hr />
|
||||
<h1 class="unnumbered" id="über-den-kurs">Über den Kurs</h1>
|
||||
<h2 class="unnumbered" id="vorwort">Vorwort</h2>
|
||||
|
|
@ -831,6 +831,8 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
|
|||
<p>Die wirksamste Art, mit diesem Buch zu arbeiten, ist unbequem: <strong>Lesen Sie die Problemstellung, schließen Sie das Buch und versuchen Sie, das Modell selbst aufzuschreiben</strong> — 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.</p>
|
||||
<p>Zweitens: <strong>Lassen Sie jedes Programm laufen und verändern Sie danach eine Zahl.</strong> 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.</p>
|
||||
<p>Und drittens: <strong>Nehmen Sie die Übungen ernst.</strong> Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird.</p>
|
||||
<p>Köln, im September 2026</p>
|
||||
<p style="text-align: right;"><em>Dieter Schlüter</em></p>
|
||||
|
||||
</article>
|
||||
|
||||
|
|
|
|||
14
Operations_Research_mit_Python_Version_04.md
generated
14
Operations_Research_mit_Python_Version_04.md
generated
|
|
@ -26,7 +26,7 @@ Autor / Herausgeber: Dieter Schlüter
|
|||
|
||||
<dieter(dot)schlueter(atsign)linix(dot)de>
|
||||
|
||||
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}
|
||||
<p style="text-align: right;"><em>Dieter Schlüter</em></p>
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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}
|
||||
<p style="text-align: right;"><em>Dieter Schlüter</em></p>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*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.
|
||||
|
|
|
|||
|
|
@ -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*
|
||||
|
|
|
|||
|
|
@ -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<Std>.<Min> (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)
|
||||
|
|
|
|||
|
|
@ -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: <datum>') wird dynamisch aus datetime.now() gesetzt, damit es nach
|
||||
jedem Build den aktuellen Stand zeigt.
|
||||
('Stand: <datum> v<Std>.<Min>') 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>.<Minute> (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):
|
||||
|
|
|
|||
|
|
@ -2444,7 +2444,7 @@ z
|
|||
</g>
|
||||
</g>
|
||||
<g id="text_14">
|
||||
<!-- Stand: 10. September 2026 -->
|
||||
<!-- Stand: 10. September 2026 v16.09 -->
|
||||
<g style="fill: #c7d2fe" transform="translate(71.4528 818.05749) scale(0.12 -0.12)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
|
|
@ -2535,6 +2535,36 @@ Q 1497 4750 2381 4750
|
|||
Q 2619 4750 2861 4703
|
||||
Q 3103 4656 3366 4563
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-39" d="M 703 97
|
||||
L 703 672
|
||||
Q 941 559 1184 500
|
||||
Q 1428 441 1663 441
|
||||
Q 2288 441 2617 861
|
||||
Q 2947 1281 2994 2138
|
||||
Q 2813 1869 2534 1725
|
||||
Q 2256 1581 1919 1581
|
||||
Q 1219 1581 811 2004
|
||||
Q 403 2428 403 3163
|
||||
Q 403 3881 828 4315
|
||||
Q 1253 4750 1959 4750
|
||||
Q 2769 4750 3195 4129
|
||||
Q 3622 3509 3622 2328
|
||||
Q 3622 1225 3098 567
|
||||
Q 2575 -91 1691 -91
|
||||
Q 1453 -91 1209 -44
|
||||
Q 966 3 703 97
|
||||
z
|
||||
M 1959 2075
|
||||
Q 2384 2075 2632 2365
|
||||
Q 2881 2656 2881 3163
|
||||
Q 2881 3666 2632 3958
|
||||
Q 2384 4250 1959 4250
|
||||
Q 1534 4250 1286 3958
|
||||
Q 1038 3666 1038 3163
|
||||
Q 1038 2656 1286 2365
|
||||
Q 1534 2075 1959 2075
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-53"/>
|
||||
|
|
@ -2562,6 +2592,14 @@ z
|
|||
<use xlink:href="#DejaVuSans-30" transform="translate(1195.263672 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(1258.886719 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(1322.509766 0)"/>
|
||||
<use xlink:href="#DejaVuSans-20" transform="translate(1386.132812 0)"/>
|
||||
<use xlink:href="#DejaVuSans-20" transform="translate(1417.919922 0)"/>
|
||||
<use xlink:href="#DejaVuSans-76" transform="translate(1449.707031 0)"/>
|
||||
<use xlink:href="#DejaVuSans-31" transform="translate(1508.886719 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(1572.509766 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(1636.132812 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(1667.919922 0)"/>
|
||||
<use xlink:href="#DejaVuSans-39" transform="translate(1731.542969 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_15">
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 88 KiB |
Loading…
Reference in a new issue