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

@ -118,16 +118,16 @@
<tbody>
<tr class="odd">
<td><code>INFEASIBLE</code> um 3 Uhr nachts, niemand weiß warum</td>
<td>Relaxation mit gestaffelten Strafkosten (B18); Deletion Filter für die Diagnose</td>
<td><a href="anhang-glossar.md#gloss:relaxation" class="glossar-link">Relaxation</a> mit gestaffelten <a href="anhang-glossar.md#gloss:strafkosten" class="glossar-link">Strafkosten</a> (B18); <a href="anhang-glossar.md#gloss:deletion-filter" class="glossar-link">Deletion Filter</a> für die Diagnose</td>
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a>, <a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a></td>
</tr>
<tr class="even">
<td>Der Disponent lehnt den Plan ab, weil er ihn nicht versteht</td>
<td>Constraint-Trace für die einzelne Zuweisung; Kostenzurechnung für den ganzen Plan</td>
<td><a href="anhang-glossar.md#gloss:constraint-trace" class="glossar-link">Constraint-Trace</a> für die einzelne Zuweisung; Kostenzurechnung für den ganzen Plan</td>
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a>, <a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a></td>
</tr>
<tr class="odd">
<td>Der Solver läuft ins Zeitlimit und keiner merkt es</td>
<td>Der <a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a> läuft ins Zeitlimit und keiner merkt es</td>
<td>Status, Gap und Zeitausschöpfung protokollieren — konstante Laufzeit ist ein Warnsignal</td>
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
</tr>
@ -138,7 +138,7 @@
</tr>
<tr class="odd">
<td>Ein Ergebnis lässt sich später nicht mehr nachvollziehen</td>
<td>Snapshot-Prinzip: unveränderlicher Datenstand mit ID je Lauf</td>
<td><a href="anhang-glossar.md#gloss:snapshot-prinzip" class="glossar-link">Snapshot-Prinzip</a>: unveränderlicher Datenstand mit ID je Lauf</td>
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
</tr>
<tr class="even">
@ -174,7 +174,7 @@
<td><a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a></td>
</tr>
<tr class="odd">
<td>„Der Schattenpreis sagt, was der Hebel bringt.”</td>
<td>„Der <a href="anhang-glossar.md#gloss:schattenpreis" class="glossar-link">Schattenpreis</a> sagt, was der Hebel bringt.”</td>
<td>Hochgerechnet 120 €, gemessen <strong>60 €</strong> — er gilt nur bis +15 Stunden. Die Ranglisten nach Preis und nach Wirkung drehen sich um</td>
<td><a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a></td>
</tr>