Version 04 als eigenes Repository

Erster Commit des Strangs "Optimierte Entscheidungsfindung mit Python"
(Version 04). Die Historie der 71 Commits bis zur Trennung bleibt im
uebergeordneten Repository OR_mit_Python liegen, das ab jetzt nur noch
Version_03 (eingefroren) verwaltet und Version_04/ ignoriert.

Bewusst kein "git subtree split": Der Pfad Version_04/ existiert erst seit
der Verzeichnistrennung, ein Split braechte daher nur 7 der 41 einschlaegigen
Commits - eine Teilhistorie, die vollstaendig aussieht und es nicht ist.

Stand: 5 Teile, 23 Kapitel, 5 Anhaenge, 292 Abschnitte, 703 Querverweise,
325 Indexmarken, 73 Beispielprogramme, 32 SVGs, 4 Plotly-Figuren,
25 Notebooks, PDF mit 715 Seiten.

Zusaetzlich in diesem Commit:

* pyproject.toml mit Abhaengigkeitsgruppen finance, large-scale, api,
  figures, dev, empfehlungen. Die abgedruckte requirements.txt bleibt
  unveraendert daneben bestehen. ortools steht in der Grundausstattung,
  highspy erst in [large-scale] - so kann der HiGHS-Symbolkonflikt bei der
  schlanken Installation gar nicht erst auftreten.

* Dabei zwei Funde: graphviz wird von erzeuge_architektur_diagramme.py
  importiert, fehlt aber in requirements.txt (jetzt in [figures]); pymoo
  steht in requirements.txt, wird aber von keinem Programm importiert,
  sondern nur im Kapitel Metaheuristiken empfohlen (jetzt in
  [empfehlungen]).

* NEUER_TITEL.md nach Kritik_und_Verbesserungsvorschlaege/ verschoben - es
  ist die Vorlage des Titelblatts, kein Bestandteil des Werks. Die beiden
  Fundstellen in PROGRESS.md und erzeuge_titelseite.py nachgezogen.

* PROGRESS.md nannte noch den Untertitel der ersten Fassung; auf den
  tatsaechlichen aus erzeuge_titelseite.py korrigiert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
dschlueter 2026-09-08 01:20:09 +02:00
commit b7af2f1d9a
468 changed files with 262141 additions and 0 deletions

View file

