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

@ -103,7 +103,7 @@
<div class="card card-blick">
<blockquote>
<p><strong>📌 Kapitel auf einen Blick</strong></p>
<p><strong>Worum geht es?</strong> Um den Schritt, der vor jedem Solver kommt und über den kaum ein Lehrbuch spricht: aus einem Satz in einer Besprechung ein Modell zu machen. Genau hier scheitern Projekte — nicht an der Mathematik.</p>
<p><strong>Worum geht es?</strong> Um den Schritt, der vor jedem <a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a> kommt und über den kaum ein Lehrbuch spricht: aus einem Satz in einer Besprechung ein Modell zu machen. Genau hier scheitern Projekte — nicht an der Mathematik.</p>
<p><strong>Voraussetzungen:</strong> <a href="einfuehrung.html#kap-einfuehrung">Kapitel 1</a> (die vier Bausteine eines Modells). Kein Solverwissen nötig; das ganze Kapitel kommt mit einer einzigen <code>linprog</code>-Zeile aus.</p>
<p><strong>Danach können Sie:</strong> eine Anforderung daraufhin abklopfen, was sie <em>nicht</em> sagt; die Zielgröße so wählen, dass sie keinen Fehlanreiz setzt; harte von weichen Regeln unterscheiden — und begründen, warum diese Unterscheidung ein Jahr später über die Betriebsfähigkeit entscheidet.</p>
<p><strong>Zeitbedarf:</strong> ca. 3 Stunden.</p>
@ -167,7 +167,7 @@
</tbody>
</table>
<div class="sourceCode" id="cb1"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> numpy <span class="im">as</span> np</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> scipy.optimize <span class="im">import</span> linprog</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> scipy.optimize <span class="im">import</span> [linprog](anhang<span class="op">-</span>glossar.md<span class="co">#gloss:linprog){.glossar-link}</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="co"># Auftrag: A B C D E</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>stunden <span class="op">=</span> np.array([ <span class="dv">60</span>, <span class="dv">30</span>, <span class="dv">30</span>, <span class="dv">25</span>, <span class="dv">15</span>], dtype<span class="op">=</span><span class="bu">float</span>)</span>
@ -195,7 +195,7 @@ Deckungsbeitrag maximieren -&gt; BD Umsatz 40,000 DB 19,000</code></pre>
<blockquote>
<p><strong>🎯 Merksatz</strong> Ein Modell rechnet nicht aus, was man will, sondern was man aufgeschrieben hat. Die Differenz zwischen beidem ist die eigentliche Arbeit dieses Kapitels.</p>
</blockquote>
<p><strong>Warum funktioniert das?</strong> Weil eine Zielfunktion eine <strong>vollständige</strong> Aussage darüber ist, was zählt. Alles, was nicht darin steht, ist dem Modell gleichgültig — nicht „weniger wichtig”, sondern <strong>wertlos</strong>. Der Umsatzplan opfert den Deckungsbeitrag nicht aus Bosheit; er sieht ihn schlicht nicht.</p>
<p><strong>Warum funktioniert das?</strong> Weil eine <a href="anhang-glossar.md#gloss:zielfunktion" class="glossar-link">Zielfunktion</a> eine <strong>vollständige</strong> Aussage darüber ist, was zählt. Alles, was nicht darin steht, ist dem Modell gleichgültig — nicht „weniger wichtig”, sondern <strong>wertlos</strong>. Der Umsatzplan opfert den Deckungsbeitrag nicht aus Bosheit; er sieht ihn schlicht nicht.</p>
<hr />
<h2 id="sec:modellierung-lernziele">4.2 Lernziele</h2>
<p>Nach diesem Kapitel können Sie …</p>
@ -683,7 +683,7 @@ Drei Dinge, die deshalb vor dem ersten Modell geklaert gehoeren:
</blockquote>
<p>Wer sie nicht stellt, entscheidet sie trotzdem — nur unbewusst, beim Tippen.</p>
<h3 id="teil-3-hart-oder-weich">Teil 3: Hart oder weich</h3>
<p>Dieselbe Regel als Strafkosten je abgelehntem Stammkundenauftrag:</p>
<p>Dieselbe Regel als <a href="anhang-glossar.md#gloss:strafkosten" class="glossar-link">Strafkosten</a> je abgelehntem Stammkundenauftrag:</p>
<table>
<thead>
<tr class="header">
@ -758,7 +758,7 @@ Lesart C (weich): loesbar - 66,000 EUR Deckungsbeitrag, 1 Stammauftrag abgelehnt
<tr class="even">
<td>„Mehr als zwei Millionen gibt es nicht.”</td>
<td>dasselbe, auf Geld</td>
<td>Budgetlimit (B27)</td>
<td><a href="anhang-glossar.md#gloss:budgetlimit" class="glossar-link">Budgetlimit</a> (B27)</td>
</tr>
<tr class="odd">
<td>„Möglichst nicht über 40 Stunden.”</td>
@ -773,7 +773,7 @@ Lesart C (weich): loesbar - 66,000 EUR Deckungsbeitrag, 1 Stammauftrag abgelehnt
<tr class="odd">
<td>„Wenn wir die Anlage nutzen, fallen Fixkosten an.”</td>
<td>Kosten, die erst ab der ersten Einheit anfallen</td>
<td>Aktivierungsschalter (B1)</td>
<td><a href="anhang-glossar.md#gloss:aktivierungsschalter" class="glossar-link">Aktivierungsschalter</a> (B1)</td>
</tr>
<tr class="even">
<td>„Entweder gar nicht oder mindestens 50.”</td>
@ -783,7 +783,7 @@ Lesart C (weich): loesbar - 66,000 EUR Deckungsbeitrag, 1 Stammauftrag abgelehnt
<tr class="odd">
<td>„Wenn wir A bauen, brauchen wir auch B.”</td>
<td>eine Folgeverpflichtung</td>
<td>Implikation (B3)</td>
<td><a href="anhang-glossar.md#gloss:implikation" class="glossar-link">Implikation</a> (B3)</td>
</tr>
<tr class="even">
<td>„Höchstens drei Positionen im Depot.”</td>
@ -793,7 +793,7 @@ Lesart C (weich): loesbar - 66,000 EUR Deckungsbeitrag, 1 Stammauftrag abgelehnt
<tr class="odd">
<td>„Der Anteil muss mindestens 30 % betragen.”</td>
<td>eine Bedingung auf ein <strong>Verhältnis</strong></td>
<td>Verhältnis-Bedingung (B12)</td>
<td><a href="anhang-glossar.md#gloss:verhaeltnis-bedingung" class="glossar-link">Verhältnis-Bedingung</a> (B12)</td>
</tr>
<tr class="even">
<td>„Jeder Auftrag genau einem Mitarbeiter.”</td>
@ -803,12 +803,12 @@ Lesart C (weich): loesbar - 66,000 EUR Deckungsbeitrag, 1 Stammauftrag abgelehnt
<tr class="odd">
<td>„Eine Maschine kann nur eines gleichzeitig.”</td>
<td>zeitliche Ausschließlichkeit</td>
<td>Nichtüberlappung (B14)</td>
<td><a href="anhang-glossar.md#gloss:nichtueberlappung" class="glossar-link">Nichtüberlappung</a> (B14)</td>
</tr>
<tr class="even">
<td>„B kann erst nach A.”</td>
<td>eine Reihenfolge</td>
<td>Vorrangbeziehung (B13)</td>
<td><a href="anhang-glossar.md#gloss:vorrangbeziehung" class="glossar-link">Vorrangbeziehung</a> (B13)</td>
</tr>
<tr class="odd">
<td>„Höchstens fünf Tage am Stück.”</td>
@ -818,12 +818,12 @@ Lesart C (weich): loesbar - 66,000 EUR Deckungsbeitrag, 1 Stammauftrag abgelehnt
<tr class="even">
<td>„Umstellen kostet uns eine halbe Stunde.”</td>
<td>reihenfolgeabhängige Kosten</td>
<td>Umrüstkosten (B17), Rüstzeit als Kapazität (B26)</td>
<td><a href="anhang-glossar.md#gloss:umruestkosten" class="glossar-link">Umrüstkosten</a> (B17), <a href="anhang-glossar.md#gloss:ruestzeit" class="glossar-link">Rüstzeit</a> als Kapazität (B26)</td>
</tr>
<tr class="odd">
<td>„Was reinkommt, muss auch wieder raus.”</td>
<td>Erhaltung an jedem Knoten</td>
<td>Flusserhaltung (B22)</td>
<td><a href="anhang-glossar.md#gloss:flusserhaltung" class="glossar-link">Flusserhaltung</a> (B22)</td>
</tr>
<tr class="even">
<td>„Notfalls brechen wir die Regel.”</td>
@ -843,15 +843,15 @@ Lesart C (weich): loesbar - 66,000 EUR Deckungsbeitrag, 1 Stammauftrag abgelehnt
<tr class="odd">
<td>„Was brächte uns eine zusätzliche Stunde?”</td>
<td>die Frage nach dem Grenzwert einer Ressource</td>
<td>Schattenpreis (<a href="lp.html#kap-lp">Kapitel 5</a>, <a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a>)</td>
<td><a href="anhang-glossar.md#gloss:schattenpreis" class="glossar-link">Schattenpreis</a> (<a href="lp.html#kap-lp">Kapitel 5</a>, <a href="praxisfallen.html#sec:praxisfallen-attribution">Abschnitt 22.4</a>)</td>
</tr>
<tr class="even">
<td>„Mit 95 % Sicherheit muss es halten.”</td>
<td>eine Zusage auf eine <strong>Quote</strong>, nicht auf einen Mittelwert</td>
<td>Chance Constraint (<a href="unsicherheit.html#sec:unsicherheit-chance-constraints">Abschnitt 12.7</a>)</td>
<td><a href="anhang-glossar.md#gloss:chance-constraint" class="glossar-link">Chance Constraint</a> (<a href="unsicherheit.html#sec:unsicherheit-chance-constraints">Abschnitt 12.7</a>)</td>
</tr>
<tr class="odd">
<td>„Wir sichern uns gegen Schätzfehler ab.”</td>
<td>„Wir sichern uns gegen <a href="anhang-glossar.md#gloss:schaetzfehler" class="glossar-link">Schätzfehler</a> ab.”</td>
<td>gegen die ungünstigste Parameterlage planen</td>
<td>Worst-Case-Abzug (B21)</td>
</tr>
@ -927,15 +927,15 @@ Lesart C (weich): loesbar - 66,000 EUR Deckungsbeitrag, 1 Stammauftrag abgelehnt
<td>„Besser als das hier geht es höchstens um 2 % — und die liegen unter unserer Datenungenauigkeit.”</td>
</tr>
<tr class="odd">
<td>CVaR</td>
<td>„Wenn es schiefgeht, verlieren wir im Mittel so viel.” (Der VaR sagt nur, <strong>ob</strong> es schiefgeht.)</td>
<td><a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR</a></td>
<td>„Wenn es schiefgeht, verlieren wir im Mittel so viel.” (Der <a href="anhang-glossar.md#gloss:value-at-risk-var" class="glossar-link">VaR</a> sagt nur, <strong>ob</strong> es schiefgeht.)</td>
</tr>
<tr class="even">
<td>EVPI</td>
<td><a href="anhang-glossar.md#gloss:evpi-expected-value-of-perfect-information" class="glossar-link">EVPI</a></td>
<td>„Selbst eine perfekte Prognose wäre uns höchstens so viel wert.”</td>
</tr>
<tr class="odd">
<td>Relaxation</td>
<td><a href="anhang-glossar.md#gloss:relaxation" class="glossar-link">Relaxation</a></td>
<td>„Wir haben die Regel probeweise gelockert, um zu sehen, was sie kostet.”</td>
</tr>
<tr class="even">