Sprungleiste (A B C ... Z) im Glossar — wie im Stichwortverzeichnis:
ein Klick je Buchstabe springt zur '## <Buchstabe>'-Überschrift.
Eingebaut in erzeuge_glossar_04.py als {=html}-Rohblock (nur HTML,
im PDF bedeutungslos).
Abkürzungen beim ersten Mal ausschreiben: 'VaR' → 'VaR (Value at Risk)',
'EVPI' → 'EVPI (Expected Value of Perfect Information)' als Link-Text
bei der ersten Nennung je Datei; danach nur die Abkürzung. 19 Abkürzungen
erfasst (VaR, CVaR, KKT, NLP, MILP, EVPI, LP, QP, ...).
CLAUDE.md: Regel 'Glossar-Links: Fachbegriffe im Fließtext automatisch
verlinkt' dokumentiert — resolve_glossar(), LINK_TEXTE,
ABBREV_ERSTE_NENNUNG, _NICHT_AUTO_LINKEN, _ZU_KURZ_ABK, .glossar-link,
{gl:}-Marke, Sprungleiste, {#gloss:<slug>}-Anchor.
Auto-Linking im Build: Glossar-Begriffe werden im Fließtext automatisch
erkannt und als Link auf den Glossar-Eintrag gesetzt — erste Nennung je
Begriff je Datei, dezent gestrichelte Unterstreichung im HTML, hyperref
im PDF. Kein manuelles Markieren bei Textänderungen nötig.
Neue Infrastruktur:
- glossar_eintraege_04.py: glossar_slug() + LINK_TEXTE-Map (automatisch
generiert aus EINTRAEGEN + Abkürzungs-Extraktion)
- erzeuge_glossar_04.py: jeder Eintrag bekommt {#gloss:<slug>}-Anchor
- build_version_04.py: resolve_glossar() — Auto-Linking + {gl:}-Marke
- web_04/site.css: .glossar-link (dezent, nicht wie Navigationslink)
5 neue Glossar-Einträge (waren als Begriff im Text, aber nicht im Glossar):
Solver, Scheduling, Graphen, Backtest, DCP (Disciplined Convex Programming)
Schutzmechanismen:
- Code-Blöcke, Inline-Code, {idx:}/{ref:}-Marken, Markdown-Links und
Überschriften werden nicht verlinkt
- Verschachtelung verhindert: 'CP-SAT-Solver' als Ganzes, nicht 'CP'+[
-'SAT'+[-'Solver'
- 'OR' als 2-Zeichen-Abkürzung nicht auto-verlinkt (False Positive in
'OR-Tools'); {gl:OR} als manuelle Marke
- Glossar selbst nicht auto-verlinkt (sonst Self-Links)
- reflow_markdown(): ::: als Block-Grenze (sonst kollabiert fenced div)
619 Glossar-Links im Gesamtdokument, 239 Anchor im Glossar, 34 im Vorwort.
Neues Skript erzeuge_stichwortregister_04.py:
- Sucht alle Glossarbegriffe (Anzeigename) in den Kapiteldateien
und markiert die erste Fundstelle je Datei mit {idx:Indexmarke}
- Termliste aus glossar_eintraege_04.py + vorhandenen {idx:...}-Markern
- Idempotent: erkennt vorhandene Marker und überspringt sie
- Überspringt Codeblöcke, Inline-Code und Math
- --check und --bericht Modi
- 605 Marker eingefügt (2 Durchläufe: 597 + 8)
Zusätzlich:
- titeltexte_04.py _saeubern(): entfernt {idx:...}-Marker vor
Titeltext-Vergleich (pruefe_titeltexte schlug sonst fehl)
Die erste Fassung stuetzte sich bei rund 30 Eintraegen auf Kenntnis der
Standardliteratur statt auf eine Abfrage. Ein Skript hat jeden Eintrag einzeln
gegen die Crossref-API gestellt: DOIs ueber /works/{doi}, Eintraege ohne DOI
ueber die bibliografische Suche mit Aehnlichkeitsbewertung.
Ergebnis: 54 der 72 Eintraege tragen eine DOI, alle 54 loesen auf und zeigen
auf das richtige Werk. Die uebrigen 18 sind Webdokumentationen,
Institutsberichte, Konferenzbeitraege ohne DOI-Vergabe oder Buecher, die
Crossref nicht auf Buchebene fuehrt.
Zwei echte Fehler:
* Almgren & Chriss stand mit (2000) und der DOI 10.21314/JOR.2000.041 - die
loest nicht auf. Richtig ist 2001 mit 10.21314/jor.2001.041; Band, Heft und
Seitenzahlen stimmten.
* Rockafellar & Uryasev stand mit S. 21-42, und zwar schon in der
Vorgaengerfassung. Der Verlagsdatensatz nennt S. 21-41.
Dazu sieben ergaenzte Buch-DOIs (Dantzig, Wolsey, Boyd/Vandenberghe, Ben-Tal
et al., Biere et al., Brandimarte/Zotteri, Powell), jede einzeln auf Verlag,
Jahr und Typ geprueft. Beim Handbook of Constraint Programming fuehrt Crossref
nur Kapitel-DOIs - statt eines geratenen Buch-DOI ist jetzt die Reihe genannt
(Foundations of Artificial Intelligence, Bd. 2).
Der lehrreichste Teil war das Verwerfen: Die Crossref-Suche liefert zu
"Network Flows" (Ahuja/Magnanti/Orlin) den Treffer 10.2307/2583863 mit 100 %
Titeluebereinstimmung - er gehoert zu einer Buchbesprechung von 1994, nicht
zum Buch. Ebenso falsch waren die Treffer zu Sutton/Barto (Rezension der
ersten Auflage, 1998), Bertsekas (1996), Kleppmann (Elsevier 2003) und dem
SCIP-Bericht (ein R-Paket). Eine automatische Uebernahme des besten Treffers
haette fuenf falsche DOIs ins Buch geschrieben; sichtbar wurde es erst beim
Abgleich von Typ, Verlag und Jahr.
Veroeffentlicht: 4 Dateien, PDF unveraendert 781 Seiten.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Auftrag: bestehende Liste bewerten, Streichkandidaten benennen, moderne
Standardwerke recherchieren, neue Themenbloecke anlegen - mit Relevanzsternen
(3 Stufen) und Themen-Tags.
Welche Bloecke fehlen, entschied nicht die Vorschlagsliste, sondern das Buch.
Vorgeschlagen waren u. a. "Diskrete Ereignissimulation (SimPy)" und
"Cloud-basierte Solver-Nutzung". Beide wurden NICHT angelegt: "SimPy" kommt im
Buch null Mal vor, "Cloud" ebenfalls null. Eine Literaturliste soll das Buch
erschliessen, nicht darueber hinausweisen. Der API-gestuetzte Betrieb ist
stattdessen im neuen Praxisblock erfasst - dort gibt es mit dem
FastAPI-Optimierungsdienst tatsaechlich einen Anker im Text.
Zwoelf neue Bloecke, in der Reihenfolge der Kapitel: Modellierung in Python;
Lineare und ganzzahlige Optimierung; Moderne Solver und Benchmarks; Graphen,
Fluesse und Tourenplanung; Metaheuristiken; Spaltengenerierung und
Dekomposition; Optimierung unter Unsicherheit; Dynamische Programmierung;
Mehrkriterielle Optimierung; Lernbasierte Optimierung; Supply Chain, Energie
und Produktionsplanung; Praxis: Betrieb, Test und Auslieferung.
Streichkandidaten: keine. Alle 27 Alteintraege sind korrekt zitiert, in ihrem
Feld massgeblich und nicht redundant. Zwei wurden auf einen Stern herabgestuft
(Dantzig 1963, Bellman 1957) - historisch bedeutend, im selben Block aber
durch modernere Darstellungen ersetzt. Eine Streichliste zu erfinden, nur weil
der Auftrag eine vorsah, waere die schlechtere Antwort gewesen.
Zur Vorgabe "bevorzugt ab 2018": nur teilweise einloesbar, und zwar aus der
Sache heraus. 22 von 63 datierten Eintraegen sind von 2018 oder juenger. In
weiten Teilen des OR sind die massgeblichen Werke aelter - Ahuja/Magnanti/
Orlin (1993), Boyd/Vandenberghe (2004), Ehrgott (2005), Birge/Louveaux (2011).
Neu ist es dort, wo sich das Feld bewegt hat: Benchmarks, Python-Bibliotheken,
lernbasierte Optimierung.
Recherchiert, nicht erinnert: Bei einem Literaturverzeichnis ist eine
erfundene Quelle der schlimmste moegliche Fehler. Die unsicheren Angaben sind
per Websuche gegen die Primaerquelle geprueft - linopy (JOSS 8(84), 4823),
SCIP Optimization Suite 9.0, Elmachtoub & Grigas (Management Science 68(1),
9-26), MIPLIB 2017 (MPC 13(3), 443-490), HiGHS und Vidal/Laporte/Matl
(EJOR 286(2), 401-416).
Ein Fund dabei: Die Mittelmann-Benchmarks enthalten seit 2024 keine
kommerziellen Solver mehr - Gurobi, IBM und FICO haben ihre Ergebnisse
entfernen lassen. Ein direkter Vergleich Gurobi gegen HiGHS ist dort nicht
mehr moeglich. Das steht jetzt als Einschraenkung beim Eintrag.
Jeder Block verweist ueber {ref:kap:...} auf sein Kapitel - 37 Querverweise,
alle aufgeloest. PDF von 772 auf 781 Seiten. Veroeffentlicht: 4 Dateien.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Zwei Beschriftungsaenderungen in baue_sidebar_html():
* "Download Notebooks als ZIP" steht jetzt auf gleicher Hoehe wie die
uebrigen Punkte statt eingerueckt unter "Notebooks".
* "Gesamtdokument (eine Seite)" -> "(eine HTML-Seite)". Direkt darunter steht
"Download Buch als PDF"; ohne das Wort HTML liess sich nicht erkennen, dass
es zwei verschiedene Formate sind.
Mit der Einrueckung faellt ihre Ursache weg: Die CSS-Klasse
.sidebar-unterpunkt in web_04/assets/site.css war eigens dafuer angelegt
worden und wird von nichts mehr benutzt - entfernt, statt als tote Regel
stehen zu bleiben.
Veroeffentlicht: 42 Dateien uebertragen (die Seiten, nichts sonst - dank
--checksum), 0 geloescht, alle vierzehn HTTP-Proben richtig. Gegenprobe vom
Server: kein sidebar-unterpunkt mehr im ausgelieferten HTML.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Der Eintrag stand direkt unter "Download Notebooks als ZIP"; ohne das Wort
"Buch" liess sich nicht auf einen Blick sehen, was da heruntergeladen wird.
Geaendert an der einen Stelle in baue_sidebar_html(), von dort auf alle 41
Seiten. Veroeffentlicht: 151 Dateien uebertragen, 0 geloescht, alle vierzehn
HTTP-Proben richtig.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
94_Anhang_Glossar_und_Literatur.md enthielt zwei verschiedene Nachschlagewerke
in einer Datei. Jetzt sind es zwei Anhaenge: E = Glossar (92 Eintraege),
F = Literaturverzeichnis (6 Kategorien). Aus 5 Anhaengen werden 6, aus 36
Kapiteldateien 37.
Die Teilung war billig: Die Datei trug bereits zwei eigenstaendige
Ueberschriften mit nichts als einem --- dazwischen, und im ganzen Buch gab es
genau einen {ref:anhang:glossar-literatur} - die Weiter-mit-Zeile im
Spickzettel. Geprueft: keine Inhaltszeile verloren, alle 92 Glossareintraege
auf der neuen Seite, Indexmarken unveraendert bei 328.
Das Seitenleisten-Menue bekommt zwei Eintraege:
Beispielprogramme
Notebooks
Download Notebooks als ZIP <- neu, eingerueckt
Glossar <- neu
Stichwortverzeichnis
Gesamtdokument (eine Seite)
Download als PDF
Der ZIP-Link benutzt dieselbe Konstante wie baue_notebooks_seite() beim
Schreiben des Archivs, damit Link und Datei nicht auseinanderlaufen. Das
Glossar erscheint absichtlich doppelt: hier als Abkuerzung neben dem
Stichwortverzeichnis, und unten in der Gruppe "Anhaenge", weil es ein Anhang
ist.
Die verwaiste anhang-glossar-literatur.html von Hand entfernt - der Build
raeumt alte Seiten nicht ab.
Nebenbefund, in PROGRESS.md festgehalten: OR_HTML_04/assets/site.css ist eine
von Hand gepflegte Quelle, die im als "generiert" beschriebenen Verzeichnis
liegt. Der Build schreibt sie nie. Dasselbe gilt fuer site.js, icons.svg,
highlight.css und plotly.min.js.
--check: 5 Teile, 23 Kapitel, 6 Anhaenge, 296 Abschnitte, 825 Querverweise,
328 Indexmarken, 37 Dateien, 28.544 Zeilen, 305 Hauptueberschriften, keine
Warnung. PDF unveraendert 759 Seiten.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>