Vorwort: Navigationszeile einzeilig, Linktexte statt Dateinamen; --check bewacht einzeilige Weiter-mit-Zeilen

This commit is contained in:
dschlueter 2026-09-09 20:42:39 +02:00
commit 0d76c1a89d
8 changed files with 50 additions and 16 deletions

View file

@ -1588,7 +1588,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
<p><strong>🎯 Merksatz</strong> Die eine Aussage, die vom Abschnitt hängen bleiben soll.</p> <p><strong>🎯 Merksatz</strong> Die eine Aussage, die vom Abschnitt hängen bleiben soll.</p>
</blockquote> </blockquote>
<blockquote> <blockquote>
<p><strong>📝 Übungsaufgaben</strong> Am Kapitelende, gestaffelt nach Schwierigkeit: ⭐ Verständnis (im Kopf oder in zwei Sätzen) · ⭐⭐ Handrechnung oder kleine Modelländerung · ⭐⭐⭐ Eigenständige Programmieraufgabe. <strong>Alle Lösungen</strong> stehen in <strong><code>90_Anhang_Loesungen.md</code></strong>.</p> <p><strong>📝 Übungsaufgaben</strong> Am Kapitelende, gestaffelt nach Schwierigkeit: ⭐ Verständnis (im Kopf oder in zwei Sätzen) · ⭐⭐ Handrechnung oder kleine Modelländerung · ⭐⭐⭐ Eigenständige Programmieraufgabe. <strong>Alle Lösungen</strong> stehen in <a href="#anhang-loesungen">Anhang A</a>.</p>
</blockquote> </blockquote>
<blockquote> <blockquote>
<p><strong>✅ Selbsttest</strong> Fünf Fragen mit Kurzantworten zur schnellen Selbstkontrolle.</p> <p><strong>✅ Selbsttest</strong> Fünf Fragen mit Kurzantworten zur schnellen Selbstkontrolle.</p>
@ -2078,8 +2078,6 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
<p>Zweitens: <strong>Lassen Sie jedes Programm laufen und verändern Sie danach eine Zahl.</strong> Was passiert mit dem Vertretungsplan, wenn eine Lehrkraft ausfällt? Was mit dem Portfolio, wenn die Obergrenze von 20 % auf 10 % sinkt? Diese Experimente kosten Sekunden und bauen genau die Intuition auf, die man später beim Modellieren braucht.</p> <p>Zweitens: <strong>Lassen Sie jedes Programm laufen und verändern Sie danach eine Zahl.</strong> Was passiert mit dem Vertretungsplan, wenn eine Lehrkraft ausfällt? Was mit dem Portfolio, wenn die Obergrenze von 20 % auf 10 % sinkt? Diese Experimente kosten Sekunden und bauen genau die Intuition auf, die man später beim Modellieren braucht.</p>
<p>Und drittens: <strong>Nehmen Sie die Übungen ernst.</strong> Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird.</p> <p>Und drittens: <strong>Nehmen Sie die Übungen ernst.</strong> Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird.</p>
<hr /> <hr />
<p><em>Weiter mit:</em> <strong><code>01_Notation_und_Abkuerzungen.md</code></strong> — oder direkt zu <strong><a href="#kap-einfuehrung">Kapitel 1</a></strong>, wenn Sie die Notation lieber nachschlagen, sobald sie auftaucht.</p>
<hr />
<h1 id="notation-und-abkürzungen">Notation und Abkürzungen</h1> <h1 id="notation-und-abkürzungen">Notation und Abkürzungen</h1>
<p>Dieses Kapitel ist zum Nachschlagen gedacht, nicht zum Durchlesen. Schlagen Sie hier nach, sobald Ihnen ein Symbol oder ein Kürzel begegnet, das Sie nicht sicher zuordnen können.</p> <p>Dieses Kapitel ist zum Nachschlagen gedacht, nicht zum Durchlesen. Schlagen Sie hier nach, sobald Ihnen ein Symbol oder ein Kürzel begegnet, das Sie nicht sicher zuordnen können.</p>
<hr /> <hr />

View file