@ -0,0 +1,123 @@
<style>
:root{
--ink:#1A1A2E; --indigo:#4338CA; --teal:#0891B2; --violet:#7C3AED;
--emerald:#059669; --amber:#D97706; --rose:#E11D48; --slate:#334155;
--tint-indigo:#EEF2FF; --tint-violet:#F5F3FF; --line:#E2E8F0;
--code-bg:#1e293b;
}
*{box-sizing:border-box;}
html{scroll-behavior:smooth;}
body{
font-family:"Segoe UI",-apple-system,BlinkMacSystemFont,"DejaVu Sans",Arial,sans-serif;
color:var(--ink); background:#ffffff; line-height:1.7;
max-width:900px; margin:0 auto; padding:1.2rem 1.4rem 6rem;
font-size:17px; -webkit-text-size-adjust:100%;
}
h1,h2,h3,h4,h5{line-height:1.25; font-weight:700; margin-top:2.2em; margin-bottom:.6em;
scroll-margin-top:1rem;}
h1{color:var(--indigo); font-size:2.15rem; border-bottom:4px solid var(--indigo); padding-bottom:.25em;}
h2{color:var(--indigo); font-size:1.6rem; border-bottom:2px solid var(--line); padding-bottom:.2em;}
h3{color:var(--teal); font-size:1.28rem;}
h4{color:var(--violet); font-size:1.1rem;}
h5{color:var(--slate); font-size:1rem; text-transform:uppercase; letter-spacing:.03em;}
a{color:var(--indigo); text-decoration:none;}
a:hover{text-decoration:underline;}
/* Externe Links: Öffnen im neuen Tab + Markierung */
a[target="_blank"]::after{content:" \2197"; font-size:.82em; color:var(--teal); text-decoration:none;}
p{margin:.75em 0;}
hr{border:0; border-top:1px solid var(--line); margin:2.2em 0;}
/* Inhaltsverzeichnis */
nav#TOC{background:var(--tint-indigo); border:1px solid #C7D2FE; border-radius:12px;
padding:1.1em 1.6em 1.3em; margin:2em 0;}
nav#TOC::before{content:"Inhalt"; display:block; font-weight:700; color:var(--indigo);
font-size:1.35rem; margin-bottom:.4em;}
nav#TOC ul{list-style:none; padding-left:1.1em; margin:.15em 0;}
nav#TOC > ul{padding-left:0;}
nav#TOC li{margin:.22em 0;}
nav#TOC a{color:var(--slate); text-decoration:none;}
nav#TOC a:hover{color:var(--indigo); text-decoration:underline;}
nav#TOC > ul > li > a{font-weight:700; color:var(--indigo);}
nav#TOC a[target="_blank"]::after{content:"";} /* keine Pfeile im TOC */
/* Bilder / Figuren */
figure{margin:2em 0; text-align:center;}
img{max-width:100%; height:auto; display:block; margin:0 auto; border-radius:10px;}
figure img{box-shadow:0 6px 24px rgba(26,26,46,.10);}
figcaption{color:var(--slate); font-size:.92rem; font-style:italic; margin-top:.7em;}
body > figure:first-of-type img{box-shadow:0 10px 40px rgba(67,56,202,.15);}
body > figure:first-of-type figcaption{display:none;}
/* Tabellen */
table{border-collapse:collapse; width:100%; margin:1.4em 0; font-size:.96rem;
box-shadow:0 2px 10px rgba(26,26,46,.06); border-radius:8px; overflow:hidden;}
th{background:var(--indigo); color:#fff; font-weight:700; text-align:left;}
th,td{padding:.6em .8em; border:1px solid var(--line); vertical-align:top;}
tbody tr:nth-child(even){background:var(--tint-indigo);}
/* Code dunkler Kasten, heller Text (breezedark) */
code{font-family:"DejaVu Sans Mono",Consolas,Menlo,monospace; font-size:.9em;
background:var(--tint-violet); color:#5b21b6; padding:.12em .4em; border-radius:5px;}
pre{background:var(--code-bg); color:#e6edf3; padding:1.1em 1.2em; border-radius:10px;
overflow-x:auto; line-height:1.5; font-size:.86rem;
box-shadow:0 4px 18px rgba(15,23,42,.25);}
pre code{background:none; color:inherit; padding:0; font-size:inherit;}
pre .co{color:#8b9bb4 !important; font-style:italic;} /* Kommentare gut lesbar */
/* Copy-Button für Codeblöcke */
div.sourceCode{position:relative;}
div.sourceCode pre.sourceCode{padding-top:2.6em;}
.copy-btn{
position:absolute; top:.6em; right:.6em; z-index:2;
display:flex; align-items:center; gap:.35em;
background:rgba(255,255,255,.08); color:#cbd5e1;
border:1px solid rgba(255,255,255,.18); border-radius:6px;
padding:.3em .65em; font:inherit; font-size:.78rem;
cursor:pointer; transition:background .15s,color .15s,border-color .15s;
}
.copy-btn:hover{background:rgba(255,255,255,.18); color:#fff;}
.copy-btn svg{width:1em; height:1em; flex:none;}
.copy-btn.copied{background:var(--emerald); color:#fff; border-color:var(--emerald);}
/* Blockquote */
blockquote{border-left:4px solid var(--violet); background:var(--tint-violet);
margin:1.4em 0; padding:.6em 1.2em; border-radius:0 8px 8px 0; color:#3b2e63;}
/* Mathe */
.katex-display{overflow-x:auto; overflow-y:hidden; padding:.4em 0;}
ul,ol{padding-left:1.5em;} li{margin:.3em 0;}
@media (max-width:640px){ body{font-size:16px; padding:1rem;} h1{font-size:1.8rem;} }
</style>
<script>
document.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll("div.sourceCode").forEach(function (box) {
var code = box.querySelector("code");
if (!code) return;
var btn = document.createElement("button");
btn.type = "button";
btn.className = "copy-btn";
btn.setAttribute("aria-label", "Code kopieren");
btn.innerHTML =
'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" ' +
'stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/>' +
'<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>' +
'<span>Kopieren</span>';
btn.addEventListener("click", function () {
navigator.clipboard.writeText(code.innerText).then(function () {
var label = btn.querySelector("span");
var original = label.textContent;
btn.classList.add("copied");
label.textContent = "Kopiert!";
setTimeout(function () {
btn.classList.remove("copied");
label.textContent = original;
}, 1500);
});
});
box.appendChild(btn);
});
});
</script>