Glossar-Links: Fachbegriffe im Fließtext automatisch verlinken

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.
This commit is contained in:
dschlueter 2026-09-10 17:40:29 +02:00
commit e8abb66d75
52 changed files with 4316 additions and 1921 deletions

View file

@ -121,21 +121,21 @@
</thead>
<tbody>
<tr class="odd">
<td><strong>LP</strong></td>
<td><strong><a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a></strong></td>
<td>teilbare Mengen, lineare Zusammenhänge</td>
<td>beweisbares Optimum <strong>plus Schattenpreise</strong></td>
<td>sobald etwas ganzzahlig sein muss</td>
<td><a href="lp.html#kap-lp">Kapitel 5</a></td>
</tr>
<tr class="even">
<td><strong>MILP</strong></td>
<td><strong><a href="anhang-glossar.md#gloss:gemischt-ganzzahlige-optimierung-milp" class="glossar-link">MILP</a></strong></td>
<td>Ja/Nein-Entscheidungen, Fixkosten, Logik</td>
<td>beweisbares Optimum, Gap als Fortschrittsmaß</td>
<td>Laufzeit wächst mit der Zahl der Binärvariablen</td>
<td><a href="milp.html#kap-milp">Kapitel 6</a></td>
</tr>
<tr class="odd">
<td><strong>CP-SAT</strong></td>
<td><strong><a href="anhang-glossar.md#gloss:cp-sat" class="glossar-link">CP-SAT</a></strong></td>
<td>Zuweisung, Reihenfolge, Kalender, harte Logik</td>
<td>beweisbares Optimum, sehr ausdrucksstarke Bedingungen</td>
<td>keine Schattenpreise, keine stetigen Größen</td>
@ -150,7 +150,7 @@
</tr>
<tr class="odd">
<td><strong>Metaheuristiken</strong></td>
<td>wenn der exakte Solver aussteigt</td>
<td>wenn der exakte <a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a> aussteigt</td>
<td>eine gute Lösung in <strong>fester Zeit</strong></td>
<td>keine Garantie, kein Beweis, keine Schranke</td>
<td><a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a></td>
@ -182,12 +182,12 @@
<tbody>
<tr class="odd">
<td>„Der exakte Solver ist immer besser.”</td>
<td>Bei 500 Aufträgen liefert CP-SAT eine Lösung, die <strong>5,2 % schlechter</strong> ist als die Faustregel eines Meisters</td>
<td>Bei 500 Aufträgen liefert <a href="anhang-glossar.md#gloss:constraint-programming-cp" class="glossar-link">CP</a>-<a href="anhang-glossar.md#gloss:sat-boolean-satisfiability" class="glossar-link">SAT</a> eine Lösung, die <strong>5,2 % schlechter</strong> ist als die Faustregel eines Meisters</td>
<td><a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a></td>
</tr>
<tr class="even">
<td>„Metaheuristiken sind ungenau.”</td>
<td>Faustregel 2 497 → Annealing 2 343 → Annealing plus LNS <strong>2 289</strong> Minuten Rüstzeit; untere Schranke 1 768</td>
<td>Faustregel 2 497 → Annealing 2 343 → Annealing plus <a href="anhang-glossar.md#gloss:large-neighborhood-search-lns" class="glossar-link">LNS</a> <strong>2 289</strong> Minuten <a href="anhang-glossar.md#gloss:ruestzeit" class="glossar-link">Rüstzeit</a>; untere Schranke 1 768</td>
<td><a href="metaheuristiken.html#kap-metaheuristiken">Kapitel 9</a></td>
</tr>
<tr class="odd">
@ -211,7 +211,7 @@
<ol type="1">
<li><strong>Runden.</strong> Die LP-Lösung ist keine Näherung der ganzzahligen Lösung — sie kann beliebig weit danebenliegen, und gerundet sogar unzulässig werden.</li>
<li><strong>Ein zu großes Big-M.</strong> Es macht das Modell nicht falsch, sondern die Suche langsam und die Schranken wertlos. So klein wie zulässig, nie „sicherheitshalber groß”.</li>
<li><strong>Zu früh heuristisch werden.</strong> Der Umschlagpunkt, ab dem eine Metaheuristik den exakten Solver schlägt, ist eine Eigenschaft <strong>des Problems</strong> und lässt sich messen. Wer ihn nicht misst, verzichtet auf Optimalitätsgarantien, die er hätte haben können.</li>
<li><strong>Zu früh heuristisch werden.</strong> Der Umschlagpunkt, ab dem eine <a href="anhang-glossar.md#gloss:metaheuristik" class="glossar-link">Metaheuristik</a> den exakten Solver schlägt, ist eine Eigenschaft <strong>des Problems</strong> und lässt sich messen. Wer ihn nicht misst, verzichtet auf Optimalitätsgarantien, die er hätte haben können.</li>
</ol>
<h2 id="wenn-sie-nur-eines-mitnehmen">Wenn Sie nur eines mitnehmen</h2>
<blockquote>