@ -337,7 +337,7 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
<p><strong>🎯 Merksatz</strong> Die eine Aussage, die vom Abschnitt hängen bleiben soll.</p> <p><strong>🎯 Merksatz</strong> Die eine Aussage, die vom Abschnitt hängen bleiben soll.</p>
</blockquote> </blockquote>
<blockquote> <blockquote>
<p><strong>📝 Übungsaufgaben</strong> Am Kapitelende, gestaffelt nach Schwierigkeit: ⭐ Verständnis (im Kopf oder in zwei Sätzen) · ⭐⭐ Handrechnung oder kleine Modelländerung · ⭐⭐⭐ Eigenständige Programmieraufgabe. <strong>Alle Lösungen</strong> stehen in <a href="anhang-loesungen.html"><code>90_Anhang_Loesungen.md</code></a>.</p> <p><strong>📝 Übungsaufgaben</strong> Am Kapitelende, gestaffelt nach Schwierigkeit: ⭐ Verständnis (im Kopf oder in zwei Sätzen) · ⭐⭐ Handrechnung oder kleine Modelländerung · ⭐⭐⭐ Eigenständige Programmieraufgabe. <strong>Alle Lösungen</strong> stehen in <a href="anhang-loesungen.html#anhang-loesungen">Anhang A</a>.</p>
</blockquote> </blockquote>
<blockquote> <blockquote>
<p><strong>✅ Selbsttest</strong> Fünf Fragen mit Kurzantworten zur schnellen Selbstkontrolle.</p> <p><strong>✅ Selbsttest</strong> Fünf Fragen mit Kurzantworten zur schnellen Selbstkontrolle.</p>
@ -826,8 +826,6 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
<p>Die wirksamste Art, mit diesem Buch zu arbeiten, ist unbequem: <strong>Lesen Sie die Problemstellung, schließen Sie das Buch und versuchen Sie, das Modell selbst aufzuschreiben</strong> — Variablen, Zielfunktion, Nebenbedingungen. Vergleichen Sie erst dann. Die Abweichungen zwischen Ihrem Entwurf und dem Text sind genau die Stellen, an denen Sie etwas lernen. Wer stattdessen mitliest und nickt, hat am Ende des Kapitels das angenehme Gefühl, es verstanden zu haben — und steht beim eigenen Problem vor einem leeren Blatt.</p> <p>Die wirksamste Art, mit diesem Buch zu arbeiten, ist unbequem: <strong>Lesen Sie die Problemstellung, schließen Sie das Buch und versuchen Sie, das Modell selbst aufzuschreiben</strong> — Variablen, Zielfunktion, Nebenbedingungen. Vergleichen Sie erst dann. Die Abweichungen zwischen Ihrem Entwurf und dem Text sind genau die Stellen, an denen Sie etwas lernen. Wer stattdessen mitliest und nickt, hat am Ende des Kapitels das angenehme Gefühl, es verstanden zu haben — und steht beim eigenen Problem vor einem leeren Blatt.</p>
<p>Zweitens: <strong>Lassen Sie jedes Programm laufen und verändern Sie danach eine Zahl.</strong> Was passiert mit dem Vertretungsplan, wenn eine Lehrkraft ausfällt? Was mit dem Portfolio, wenn die Obergrenze von 20 % auf 10 % sinkt? Diese Experimente kosten Sekunden und bauen genau die Intuition auf, die man später beim Modellieren braucht.</p> <p>Zweitens: <strong>Lassen Sie jedes Programm laufen und verändern Sie danach eine Zahl.</strong> Was passiert mit dem Vertretungsplan, wenn eine Lehrkraft ausfällt? Was mit dem Portfolio, wenn die Obergrenze von 20 % auf 10 % sinkt? Diese Experimente kosten Sekunden und bauen genau die Intuition auf, die man später beim Modellieren braucht.</p>
<p>Und drittens: <strong>Nehmen Sie die Übungen ernst.</strong> Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird.</p> <p>Und drittens: <strong>Nehmen Sie die Übungen ernst.</strong> Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird.</p>
<hr />
<p><em>Weiter mit:</em> <a href="notation.html"><code>01_Notation_und_Abkuerzungen.md</code></a> — oder direkt zu <a href="einfuehrung.html">[Kapitel 1](einfuehrung.html#kap-einfuehrung)</a>, wenn Sie die Notation lieber nachschlagen, sobald sie auftaucht.</p>
</article> </article>

View file

@ -260,7 +260,7 @@ Jedes Kapitel folgt derselben Struktur. Wenn Sie wissen, wie die Bausteine funkt
> **🎯 Merksatz** Die eine Aussage, die vom Abschnitt hängen bleiben soll. > **🎯 Merksatz** Die eine Aussage, die vom Abschnitt hängen bleiben soll.
> **📝 Übungsaufgaben** Am Kapitelende, gestaffelt nach Schwierigkeit: ⭐ Verständnis (im Kopf oder in zwei Sätzen) · ⭐⭐ Handrechnung oder kleine Modelländerung · ⭐⭐⭐ Eigenständige Programmieraufgabe. **Alle Lösungen** stehen in **`90_Anhang_Loesungen.md`**. > **📝 Übungsaufgaben** Am Kapitelende, gestaffelt nach Schwierigkeit: ⭐ Verständnis (im Kopf oder in zwei Sätzen) · ⭐⭐ Handrechnung oder kleine Modelländerung · ⭐⭐⭐ Eigenständige Programmieraufgabe. **Alle Lösungen** stehen in [Anhang A](#anhang-loesungen).
> **✅ Selbsttest** Fünf Fragen mit Kurzantworten zur schnellen Selbstkontrolle. > **✅ Selbsttest** Fünf Fragen mit Kurzantworten zur schnellen Selbstkontrolle.
@ -469,10 +469,6 @@ Zweitens: **Lassen Sie jedes Programm laufen und verändern Sie danach eine Zahl
Und drittens: **Nehmen Sie die Übungen ernst.** Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird. Und drittens: **Nehmen Sie die Übungen ernst.** Sie sind nicht Beiwerk, sondern der Ort, an dem aus Kenntnis Können wird.
---
*Weiter mit:* **`01_Notation_und_Abkuerzungen.md`** — oder direkt zu **[Kapitel 1](#kap-einfuehrung)**, wenn Sie die Notation lieber nachschlagen, sobald sie auftaucht.
--- ---

View file

@ -318,7 +318,7 @@ können Sie gezielt springen.
> ⭐ Verständnis (im Kopf oder in zwei Sätzen) · > ⭐ Verständnis (im Kopf oder in zwei Sätzen) ·
> ⭐⭐ Handrechnung oder kleine Modelländerung · > ⭐⭐ Handrechnung oder kleine Modelländerung ·
> ⭐⭐⭐ Eigenständige Programmieraufgabe. > ⭐⭐⭐ Eigenständige Programmieraufgabe.
> **Alle Lösungen** stehen in [`90_Anhang_Loesungen.md`](90_Anhang_Loesungen.md). > **Alle Lösungen** stehen in {ref:anhang:loesungen}.
> **✅ Selbsttest** > **✅ Selbsttest**
> Fünf Fragen mit Kurzantworten zur schnellen Selbstkontrolle. > Fünf Fragen mit Kurzantworten zur schnellen Selbstkontrolle.
@ -644,6 +644,4 @@ dem aus Kenntnis Können wird.
--- ---
*Weiter mit:* [`01_Notation_und_Abkuerzungen.md`](01_Notation_und_Abkuerzungen.md) — *Weiter mit:* [dem Verzeichnis Notation und Abkürzungen](01_Notation_und_Abkuerzungen.md) — oder direkt zu [{ref:kap:einfuehrung}](10_Einfuehrung_OR.md), wenn Sie die Notation lieber nachschlagen, sobald sie auftaucht.
oder direkt zu [{ref:kap:einfuehrung}](10_Einfuehrung_OR.md), wenn Sie die Notation
lieber nachschlagen, sobald sie auftaucht.

View file

@ -395,6 +395,19 @@ def pruefe_dateien() -> list[str]:
f"folgt aber '{soll}' - die Lesekette ueberspringt eine Datei.") f"folgt aber '{soll}' - die Lesekette ueberspringt eine Datei.")
fehlend.append(name) fehlend.append(name)
# Die Navigationszeile muss in EINER Zeile bleiben: weiter_re und
# entferne_navigation() lesen nur bis zum Zeilenende. Ein umgebrochener
# Verweis bleibt sonst als Absatz in PDF und Website stehen - so geschah
# es im Vorwort (drei Zeilen, die Zeile leckte ins gedruckte Buch).
for name in DATEIEN:
with open(os.path.join(HIER, name), encoding="utf-8") as f:
for nr, zeile in enumerate(f, 1):
if zeile.startswith("*Weiter mit:") and \
not re.search(r"\]\(\S+?\.md\)", zeile):
print(f"FEHLER: {name}:{nr} - '*Weiter mit:' ist umgebrochen; "
f"das Linkziel (.md) muss in derselben Zeile stehen.")
fehlend.append(name)
# Marken fuer interaktive Figuren: Zeigt eine ins Leere, verschwindet sie # Marken fuer interaktive Figuren: Zeigt eine ins Leere, verschwindet sie
# auf der Website stillschweigend - im PDF steht dann ein Verweis auf eine # auf der Website stillschweigend - im PDF steht dann ein Verweis auf eine
# Figur, die es nicht gibt. # Figur, die es nicht gibt.
@ -548,8 +561,15 @@ def entferne_navigation(text: str) -> str:
""" """
Entfernt die 'Weiter mit:'-Navigationszeilen am Dateiende - im Entfernt die 'Weiter mit:'-Navigationszeilen am Dateiende - im
Gesamtdokument sind sie ueberfluessig und die Links zeigen ins Leere. Gesamtdokument sind sie ueberfluessig und die Links zeigen ins Leere.
Ein umgebrochener Navigationsabsatz (Fortsetzungszeilen bis zur naechsten
Leerzeile) wird mitgenommen. Ohne diese Toleranz blieb eine dreizeilige
"Weiter mit"-Zeile im PDF stehen und renderte auf der Website den
geschachtelten {ref:}-Link als Rohtext - passiert im Vorwort.
""" """
text = re.sub(r"\n---\n+\*(Weiter mit|Zurueck zum|Zurück zum)[^\n]*\n*$", "\n", text) text = re.sub(
r"\n---\n+\*(Weiter mit|Zurueck zum|Zurück zum)[^\n]*"
r"(?:\n(?!\n)[^\n]*)*\n*$", "\n", text)
return text.rstrip() + "\n" return text.rstrip() + "\n"

View file

@ -2631,6 +2631,30 @@ Der neue Lauf meldet **null fehlende Zeichen**; taucht die Warnung wieder auf, k
New Roman ein Zeichen, das der Filter noch nicht umschaltet. Symbola ist damit eingebettet, New Roman ein Zeichen, das der Filter noch nicht umschaltet. Symbola ist damit eingebettet,
der Buchumfang bleibt bei 792 Seiten; alle HTML-Seiten sind byteidentisch geblieben. der Buchumfang bleibt bei 792 Seiten; alle HTML-Seiten sind byteidentisch geblieben.
### „Weiter mit“ im Vorwort — ein Umbau, der die Navigationszeile ins Buch leckte ✅
Eine Überarbeitung des Vorworts (Zeilenumbrüche, Verweise) machte die „Weiter mit“-Zeile
dreizeilig. `entferne_navigation()` liest nur bis zum Zeilenende — die Zeile blieb stehen:
Im PDF stand sie als Absatz mit Dateinamen, auf der Vorwortseite zusätzlich mit dem
Rohlink `[Kapitel 1](einfuehrung.html#kap-einfuehrung)`. Ursache der Rohform: Im
Mehraseiten-Bau löst sich `{ref:}` zu einem **kompletten Markdown-Link** auf; steht es
innerhalb eines weiteren Links, rendert die Schachtelung als Rohtext. Im Gesamtdokument
funktioniert dieselbe Konstruktion scheinbar — dort täuscht sie.
Behoben und bewacht:
* Die Navigationszeile ist wieder einzeilig; die Linktexte nennen kein Dateinamen mehr
(„Anhang A“ über `{ref:anhang:loesungen}`, das Notationsverzeichnis über einen
sprechenden Text — es hat als Rahmenkapitel kein `{#kap:}`-Label).
* **Konvention dazu:** `{ref:}` gehört nie in einen Markdown-Link hinein — im Fließtext
als Text, in „Weiter mit“-Zeilen nur, weil diese entfernt werden.
* `entferne_navigation()` nimmt Fortsetzungszeilen bis zur nächsten Leerzeile mit;
`--check` bricht ab, wenn ein `*Weiter mit:` das Linkziel (.md) nicht in derselben
Zeile trägt.
Gegenprobe: PDF ohne „Weiter mit“-Absatz, Vorwortseite ohne Rohtext, 792 Seiten,
kein fehlendes Zeichen im LaTeX-Protokoll.
--- ---
## 8. Commit-Historie des V04-Strangs ## 8. Commit-Historie des V04-Strangs