# Diagramme und Mathe

> Chart.js-Charts, KaTeX-Formeln und Mermaid-Diagramme im Detail - Chart- und Diagrammtypen, Formelsatz und die selbst gehostete, bedarfsgesteuerte Einbindung.

_Quelle: https://theme.docs.tbsch.de/de/post/2026-02-09-diagramme-und-mathe/ · Stand: 2026-02-09_


*Chart.js* (Charts), *KaTeX* (Mathe) und *Mermaid* (Diagramme) sind **selbst
gehostet** und werden nur dann geladen, wenn der jeweilige Shortcode auf der
Seite vorkommt - kein unnötiges JavaScript auf Seiten ohne sie. Auf der
[Shortcodes-Seite](/de/post/2026-01-26-shortcodes/) sind sie kurz
vorgestellt; hier gehen wir in die Tiefe. Jedes Beispiel hat zwei Tabs:
**Beispiel** zeigt das Ergebnis, **Code** die Quelle dazu.

## Charts: das Grundprinzip

Der `chart`-Shortcode rendert ein Canvas mit
[*Chart.js*](https://www.chartjs.org/). Der Inhalt ist die **Konfiguration als
JSON** (`type` + `data`); ein optionales `title` setzt das Accessible-Label des
Canvas. Achsen-, Raster- und Textfarben sind an die Theme-Tokens gebunden und
**wechseln live** beim Umschalten des Dark Mode; Datenreihen ohne eigene Farbe
werden aus der Akzent-Palette der Seite gefüllt.

### Liniendiagramm

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-1-tab-0" aria-controls="tabs-1-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-1-tab-1" aria-controls="tabs-1-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-1-panel-0" aria-labelledby="tabs-1-tab-0" data-tab-index="0"><figure class="tb-chart" style="height:22rem">
  <canvas role="img" aria-label="Sitzungen pro Wochentag"></canvas>
  <script type="application/json">
{
  "type": "line",
  "data": {
    "labels": ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"],
    "datasets": [
      { "label": "Desktop", "data": [120, 132, 101, 134, 90, 60, 70], "tension": 0.35 },
      { "label": "Mobil",   "data": [220, 182, 191, 234, 210, 150, 160], "tension": 0.35 }
    ]
  }
}
</script>
</figure></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-1-panel-1" aria-labelledby="tabs-1-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;line&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;labels&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;Mo&#34;</span><span class="p">,</span> <span class="s2">&#34;Di&#34;</span><span class="p">,</span> <span class="s2">&#34;Mi&#34;</span><span class="p">,</span> <span class="s2">&#34;Do&#34;</span><span class="p">,</span> <span class="s2">&#34;Fr&#34;</span><span class="p">,</span> <span class="s2">&#34;Sa&#34;</span><span class="p">,</span> <span class="s2">&#34;So&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;datasets&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span> <span class="nt">&#34;label&#34;</span><span class="p">:</span> <span class="s2">&#34;Desktop&#34;</span><span class="p">,</span> <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">[</span><span class="mi">120</span><span class="p">,</span> <span class="mi">132</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">134</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">70</span><span class="p">],</span> <span class="nt">&#34;tension&#34;</span><span class="p">:</span> <span class="mf">0.35</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span> <span class="nt">&#34;label&#34;</span><span class="p">:</span> <span class="s2">&#34;Mobil&#34;</span><span class="p">,</span>   <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">[</span><span class="mi">220</span><span class="p">,</span> <span class="mi">182</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">234</span><span class="p">,</span> <span class="mi">210</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">160</span><span class="p">],</span> <span class="nt">&#34;tension&#34;</span><span class="p">:</span> <span class="mf">0.35</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></div></div>
</div>


### Balkendiagramm

Zwei Datenreihen werden als gruppierte Balken dargestellt; eine Legende kommt
automatisch dazu.

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-2-tab-0" aria-controls="tabs-2-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-2-tab-1" aria-controls="tabs-2-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-2-panel-0" aria-labelledby="tabs-2-tab-0" data-tab-index="0"><figure class="tb-chart" style="height:22rem">
  <canvas role="img" aria-label="Beiträge pro Quartal"></canvas>
  <script type="application/json">
{
  "type": "bar",
  "data": {
    "labels": ["Q1", "Q2", "Q3", "Q4"],
    "datasets": [
      { "label": "2025", "data": [42, 55, 48, 61] },
      { "label": "2026", "data": [51, 63, 59, 74] }
    ]
  }
}
</script>
</figure></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-2-panel-1" aria-labelledby="tabs-2-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;bar&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;labels&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;Q1&#34;</span><span class="p">,</span> <span class="s2">&#34;Q2&#34;</span><span class="p">,</span> <span class="s2">&#34;Q3&#34;</span><span class="p">,</span> <span class="s2">&#34;Q4&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;datasets&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span> <span class="nt">&#34;label&#34;</span><span class="p">:</span> <span class="s2">&#34;2025&#34;</span><span class="p">,</span> <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">[</span><span class="mi">42</span><span class="p">,</span> <span class="mi">55</span><span class="p">,</span> <span class="mi">48</span><span class="p">,</span> <span class="mi">61</span><span class="p">]</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span> <span class="nt">&#34;label&#34;</span><span class="p">:</span> <span class="s2">&#34;2026&#34;</span><span class="p">,</span> <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">[</span><span class="mi">51</span><span class="p">,</span> <span class="mi">63</span><span class="p">,</span> <span class="mi">59</span><span class="p">,</span> <span class="mi">74</span><span class="p">]</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></div></div>
</div>


### Ringdiagramm

Für eine einzelne Reihe von Anteilen gibst du der Datenreihe ein explizites
`backgroundColor`-Array, damit jedes Segment eine eigene Farbe bekommt.

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-3-tab-0" aria-controls="tabs-3-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-3-tab-1" aria-controls="tabs-3-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-3-panel-0" aria-labelledby="tabs-3-tab-0" data-tab-index="0"><figure class="tb-chart" style="height:20rem">
  <canvas role="img" aria-label="Zugriffsquellen"></canvas>
  <script type="application/json">
{
  "type": "doughnut",
  "data": {
    "labels": ["Organisch", "Direkt", "Social", "Verweise"],
    "datasets": [
      { "data": [58, 22, 12, 8], "backgroundColor": ["#ff5d8f", "#f59e0b", "#8b5cf6", "#12a594"] }
    ]
  }
}
</script>
</figure></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-3-panel-1" aria-labelledby="tabs-3-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;doughnut&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;labels&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;Organisch&#34;</span><span class="p">,</span> <span class="s2">&#34;Direkt&#34;</span><span class="p">,</span> <span class="s2">&#34;Social&#34;</span><span class="p">,</span> <span class="s2">&#34;Verweise&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;datasets&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span> <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">[</span><span class="mi">58</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">8</span><span class="p">],</span> <span class="nt">&#34;backgroundColor&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;#ff5d8f&#34;</span><span class="p">,</span> <span class="s2">&#34;#f59e0b&#34;</span><span class="p">,</span> <span class="s2">&#34;#8b5cf6&#34;</span><span class="p">,</span> <span class="s2">&#34;#12a594&#34;</span><span class="p">]</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></div></div>
</div>


### Netzdiagramm

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-4-tab-0" aria-controls="tabs-4-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-4-tab-1" aria-controls="tabs-4-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-4-panel-0" aria-labelledby="tabs-4-tab-0" data-tab-index="0"><figure class="tb-chart" style="height:22rem">
  <canvas role="img" aria-label="Lighthouse: vorher vs. nachher"></canvas>
  <script type="application/json">
{
  "type": "radar",
  "data": {
    "labels": ["Performance", "Barrierefreiheit", "Best Practices", "SEO", "PWA"],
    "datasets": [
      { "label": "Vorher",  "data": [72, 88, 80, 90, 40] },
      { "label": "Nachher", "data": [98, 100, 95, 100, 80] }
    ]
  }
}
</script>
</figure></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-4-panel-1" aria-labelledby="tabs-4-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;radar&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;labels&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;Performance&#34;</span><span class="p">,</span> <span class="s2">&#34;Barrierefreiheit&#34;</span><span class="p">,</span> <span class="s2">&#34;Best Practices&#34;</span><span class="p">,</span> <span class="s2">&#34;SEO&#34;</span><span class="p">,</span> <span class="s2">&#34;PWA&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;datasets&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span> <span class="nt">&#34;label&#34;</span><span class="p">:</span> <span class="s2">&#34;Vorher&#34;</span><span class="p">,</span>  <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">[</span><span class="mi">72</span><span class="p">,</span> <span class="mi">88</span><span class="p">,</span> <span class="mi">80</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">40</span><span class="p">]</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span> <span class="nt">&#34;label&#34;</span><span class="p">:</span> <span class="s2">&#34;Nachher&#34;</span><span class="p">,</span> <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">[</span><span class="mi">98</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">95</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">80</span><span class="p">]</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></div></div>
</div>


## KaTeX: das Grundprinzip

Setz **einmal** den Marker-Shortcode `{{< katex >}}` auf die Seite - er lädt
den *KaTeX*-Renderer. Die eigentliche Mathematik schreibst du danach ganz
normal im Fließtext mit `$ ... $` (inline) bzw. `$$ ... $$` (abgesetzt); ein
Marker genügt für die ganze Seite.



<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-6-tab-0" aria-controls="tabs-6-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-6-tab-1" aria-controls="tabs-6-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-6-panel-0" aria-labelledby="tabs-6-tab-0" data-tab-index="0"><p>Inline: $E = mc^2$ steht mitten im Satz, ohne die Zeilenhöhe zu sprengen.
Abgesetzt landet die Formel zentriert in eigener Zeile:</p>
$$
\int_{-\infty}^{\infty} e^{-x^2}\,dx = \sqrt{\pi}
$$</div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-6-panel-1" aria-labelledby="tabs-6-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-latex" data-lang="latex"><span class="line"><span class="cl">Inline: <span class="s">$</span><span class="nb">E </span><span class="o">=</span><span class="nb"> mc^</span><span class="m">2</span><span class="s">$</span> steht mitten im Satz.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="sb">$$</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\int</span><span class="nb">_{</span><span class="o">-</span><span class="nv">\infty</span><span class="nb">}^{</span><span class="nv">\infty</span><span class="nb">} e^{</span><span class="o">-</span><span class="nb">x^</span><span class="m">2</span><span class="nb">}</span><span class="nv">\,</span><span class="nb">dx </span><span class="o">=</span><span class="nb"> </span><span class="nv">\sqrt</span><span class="nb">{</span><span class="nv">\pi</span><span class="nb">}
</span></span></span><span class="line"><span class="cl"><span class="s">$$</span>
</span></span></code></pre></div></div></div>
</div>


### Brüche, Wurzeln, Potenzen und Indizes

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-7-tab-0" aria-controls="tabs-7-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-7-tab-1" aria-controls="tabs-7-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-7-panel-0" aria-labelledby="tabs-7-tab-0" data-tab-index="0">$$
\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
\qquad
\sqrt[3]{x}
\qquad
a_{i,j}^{2}
$$</div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-7-panel-1" aria-labelledby="tabs-7-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-latex" data-lang="latex"><span class="line"><span class="cl"><span class="sb">$$</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\frac</span><span class="nb">{</span><span class="o">-</span><span class="nb">b </span><span class="nv">\pm</span><span class="nb"> </span><span class="nv">\sqrt</span><span class="nb">{b^</span><span class="m">2</span><span class="nb"> </span><span class="o">-</span><span class="nb"> </span><span class="m">4</span><span class="nb">ac}}{</span><span class="m">2</span><span class="nb">a}
</span></span></span><span class="line"><span class="cl"><span class="nv">\qquad</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\sqrt</span><span class="o">[</span><span class="m">3</span><span class="o">]</span><span class="nb">{x}
</span></span></span><span class="line"><span class="cl"><span class="nv">\qquad</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nb">a_{i,j}^{</span><span class="m">2</span><span class="nb">}
</span></span></span><span class="line"><span class="cl"><span class="s">$$</span>
</span></span></code></pre></div></div></div>
</div>


### Summen, Produkte, Grenzwerte

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-8-tab-0" aria-controls="tabs-8-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-8-tab-1" aria-controls="tabs-8-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-8-panel-0" aria-labelledby="tabs-8-tab-0" data-tab-index="0">$$
\sum_{k=1}^{n} k = \frac{n(n+1)}{2}
\qquad
\prod_{i=1}^{n} i = n!
\qquad
\lim_{x \to 0} \frac{\sin x}{x} = 1
$$</div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-8-panel-1" aria-labelledby="tabs-8-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-latex" data-lang="latex"><span class="line"><span class="cl"><span class="sb">$$</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\sum</span><span class="nb">_{k</span><span class="o">=</span><span class="m">1</span><span class="nb">}^{n} k </span><span class="o">=</span><span class="nb"> </span><span class="nv">\frac</span><span class="nb">{n</span><span class="o">(</span><span class="nb">n</span><span class="o">+</span><span class="m">1</span><span class="o">)</span><span class="nb">}{</span><span class="m">2</span><span class="nb">}
</span></span></span><span class="line"><span class="cl"><span class="nv">\qquad</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\prod</span><span class="nb">_{i</span><span class="o">=</span><span class="m">1</span><span class="nb">}^{n} i </span><span class="o">=</span><span class="nb"> n</span><span class="o">!</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\qquad</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\lim</span><span class="nb">_{x </span><span class="nv">\to</span><span class="nb"> </span><span class="m">0</span><span class="nb">} </span><span class="nv">\frac</span><span class="nb">{</span><span class="nv">\sin</span><span class="nb"> x}{x} </span><span class="o">=</span><span class="nb"> </span><span class="m">1</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="s">$$</span>
</span></span></code></pre></div></div></div>
</div>


### Griechische Buchstaben und Operatoren

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-9-tab-0" aria-controls="tabs-9-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-9-tab-1" aria-controls="tabs-9-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-9-panel-0" aria-labelledby="tabs-9-tab-0" data-tab-index="0">$$
\alpha,\ \beta,\ \gamma,\ \Delta,\ \Omega \qquad
\nabla \cdot \vec{E} = \frac{\rho}{\varepsilon_0} \qquad
x \in \mathbb{R},\ A \subseteq B
$$</div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-9-panel-1" aria-labelledby="tabs-9-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-latex" data-lang="latex"><span class="line"><span class="cl"><span class="sb">$$</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\alpha</span><span class="nb">,</span><span class="nv">\ \beta</span><span class="nb">,</span><span class="nv">\ \gamma</span><span class="nb">,</span><span class="nv">\ \Delta</span><span class="nb">,</span><span class="nv">\ \Omega</span><span class="nb"> </span><span class="nv">\qquad</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\nabla</span><span class="nb"> </span><span class="nv">\cdot</span><span class="nb"> </span><span class="nv">\vec</span><span class="nb">{E} </span><span class="o">=</span><span class="nb"> </span><span class="nv">\frac</span><span class="nb">{</span><span class="nv">\rho</span><span class="nb">}{</span><span class="nv">\varepsilon</span><span class="nb">_</span><span class="m">0</span><span class="nb">} </span><span class="nv">\qquad</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nb">x </span><span class="nv">\in</span><span class="nb"> </span><span class="nv">\mathbb</span><span class="nb">{R},</span><span class="nv">\ </span><span class="nb">A </span><span class="nv">\subseteq</span><span class="nb"> B
</span></span></span><span class="line"><span class="cl"><span class="s">$$</span>
</span></span></code></pre></div></div></div>
</div>


### Matrizen

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-10-tab-0" aria-controls="tabs-10-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-10-tab-1" aria-controls="tabs-10-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-10-panel-0" aria-labelledby="tabs-10-tab-0" data-tab-index="0">$$
\begin{pmatrix} a & b \\ c & d \end{pmatrix}
\begin{pmatrix} x \\ y \end{pmatrix} =
\begin{pmatrix} ax + by \\ cx + dy \end{pmatrix}
$$</div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-10-panel-1" aria-labelledby="tabs-10-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-latex" data-lang="latex"><span class="line"><span class="cl"><span class="sb">$$</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\begin</span><span class="nb">{pmatrix} a &amp; b </span><span class="nv">\\</span><span class="nb"> c &amp; d </span><span class="nv">\end</span><span class="nb">{pmatrix}
</span></span></span><span class="line"><span class="cl"><span class="nv">\begin</span><span class="nb">{pmatrix} x </span><span class="nv">\\</span><span class="nb"> y </span><span class="nv">\end</span><span class="nb">{pmatrix} </span><span class="o">=</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\begin</span><span class="nb">{pmatrix} ax </span><span class="o">+</span><span class="nb"> by </span><span class="nv">\\</span><span class="nb"> cx </span><span class="o">+</span><span class="nb"> dy </span><span class="nv">\end</span><span class="nb">{pmatrix}
</span></span></span><span class="line"><span class="cl"><span class="s">$$</span>
</span></span></code></pre></div></div></div>
</div>


### Mehrzeilig ausgerichtet und Fallunterscheidungen

Mit `aligned` richtest du an `&` aus, mit `cases` setzt du Fallunterscheidungen:

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-11-tab-0" aria-controls="tabs-11-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-11-tab-1" aria-controls="tabs-11-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-11-panel-0" aria-labelledby="tabs-11-tab-0" data-tab-index="0">$$
\begin{aligned}
  f(x) &= (x+1)^2 \\
       &= x^2 + 2x + 1
\end{aligned}
\qquad
|x| =
\begin{cases}
  x,  & \text{falls } x \ge 0 \\
  -x, & \text{sonst}
\end{cases}
$$</div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-11-panel-1" aria-labelledby="tabs-11-tab-1" data-tab-index="1"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-latex" data-lang="latex"><span class="line"><span class="cl"><span class="sb">$$</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\begin</span><span class="nb">{aligned}
</span></span></span><span class="line"><span class="cl"><span class="nb">  f</span><span class="o">(</span><span class="nb">x</span><span class="o">)</span><span class="nb"> &amp;</span><span class="o">=</span><span class="nb"> </span><span class="o">(</span><span class="nb">x</span><span class="o">+</span><span class="m">1</span><span class="o">)</span><span class="nb">^</span><span class="m">2</span><span class="nb"> </span><span class="nv">\\</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nb">       &amp;</span><span class="o">=</span><span class="nb"> x^</span><span class="m">2</span><span class="nb"> </span><span class="o">+</span><span class="nb"> </span><span class="m">2</span><span class="nb">x </span><span class="o">+</span><span class="nb"> </span><span class="m">1</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\end</span><span class="nb">{aligned}
</span></span></span><span class="line"><span class="cl"><span class="nv">\qquad</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nb">|x| </span><span class="o">=</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nv">\begin</span><span class="nb">{cases}
</span></span></span><span class="line"><span class="cl"><span class="nb">  x,  &amp; </span><span class="nv">\text</span><span class="nb">{falls } x </span><span class="nv">\ge</span><span class="nb"> </span><span class="m">0</span><span class="nb"> </span><span class="nv">\\</span><span class="nb">
</span></span></span><span class="line"><span class="cl"><span class="nb">  </span><span class="o">-</span><span class="nb">x, &amp; </span><span class="nv">\text</span><span class="nb">{sonst}
</span></span></span><span class="line"><span class="cl"><span class="nv">\end</span><span class="nb">{cases}
</span></span></span><span class="line"><span class="cl"><span class="s">$$</span>
</span></span></code></pre></div></div></div>
</div>


## Mermaid: das Grundprinzip

Du beschreibst das Diagramm als **Text** zwischen `{{< mermaid >}}` und
`{{< /mermaid >}}` - Mermaid rendert daraus im Browser ein SVG. Die erste
Zeile bestimmt den Diagrammtyp (`graph`/`flowchart`, `sequenceDiagram`,
`classDiagram`, …).

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-12-tab-0" aria-controls="tabs-12-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-12-tab-1" aria-controls="tabs-12-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-12-panel-0" aria-labelledby="tabs-12-tab-0" data-tab-index="0"><pre class="mermaid">
graph LR
  A[Markdown] --&gt; B{Render-Hook}
  B --&gt; C[WebP]
  B --&gt; D[Lightbox]
</pre></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-12-panel-1" aria-labelledby="tabs-12-tab-1" data-tab-index="1"><pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">graph LR
  A[Markdown] --&gt; B{Render-Hook}
  B --&gt; C[WebP]
  B --&gt; D[Lightbox]
</code></pre></div></div>
</div>


### Flussrichtung und Knotenformen

`graph`/`flowchart` kennt die Richtungen `TD` (oben→unten), `LR`, `RL` und `BT`.
Die Klammern um den Knotentext bestimmen die Form: `[eckig]`, `(rund)`,
`([Stadion])`, `{Raute}`, `((Kreis))`.

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-13-tab-0" aria-controls="tabs-13-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-13-tab-1" aria-controls="tabs-13-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-13-panel-0" aria-labelledby="tabs-13-tab-0" data-tab-index="0"><pre class="mermaid">
flowchart TD
  Start([Start]) --&gt; Frage{Alles grün?}
  Frage --&gt;|ja| Deploy[Deploy]
  Frage --&gt;|nein| Fix(Fehler beheben)
  Fix --&gt; Frage
  Deploy --&gt; Ende((Fertig))
</pre></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-13-panel-1" aria-labelledby="tabs-13-tab-1" data-tab-index="1"><pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">flowchart TD
  Start([Start]) --&gt; Frage{Alles grün?}
  Frage --&gt;|ja| Deploy[Deploy]
  Frage --&gt;|nein| Fix(Fehler beheben)
  Fix --&gt; Frage
  Deploy --&gt; Ende((Fertig))
</code></pre></div></div>
</div>


### Sequenzdiagramm

Für Abläufe zwischen Beteiligten - mit Aktivierungsbalken und Notizen.

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-14-tab-0" aria-controls="tabs-14-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-14-tab-1" aria-controls="tabs-14-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-14-panel-0" aria-labelledby="tabs-14-tab-0" data-tab-index="0"><pre class="mermaid">
sequenceDiagram
  participant B as Besucher
  participant S as Server
  B-&gt;&gt;S: GET /post/...
  activate S
  S--&gt;&gt;B: HTML (vorgerendert)
  deactivate S
  Note over B: Dark Mode anwenden (kein Flash)
</pre></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-14-panel-1" aria-labelledby="tabs-14-tab-1" data-tab-index="1"><pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">sequenceDiagram
  participant B as Besucher
  participant S as Server
  B-&gt;&gt;S: GET /post/...
  activate S
  S--&gt;&gt;B: HTML (vorgerendert)
  deactivate S
  Note over B: Dark Mode anwenden (kein Flash)
</code></pre></div></div>
</div>


### Klassendiagramm

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-15-tab-0" aria-controls="tabs-15-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-15-tab-1" aria-controls="tabs-15-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-15-panel-0" aria-labelledby="tabs-15-tab-0" data-tab-index="0"><pre class="mermaid">
classDiagram
  class Beitrag {
    +string Titel
    +Date Datum
    +render() string
  }
  class Serie {
    +string Name
  }
  Serie &#34;1&#34; o-- &#34;*&#34; Beitrag : enthält
</pre></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-15-panel-1" aria-labelledby="tabs-15-tab-1" data-tab-index="1"><pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">classDiagram
  class Beitrag {
    +string Titel
    +Date Datum
    +render() string
  }
  class Serie {
    +string Name
  }
  Serie &#34;1&#34; o-- &#34;*&#34; Beitrag : enthält
</code></pre></div></div>
</div>


### Zustandsdiagramm

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-16-tab-0" aria-controls="tabs-16-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-16-tab-1" aria-controls="tabs-16-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-16-panel-0" aria-labelledby="tabs-16-tab-0" data-tab-index="0"><pre class="mermaid">
stateDiagram-v2
  [*] --&gt; Entwurf
  Entwurf --&gt; Review: einreichen
  Review --&gt; Entwurf: Änderungen
  Review --&gt; Veröffentlicht: freigeben
  Veröffentlicht --&gt; [*]
</pre></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-16-panel-1" aria-labelledby="tabs-16-tab-1" data-tab-index="1"><pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">stateDiagram-v2
  [*] --&gt; Entwurf
  Entwurf --&gt; Review: einreichen
  Review --&gt; Entwurf: Änderungen
  Review --&gt; Veröffentlicht: freigeben
  Veröffentlicht --&gt; [*]
</code></pre></div></div>
</div>


### Gantt-Diagramm

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-17-tab-0" aria-controls="tabs-17-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-17-tab-1" aria-controls="tabs-17-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-17-panel-0" aria-labelledby="tabs-17-tab-0" data-tab-index="0"><pre class="mermaid">
gantt
  title Projektfahrplan
  dateFormat YYYY-MM-DD
  section Planung
    Konzept        :done,    des1, 2026-01-01, 2026-01-07
    Entwurf        :active,  des2, 2026-01-08, 5d
  section Umsetzung
    Bau            :         des3, after des2, 10d
    Test &amp; Launch  :         des4, after des3, 4d
</pre></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-17-panel-1" aria-labelledby="tabs-17-tab-1" data-tab-index="1"><pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">gantt
  title Projektfahrplan
  dateFormat YYYY-MM-DD
  section Planung
    Konzept        :done,    des1, 2026-01-01, 2026-01-07
    Entwurf        :active,  des2, 2026-01-08, 5d
  section Umsetzung
    Bau            :         des3, after des2, 10d
    Test &amp; Launch  :         des4, after des3, 4d
</code></pre></div></div>
</div>


### Tortendiagramm

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-18-tab-0" aria-controls="tabs-18-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-18-tab-1" aria-controls="tabs-18-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-18-panel-0" aria-labelledby="tabs-18-tab-0" data-tab-index="0"><pre class="mermaid">
pie showData
  title Zeit pro Aufgabe
  &#34;Schreiben&#34; : 45
  &#34;Basteln&#34;   : 35
  &#34;Aufräumen&#34; : 20
</pre></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-18-panel-1" aria-labelledby="tabs-18-tab-1" data-tab-index="1"><pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">pie showData
  title Zeit pro Aufgabe
  &#34;Schreiben&#34; : 45
  &#34;Basteln&#34;   : 35
  &#34;Aufräumen&#34; : 20
</code></pre></div></div>
</div>


### ER-Diagramm

<div class="tb-tab__container" data-tb-component="tabs">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-19-tab-0" aria-controls="tabs-19-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        Beispiel
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-19-tab-1" aria-controls="tabs-19-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        Code
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-19-panel-0" aria-labelledby="tabs-19-tab-0" data-tab-index="0"><pre class="mermaid">
erDiagram
  KATEGORIE ||--o{ BEITRAG : hat
  BEITRAG   }o--o{ TAG     : verschlagwortet
</pre></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-19-panel-1" aria-labelledby="tabs-19-tab-1" data-tab-index="1"><pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">erDiagram
  KATEGORIE ||--o{ BEITRAG : hat
  BEITRAG   }o--o{ TAG     : verschlagwortet
</code></pre></div></div>
</div>


*Mermaid* übernimmt automatisch das helle bzw. dunkle Farbschema und
**re-rendert live**, wenn du den Dark Mode umschaltest - probier oben rechts
den Umschalter aus, während ein Diagramm sichtbar ist.

## Unter der Haube

Was beide Shortcodes im Hintergrund erledigen - ganz ohne Zutun:

- **Selbst gehostet, kein CDN.** Mermaid, KaTeX (inklusive Schriften) und
  Chart.js sind aus npm ins Theme vendort und werden von der eigenen Domain
  geladen - DSGVO-freundlich, keine Drittanbieter-Requests.
- **Nur bei Bedarf.** Die Bibliotheken landen ausschließlich auf Seiten, die
  den `mermaid`-, `katex`- bzw. `chart`-Shortcode nutzen (`.HasShortcode`).
  Seiten ohne Diagramme, Formeln oder Charts laden kein zusätzliches JavaScript.
- **CSP-freundlich.** Die Init-Skripte werden als reguläre `<script src>` mit
  Subresource-Integrity `defer` geladen, nicht inline - eine strenge Content
  Security Policy ohne `unsafe-inline` bleibt möglich.
- **Dark Mode live.** Ein `MutationObserver` auf `html.dark` rendert die
  Diagramme neu und thematisiert die Charts um, sobald das Farbschema wechselt
  (Mermaid und Chart.js thematisieren nur zur Render-Zeit).
- **Stabile Größen.** Mermaid misst Textboxen beim Rendern; das Init wartet auf
  `document.fonts.ready`, damit die Diagramme mit der geladenen Schrift
  vermessen werden und ihre Größe zwischen Reloads nicht springt.
- **Sicher.** Mermaid läuft mit `securityLevel: "strict"`. KaTeX rendert per
  Auto-Render nur die Prosa-Bereiche der Seite und lässt Code-Blöcke
  unangetastet - `$`-Zeichen in Beispielen bleiben also stehen.

