# Shortcodes im Überblick

> Akkordeon, Buttons, Card, Carousel, Galerie, GitHub, Icons, KaTeX, Lead, Mermaid, Chart, Specs und Tabs - die Shortcodes des Themes.

_Quelle: https://theme.docs.tbsch.de/de/post/2026-01-26-shortcodes/ · Stand: 2026-01-26_


Das Theme bringt eine Handvoll Shortcodes mit - hier sind sie, alphabetisch
sortiert. Diagramme (*Mermaid*) und Mathe (*KaTeX*) tauchen hier kompakt auf
und werden im Beitrag
[Diagramme und Mathe](/de/post/2026-02-09-diagramme-und-mathe/) ausführlich
gezeigt.

## Akkordeon

Aufklappbare Abschnitte auf Basis von nativem `<details>` - **ganz ohne
JavaScript**. Standardmäßig ist nur ein Eintrag gleichzeitig geöffnet; mit
`single="false"` dürfen mehrere offen sein. Mit `open="true"` startet ein
Eintrag aufgeklappt.

```markdown
{{< accordion >}}
{{< accordion-item label="Was ist ein Shortcode?" icon="puzzle" >}}
Ein wiederverwendbarer Baustein als **Markdown**.
{{< /accordion-item >}}
{{< accordion-item label="Brauche ich JavaScript?" open="true" >}}
Nein - es nutzt natives `<details>`/`<summary>`.
{{< /accordion-item >}}
{{< /accordion >}}
```

<div class="tb-accordion"><details class="tb-accordion__item" name="tb-acc-1">
      <summary class="tb-accordion__summary"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M4 7h3a1 1 0 0 0 1 -1v-1a2 2 0 0 1 4 0v1a1 1 0 0 0 1 1h3a1 1 0 0 1 1 1v3a1 1 0 0 0 1 1h1a2 2 0 0 1 0 4h-1a1 1 0 0 0 -1 1v3a1 1 0 0 1 -1 1h-3a1 1 0 0 1 -1 -1v-1a2 2 0 0 0 -4 0v1a1 1 0 0 1 -1 1h-3a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1h1a2 2 0 0 0 0 -4h-1a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1" />
</svg><span class="tb-accordion__label">Was ist ein Shortcode?</span>
        <span class="tb-accordion__chevron"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M6 9l6 6l6 -6" />
</svg></span>
      </summary>
      <div class="tb-accordion__body">Ein wiederverwendbarer Baustein, den du <strong>mitten im Markdown</strong> aufrufst.</div>
    </details><details class="tb-accordion__item" name="tb-acc-1" open>
      <summary class="tb-accordion__summary"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M13 3l0 7l6 0l-8 11l0 -7l-6 0l8 -11" />
</svg><span class="tb-accordion__label">Brauche ich dafür JavaScript?</span>
        <span class="tb-accordion__chevron"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M6 9l6 6l6 -6" />
</svg></span>
      </summary>
      <div class="tb-accordion__body">Nein - das Akkordeon nutzt natives <code>&lt;details&gt;</code>/<code>&lt;summary&gt;</code> und funktioniert
auch ohne aktiviertes JavaScript.</div>
    </details><details class="tb-accordion__item" name="tb-acc-1">
      <summary class="tb-accordion__summary"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M12 6l-8 4l8 4l8 -4l-8 -4" />
  <path d="M4 14l8 4l8 -4" />
</svg><span class="tb-accordion__label">Kann mehr als ein Eintrag offen sein?</span>
        <span class="tb-accordion__chevron"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M6 9l6 6l6 -6" />
</svg></span>
      </summary>
      <div class="tb-accordion__body">Standardmäßig nicht - setze <code>single=&quot;false&quot;</code>, um es zu erlauben.</div>
    </details></div>


## Amazon

Rendert ein Affiliate-Produkt als Karte. Du übergibst nur den Affiliate-Reflink;
Titel, Beschreibung, Bild und Preis kommen aus einem Build-Cache
(`data/products.yaml`), den `script/fetch-amazon-products.js` aus der Amazon
Creators API befüllt - der Site-Build selbst spricht Amazon nie an.
Das Produktbild lädt erst nach Zustimmung über den Consent-Manager *Klaro* von
Amazons CDN, und der Link trägt `rel="sponsored"` (was automatisch den
Werbehinweis einblendet). Der Preis wird nur angezeigt, solange die Cache-Daten
frisch sind (< 24 h) - gemäß Amazons Vorgaben.

```markdown
{{< amazon "https://amzlink.to/az0sqPpjSZX54" >}}
```

<div class="tb-amazon-card"><div class="tb-amazon-card__media" data-name="consent-gate-amazon">
        <a class="tb-amazon-card__media-link" href="https://amzlink.to/az0sqPpjSZX54" target="_blank" rel="sponsored noopener noreferrer" aria-label="Midea Portasplit Cool Mobile Klimaanlage nur Kühlung">
          <img class="tb-amazon-card__img" data-name="consent-gate-amazon"
            data-src="https://m.media-amazon.com/images/I/71ZEuMSExZL._AC_UF894,1000_QL80_.jpg" alt="Midea Portasplit Cool Mobile Klimaanlage nur Kühlung" loading="lazy" decoding="async" referrerpolicy="no-referrer">
        </a>
      </div>
      <div class="tb-amazon-card__body">
        <p class="tb-amazon-card__title">Midea Portasplit Cool Mobile Klimaanlage nur Kühlung</p>
        <div class="tb-amazon-card__foot">
          <a class="tb-btn tb-btn-primary tb-btn-sm tb-amazon-card__cta" href="https://amzlink.to/az0sqPpjSZX54" target="_blank" rel="sponsored noopener noreferrer">Auf Amazon ansehen<svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M4 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M15 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M17 17h-11v-14h-2" />
  <path d="M6 5l14 1l-1 7h-13" />
</svg></a>
        </div>
      </div>
    </div>

Funktioniert auch im Card-Grid - mehrere `amazon`-Shortcodes zwischen
`card-grid`-Tags legen und sie ordnen sich als gleich hohe Zellen an:

```markdown
{{< card-grid cols=2 >}}
{{< amazon "https://amzlink.to/az0sqPpjSZX54" >}}
{{< amazon "https://amzlink.to/az0demo1234" >}}
{{< /card-grid >}}
```

<div class="tb-card-grid tb-card-grid--fixed" style="--tb-grid-cols:2">
<div class="tb-amazon-card"><div class="tb-amazon-card__media" data-name="consent-gate-amazon">
        <a class="tb-amazon-card__media-link" href="https://amzlink.to/az0sqPpjSZX54" target="_blank" rel="sponsored noopener noreferrer" aria-label="Midea Portasplit Cool Mobile Klimaanlage nur Kühlung">
          <img class="tb-amazon-card__img" data-name="consent-gate-amazon"
            data-src="https://m.media-amazon.com/images/I/71ZEuMSExZL._AC_UF894,1000_QL80_.jpg" alt="Midea Portasplit Cool Mobile Klimaanlage nur Kühlung" loading="lazy" decoding="async" referrerpolicy="no-referrer">
        </a>
      </div>
      <div class="tb-amazon-card__body">
        <p class="tb-amazon-card__title">Midea Portasplit Cool Mobile Klimaanlage nur Kühlung</p>
        <div class="tb-amazon-card__foot">
          <a class="tb-btn tb-btn-primary tb-btn-sm tb-amazon-card__cta" href="https://amzlink.to/az0sqPpjSZX54" target="_blank" rel="sponsored noopener noreferrer">Auf Amazon ansehen<svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M4 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M15 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M17 17h-11v-14h-2" />
  <path d="M6 5l14 1l-1 7h-13" />
</svg></a>
        </div>
      </div>
    </div>
<div class="tb-amazon-card"><div class="tb-amazon-card__media" data-name="consent-gate-amazon">
        <a class="tb-amazon-card__media-link" href="https://amzlink.to/az0demo1234" target="_blank" rel="sponsored noopener noreferrer" aria-label="Raspberry Pi 5 (8 GB RAM)">
          <img class="tb-amazon-card__img" data-name="consent-gate-amazon"
            data-src="https://m.media-amazon.com/images/I/71bK6Ij2nBL._AC_SL1500_.jpg" alt="Raspberry Pi 5 (8 GB RAM)" loading="lazy" decoding="async" referrerpolicy="no-referrer">
        </a>
      </div>
      <div class="tb-amazon-card__body">
        <p class="tb-amazon-card__title">Raspberry Pi 5 (8 GB RAM)</p><p class="tb-amazon-card__desc">Quad-Core Cortex-A76 @ 2,4 GHz, PCIe 2.0, Dual-4K-HDMI — der Einplatinenrechner für dein nächstes Homelab-Projekt.</p>
        <div class="tb-amazon-card__foot">
          <a class="tb-btn tb-btn-primary tb-btn-sm tb-amazon-card__cta" href="https://amzlink.to/az0demo1234" target="_blank" rel="sponsored noopener noreferrer">Auf Amazon ansehen<svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M4 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M15 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M17 17h-11v-14h-2" />
  <path d="M6 5l14 1l-1 7h-13" />
</svg></a>
        </div>
      </div>
    </div>
</div>


## Buttons

Ein Button ist ein als Schaltfläche gestylter Link.

```markdown
{{< button href="https://gohugo.io" target="_blank" >}}Zur Hugo-Doku{{< /button >}}
{{< button href="https://example.com/produkt" sponsored="true" >}}Affiliate-Link{{< /button >}}
```

<a class="tb-btn tb-btn-primary tb-btn-sm"
  href="https://gohugo.io"
  target="_blank"
  rel="noopener noreferrer"
  >Zur Hugo-Doku</a>

<a class="tb-btn tb-btn-primary tb-btn-sm"
  href="https://example.com/produkt"
  target="_blank"
  rel="sponsored noopener noreferrer"
  >Affiliate-Link<svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M4 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M15 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M17 17h-11v-14h-2" />
  <path d="M6 5l14 1l-1 7h-13" />
</svg></a>


Mit `sponsored="true"` bekommt der Button ein Einkaufswagen-Symbol und
`rel="sponsored"` - dadurch wird oben auf der Seite **automatisch** der
Werbehinweis eingeblendet (scroll mal hoch). Statt `href` kannst du auch
`pageRef="posts/01-willkommen"` für interne Ziele angeben.

## Card

Bettet einen Beitrag, eine Kategorie, Serie oder Seite als Karte mitten in den
Text ein - im selben Look wie die Karten der Übersichtsseiten. Der Typ wird
automatisch erkannt; mit `type="article|category|series|page"` lässt er sich
überschreiben.

```markdown
{{< card "posts/01-willkommen" >}}
{{< card "series/beispiel-serie" >}}
```

<div class="tb-card-embed"><article class="tb-card tb-reveal h-entry">
  <a class="u-url" href="https://theme.docs.tbsch.de/de/post/2026-02-23-willkommen/" hidden>Willkommen beim tbsch-Theme</a><time class="dt-published" datetime="2026-02-23T00:00:00Z" hidden></time>
  <a class="tb-thumb-link" href="/de/post/2026-02-23-willkommen/" aria-label="Willkommen beim tbsch-Theme" tabindex="-1"ZgotmplZ><img class="tb-thumb u-photo" alt=""
      src="/img/hero-bg2_hu_df4c6bb8bb397046.webp"
      srcset="/img/hero-bg2_hu_a4848fa6a81d424d.webp 320w, /img/hero-bg2_hu_a6af3be557bd61f1.webp 560w, /img/hero-bg2_hu_df4c6bb8bb397046.webp 800w, /img/hero-bg2_hu_deaa8f89873fd34b.webp 1100w"
      sizes="(max-width:760px) 92vw, 380px"
      width="800" height="1734" loading="lazy" decoding="async"></a>
  <div class="tb-card-body"><h3><a class="p-name" href="/de/post/2026-02-23-willkommen/"ZgotmplZ>Willkommen beim tbsch-Theme</a></h3><a class="tb-cat tb-grad-text p-category" href="/de/categories/grundlagen/"ZgotmplZ>Grundlagen</a><p class="tb-summary p-summary">Ein Überblick über das tbsch-Theme: was es kann, wie diese Demo aufgebaut ist und wo du anfängst.</p><div class="tb-meta"><span class="tb-i tb-mono">23 Feb. 2026</span><span class="tb-i"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
  <path d="M12 7v5l3 3" />
</svg> 2 Min.</span></div>
  </div>
</article>
</div>
<div class="tb-card-embed"><article class="tb-series-card tb-reveal"><div class="tb-series-card__figframe"><img class="tb-series-card__fig" alt=""
      src="/img/hero-bg2_hu_8bf1d204d579e527.webp"
      srcset="/img/hero-bg2_hu_5f9ea8d6bdf83b3c.webp 360w, /img/hero-bg2_hu_8bf1d204d579e527.webp 600w, /img/hero-bg2_hu_df4c6bb8bb397046.webp 800w"
      sizes="(max-width:760px) 92vw, 420px"
      width="600" height="1300" loading="lazy" decoding="async"></div><div class="tb-series-card__body">
    <h3 class="tb-series-card__title"><a class="tb-series-card__link" href="/de/series/beispiel-serie/">Beispiel-Serie</a></h3>
    <div class="tb-series-card__count">3 Teile</div><p class="tb-series-card__desc">Eine dreiteilige Serie, die zeigt, wie das Theme zusammengehörige Beiträge verknüpft.</p><ul class="tb-series-card__parts"><li>
            <a href="/de/post/2025-12-01-beispiel-serie-teil-1-der-anfang/">Teil 1: Beispiel-Serie, Teil 1: Der Anfang</a>
          </li><li>
            <a href="/de/post/2025-12-08-beispiel-serie-teil-2-die-mitte/">Teil 2: Beispiel-Serie, Teil 2: Die Mitte</a>
          </li><li>
            <a href="/de/post/2025-12-15-beispiel-serie-teil-3-das-ende/">Teil 3: Beispiel-Serie, Teil 3: Das Ende</a>
          </li></ul></div>
</article>
</div>

## Card Grid

Mehrere Cards nebeneinander, im selben Grid-Look wie die Übersichtsseiten.
`cols` (optional, Standard `2`, maximal `4`) bestimmt die Spaltenzahl auf dem
Desktop; auf schmalen Viewports bricht das Grid auf eine Spalte um. In den
Inhalt gehören Card-Shortcodes.

```markdown
{{< card-grid >}}
{{< card "posts/01-willkommen" >}}
{{< card "series/beispiel-serie" >}}
{{< /card-grid >}}
```

<div class="tb-card-grid tb-card-grid--fixed" style="--tb-grid-cols:2">
<div class="tb-card-embed"><article class="tb-card tb-reveal h-entry">
  <a class="u-url" href="https://theme.docs.tbsch.de/de/post/2026-02-23-willkommen/" hidden>Willkommen beim tbsch-Theme</a><time class="dt-published" datetime="2026-02-23T00:00:00Z" hidden></time>
  <a class="tb-thumb-link" href="/de/post/2026-02-23-willkommen/" aria-label="Willkommen beim tbsch-Theme" tabindex="-1"ZgotmplZ><img class="tb-thumb u-photo" alt=""
      src="/img/hero-bg2_hu_df4c6bb8bb397046.webp"
      srcset="/img/hero-bg2_hu_a4848fa6a81d424d.webp 320w, /img/hero-bg2_hu_a6af3be557bd61f1.webp 560w, /img/hero-bg2_hu_df4c6bb8bb397046.webp 800w, /img/hero-bg2_hu_deaa8f89873fd34b.webp 1100w"
      sizes="(max-width:760px) 92vw, 380px"
      width="800" height="1734" loading="lazy" decoding="async"></a>
  <div class="tb-card-body"><h3><a class="p-name" href="/de/post/2026-02-23-willkommen/"ZgotmplZ>Willkommen beim tbsch-Theme</a></h3><a class="tb-cat tb-grad-text p-category" href="/de/categories/grundlagen/"ZgotmplZ>Grundlagen</a><p class="tb-summary p-summary">Ein Überblick über das tbsch-Theme: was es kann, wie diese Demo aufgebaut ist und wo du anfängst.</p><div class="tb-meta"><span class="tb-i tb-mono">23 Feb. 2026</span><span class="tb-i"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
  <path d="M12 7v5l3 3" />
</svg> 2 Min.</span></div>
  </div>
</article>
</div>
<div class="tb-card-embed"><article class="tb-series-card tb-reveal"><div class="tb-series-card__figframe"><img class="tb-series-card__fig" alt=""
      src="/img/hero-bg2_hu_8bf1d204d579e527.webp"
      srcset="/img/hero-bg2_hu_5f9ea8d6bdf83b3c.webp 360w, /img/hero-bg2_hu_8bf1d204d579e527.webp 600w, /img/hero-bg2_hu_df4c6bb8bb397046.webp 800w"
      sizes="(max-width:760px) 92vw, 420px"
      width="600" height="1300" loading="lazy" decoding="async"></div><div class="tb-series-card__body">
    <h3 class="tb-series-card__title"><a class="tb-series-card__link" href="/de/series/beispiel-serie/">Beispiel-Serie</a></h3>
    <div class="tb-series-card__count">3 Teile</div><p class="tb-series-card__desc">Eine dreiteilige Serie, die zeigt, wie das Theme zusammengehörige Beiträge verknüpft.</p><ul class="tb-series-card__parts"><li>
            <a href="/de/post/2025-12-01-beispiel-serie-teil-1-der-anfang/">Teil 1: Beispiel-Serie, Teil 1: Der Anfang</a>
          </li><li>
            <a href="/de/post/2025-12-08-beispiel-serie-teil-2-die-mitte/">Teil 2: Beispiel-Serie, Teil 2: Die Mitte</a>
          </li><li>
            <a href="/de/post/2025-12-15-beispiel-serie-teil-3-das-ende/">Teil 3: Beispiel-Serie, Teil 3: Das Ende</a>
          </li></ul></div>
</article>
</div>
</div>


Mit `cols=3`:

```markdown
{{< card-grid cols=3 >}}
{{< card "posts/02-markdown-grundlagen" >}}
{{< card "posts/03-admonitions" >}}
{{< card "posts/05-bilder-und-galerien" >}}
{{< /card-grid >}}
```

<div class="tb-card-grid tb-card-grid--fixed" style="--tb-grid-cols:3">
<div class="tb-card-embed"><article class="tb-card tb-reveal h-entry">
  <a class="u-url" href="https://theme.docs.tbsch.de/de/post/2026-01-12-markdown-grundlagen-typografie/" hidden>Markdown-Grundlagen &amp; Typografie</a><time class="dt-published" datetime="2026-01-12T00:00:00Z" hidden></time>
  <a class="tb-thumb-link" href="/de/post/2026-01-12-markdown-grundlagen-typografie/" aria-label="Markdown-Grundlagen &amp; Typografie" tabindex="-1"ZgotmplZ><img class="tb-thumb u-photo" alt=""
      src="/img/hero-bg2_hu_df4c6bb8bb397046.webp"
      srcset="/img/hero-bg2_hu_a4848fa6a81d424d.webp 320w, /img/hero-bg2_hu_a6af3be557bd61f1.webp 560w, /img/hero-bg2_hu_df4c6bb8bb397046.webp 800w, /img/hero-bg2_hu_deaa8f89873fd34b.webp 1100w"
      sizes="(max-width:760px) 92vw, 380px"
      width="800" height="1734" loading="lazy" decoding="async"></a>
  <div class="tb-card-body"><h3><a class="p-name" href="/de/post/2026-01-12-markdown-grundlagen-typografie/"ZgotmplZ>Markdown-Grundlagen &amp; Typografie</a></h3><a class="tb-cat tb-grad-text p-category" href="/de/categories/grundlagen/"ZgotmplZ>Grundlagen</a><p class="tb-summary p-summary">Überschriften, Listen, Tabellen, Code, Fußnoten, Zitate - wie das Theme Standard-Markdown rendert.</p><div class="tb-meta"><span class="tb-i tb-mono">12 Jan. 2026</span><span class="tb-i"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
  <path d="M12 7v5l3 3" />
</svg> 4 Min.</span></div>
  </div>
</article>
</div>
<div class="tb-card-embed"><article class="tb-card tb-reveal h-entry">
  <a class="u-url" href="https://theme.docs.tbsch.de/de/post/2026-01-19-admonitions-hinweisboxen/" hidden>Admonitions - Hinweisboxen</a><time class="dt-published" datetime="2026-01-19T00:00:00Z" hidden></time>
  <a class="tb-thumb-link" href="/de/post/2026-01-19-admonitions-hinweisboxen/" aria-label="Admonitions - Hinweisboxen" tabindex="-1"ZgotmplZ><img class="tb-thumb u-photo" alt=""
      src="/img/hero-bg2_hu_df4c6bb8bb397046.webp"
      srcset="/img/hero-bg2_hu_a4848fa6a81d424d.webp 320w, /img/hero-bg2_hu_a6af3be557bd61f1.webp 560w, /img/hero-bg2_hu_df4c6bb8bb397046.webp 800w, /img/hero-bg2_hu_deaa8f89873fd34b.webp 1100w"
      sizes="(max-width:760px) 92vw, 380px"
      width="800" height="1734" loading="lazy" decoding="async"></a>
  <div class="tb-card-body"><h3><a class="p-name" href="/de/post/2026-01-19-admonitions-hinweisboxen/"ZgotmplZ>Admonitions - Hinweisboxen</a></h3><a class="tb-cat tb-grad-text p-category" href="/de/categories/funktionen/"ZgotmplZ>Funktionen</a><p class="tb-summary p-summary">Alle farbigen Hinweisboxen im GitHub-Alert-Stil: note, tip, warning, danger und mehr - auch aufklappbar.</p><div class="tb-meta"><span class="tb-i tb-mono">19 Jan. 2026</span><span class="tb-i"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
  <path d="M12 7v5l3 3" />
</svg> 2 Min.</span></div>
  </div>
</article>
</div>
<div class="tb-card-embed"><article class="tb-card tb-reveal h-entry">
  <a class="u-url" href="https://theme.docs.tbsch.de/de/post/2026-02-02-bilder-und-galerien/" hidden>Bilder und Galerien</a><time class="dt-published" datetime="2026-02-02T00:00:00Z" hidden></time>
  <a class="tb-thumb-link" href="/de/post/2026-02-02-bilder-und-galerien/" aria-label="Bilder und Galerien" tabindex="-1"ZgotmplZ><img class="tb-thumb u-photo" alt=""
      src="/post/2026-02-02-images-and-galleries/feature_hu_da6eaaa7c7a4e453.webp"
      srcset="/post/2026-02-02-images-and-galleries/feature_hu_b4aec50709f12d0c.webp 320w, /post/2026-02-02-images-and-galleries/feature_hu_bf2297c1b35a8ade.webp 560w, /post/2026-02-02-images-and-galleries/feature_hu_da6eaaa7c7a4e453.webp 800w, /post/2026-02-02-images-and-galleries/feature_hu_c006bf10a50c417.webp 1100w"
      sizes="(max-width:760px) 92vw, 380px"
      width="800" height="800" loading="lazy" decoding="async"></a>
  <div class="tb-card-body"><h3><a class="p-name" href="/de/post/2026-02-02-bilder-und-galerien/"ZgotmplZ>Bilder und Galerien</a></h3><a class="tb-cat tb-grad-text p-category" href="/de/categories/funktionen/"ZgotmplZ>Funktionen</a><p class="tb-summary p-summary">Der Bild-Render-Hook (WebP, responsiv, zoombar), Bildgrößen, Bildunterschriften und die Galerie-Shortcodes.</p><div class="tb-meta"><span class="tb-i tb-mono">2 Feb. 2026</span><span class="tb-i"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
  <path d="M12 7v5l3 3" />
</svg> 3 Min.</span></div>
  </div>
</article>
</div>
</div>


## Carousel

Ein horizontal wischbares Karussell. Jede Folie kann ein **Bild** oder
beliebigen **Markdown** enthalten. Ohne JavaScript bleibt es ein per
Swipe/Scroll bedienbarer Streifen; mit JS kommen Pfeil-Buttons, Punkte und
Tastatursteuerung (Pfeiltasten) dazu.

Am Ende geht es standardmäßig wieder beim ersten Slide los; `loop="false"`
schaltet das ab (die Pfeile stoppen dann an den Enden). Mit `auto=5` blättert
das Karussell alle 5 Sekunden automatisch weiter - nur bei aktivem `loop`,
pausiert bei Hover/Fokus (der Timer läuft danach dort weiter, wo er stand)
und respektiert reduzierte Bewegung. Die Pill des aktiven Slides füllt sich
mit dem Timer. `ratio` bestimmt das Seitenverhältnis
des Rahmens (Standard `"16 / 9"`, z. B. `ratio="21 / 9"` oder `ratio="4 / 3"`).

```markdown
{{< carousel >}}
{{< carousel-slide >}}![Alpe](carousel-1.webp){{< /carousel-slide >}}
{{< carousel-slide >}}
### Auch Markdown
Jede Folie nimmt **beliebigen** Inhalt - Überschriften, Listen, Code.
{{< /carousel-slide >}}
{{< /carousel >}}
```

<div class="tb-carousel" data-tb-component="carousel" data-loop="true" role="group" aria-roledescription="Karussell" style="--tb-car-ratio:16 / 9">
  <div class="tb-carousel__track"><div class="tb-carousel__slide" role="group" aria-roledescription="Folie" aria-label="1 von 3"><a class="tb-zoom" href="/post/2026-01-26-shortcodes/carousel-1.webp" data-pswp-width="900" data-pswp-height="900" data-alt="Berglandschaft"><img alt="Berglandschaft"
      src="/post/2026-01-26-shortcodes/carousel-1_hu_f855ebd278fbb83.webp"
      srcset="/post/2026-01-26-shortcodes/carousel-1_hu_f0badc7c3df75f7f.webp 480w, /post/2026-01-26-shortcodes/carousel-1_hu_f855ebd278fbb83.webp 768w"
      sizes="(max-width:768px) 100vw, 768px"
      width="768" height="768" loading="lazy" decoding="async"></a></div><div class="tb-carousel__slide" role="group" aria-roledescription="Folie" aria-label="2 von 3"><h3 id="bilder-oder-markdown">Bilder oder Markdown <a class="tb-heading-anchor" href="#bilder-oder-markdown" aria-label="Direktlink zu diesem Abschnitt">#</a></h3>
<p>Jede Folie nimmt <strong>beliebigen</strong> Inhalt auf:</p>
<ul>
<li>Überschriften und Fließtext</li>
<li>Listen</li>
<li><code>Code</code></li>
</ul></div><div class="tb-carousel__slide" role="group" aria-roledescription="Folie" aria-label="3 von 3"><a class="tb-zoom" href="/post/2026-01-26-shortcodes/carousel-2.webp" data-pswp-width="907" data-pswp-height="437" data-alt="Noch eine Aussicht"><img alt="Noch eine Aussicht"
      src="/post/2026-01-26-shortcodes/carousel-2_hu_ff989385fdebfc9c.webp"
      srcset="/post/2026-01-26-shortcodes/carousel-2_hu_f992853b3abce1fa.webp 480w, /post/2026-01-26-shortcodes/carousel-2_hu_ff989385fdebfc9c.webp 768w"
      sizes="(max-width:768px) 100vw, 768px"
      width="768" height="370" loading="lazy" decoding="async"></a></div></div><button class="tb-carousel__btn tb-carousel__btn--prev" type="button" aria-label="Vorherige Folie"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M15 6l-6 6l6 6" />
</svg></button>
  <button class="tb-carousel__btn tb-carousel__btn--next" type="button" aria-label="Nächste Folie"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M9 6l6 6l-6 6" />
</svg></button><div class="tb-carousel__dots" role="group" aria-label="Folien"><button class="tb-carousel__dot" type="button" aria-label="Folie 1 von 3"></button><button class="tb-carousel__dot" type="button" aria-label="Folie 2 von 3"></button><button class="tb-carousel__dot" type="button" aria-label="Folie 3 von 3"></button></div></div>


Und mit Automatik (`auto=5`) und reinen Text-Folien - deren Inhalt rückt
seitlich ein, damit die Pfeile nichts überdecken:

```markdown
{{< carousel auto=5 ratio="21 / 9" >}}
{{< carousel-slide >}}### Folie eins …{{< /carousel-slide >}}
{{< carousel-slide >}}### Folie zwei …{{< /carousel-slide >}}
{{< carousel-slide >}}### Folie drei …{{< /carousel-slide >}}
{{< /carousel >}}
```

<div class="tb-carousel" data-tb-component="carousel" data-loop="true" data-auto="5" role="group" aria-roledescription="Karussell" style="--tb-car-ratio:21 / 9">
  <div class="tb-carousel__track"><div class="tb-carousel__slide" role="group" aria-roledescription="Folie" aria-label="1 von 3"><h3 id="folie-eins">Folie eins <a class="tb-heading-anchor" href="#folie-eins" aria-label="Direktlink zu diesem Abschnitt">#</a></h3>
<p>Blättert alle 5 Sekunden automatisch weiter.</p></div><div class="tb-carousel__slide" role="group" aria-roledescription="Folie" aria-label="2 von 3"><h3 id="folie-zwei">Folie zwei <a class="tb-heading-anchor" href="#folie-zwei" aria-label="Direktlink zu diesem Abschnitt">#</a></h3>
<p>Hover oder Fokus pausiert die Automatik.</p></div><div class="tb-carousel__slide" role="group" aria-roledescription="Folie" aria-label="3 von 3"><h3 id="folie-drei">Folie drei <a class="tb-heading-anchor" href="#folie-drei" aria-label="Direktlink zu diesem Abschnitt">#</a></h3>
<p>Nach der letzten Folie geht es vorn weiter (<code>loop</code>).</p></div></div><button class="tb-carousel__btn tb-carousel__btn--prev" type="button" aria-label="Vorherige Folie"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M15 6l-6 6l6 6" />
</svg></button>
  <button class="tb-carousel__btn tb-carousel__btn--next" type="button" aria-label="Nächste Folie"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M9 6l6 6l-6 6" />
</svg></button><div class="tb-carousel__dots" role="group" aria-label="Folien"><button class="tb-carousel__dot" type="button" aria-label="Folie 1 von 3"></button><button class="tb-carousel__dot" type="button" aria-label="Folie 2 von 3"></button><button class="tb-carousel__dot" type="button" aria-label="Folie 3 von 3"></button></div></div>


## Chart

Ein Diagramm via selbst gehostetem Chart.js, nur geladen, wenn der Shortcode
vorkommt. Der innere Inhalt ist die Chart.js-Konfiguration als **valides JSON**;
Achsen, Gitter und Legende folgen dem Theme und färben live um, wenn du auf den
Dunkelmodus umschaltest.

```markdown
{{< chart title="Besucher pro Monat" >}}
{ "type": "bar",
  "data": { "labels": ["Jan", "Feb", "Mär"],
            "datasets": [{ "label": "Besucher", "data": [820, 932, 1290] }] } }
{{< /chart >}}
```

<figure class="tb-chart" style="height:22rem">
  <canvas role="img" aria-label="Besucher pro Monat"></canvas>
  <script type="application/json">
{
  "type": "bar",
  "data": {
    "labels": ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun"],
    "datasets": [{ "label": "Besucher", "data": [820, 932, 901, 1290, 1330, 1620] }]
  }
}
</script>
</figure>


## Galerie

Der `gallery`-Shortcode ordnet mehrere Bilder als Masonry-Spalten an. Im
**Automatik-Modus** schreibst du einfach ein Bild pro Zeile; `cols` (optional,
Standard `3`) bestimmt die Spaltenzahl auf dem Desktop, auf dem Handy wird
daraus eine Spalte. Alle Bilder einer Galerie bilden **eine** durchwischbare
Lightbox-Gruppe (*PhotoSwipe*); verlinkte Bilder (`[![…](…)](url)`) bleiben
normale Links und gehören nicht dazu.

```markdown
{{< gallery cols="2" >}}
![Wohnzimmer](galerie-1.webp)
![Wechselrichter](galerie-2.webp)
![Mini-PC](galerie-3.webp)
![Am Mac](galerie-4.webp)
{{< /gallery >}}
```

<div class="tb-gallery" style="--tb-gallery-cols:2"><div class="tb-gallery-col"><a class="tb-zoom" href="/post/2026-01-26-shortcodes/galerie-1.webp" data-pswp-width="900" data-pswp-height="900" data-alt="Wohnzimmer"><img alt="Wohnzimmer"
      src="/post/2026-01-26-shortcodes/galerie-1_hu_f855ebd278fbb83.webp"
      srcset="/post/2026-01-26-shortcodes/galerie-1_hu_f0badc7c3df75f7f.webp 480w, /post/2026-01-26-shortcodes/galerie-1_hu_f855ebd278fbb83.webp 768w"
      sizes="(max-width:480px) 100vw, 50vw"
      width="768" height="768" loading="lazy" decoding="async"></a><a class="tb-zoom" href="/post/2026-01-26-shortcodes/galerie-2.webp" data-pswp-width="970" data-pswp-height="527" data-alt="Wechselrichter"><img alt="Wechselrichter"
      src="/post/2026-01-26-shortcodes/galerie-2_hu_aedb4664733ad3f4.webp"
      srcset="/post/2026-01-26-shortcodes/galerie-2_hu_11e5c2fb915aaaf8.webp 480w, /post/2026-01-26-shortcodes/galerie-2_hu_aedb4664733ad3f4.webp 768w"
      sizes="(max-width:480px) 100vw, 50vw"
      width="768" height="417" loading="lazy" decoding="async"></a></div><div class="tb-gallery-col"><a class="tb-zoom" href="/post/2026-01-26-shortcodes/galerie-3.webp" data-pswp-width="907" data-pswp-height="437" data-alt="Mini-PC"><img alt="Mini-PC"
      src="/post/2026-01-26-shortcodes/galerie-3_hu_ff989385fdebfc9c.webp"
      srcset="/post/2026-01-26-shortcodes/galerie-3_hu_f992853b3abce1fa.webp 480w, /post/2026-01-26-shortcodes/galerie-3_hu_ff989385fdebfc9c.webp 768w"
      sizes="(max-width:480px) 100vw, 50vw"
      width="768" height="370" loading="lazy" decoding="async"></a><a class="tb-zoom" href="/post/2026-01-26-shortcodes/galerie-4.webp" data-pswp-width="921" data-pswp-height="437" data-alt="Am Mac"><img alt="Am Mac"
      src="/post/2026-01-26-shortcodes/galerie-4_hu_a11ce7d248ba3a2b.webp"
      srcset="/post/2026-01-26-shortcodes/galerie-4_hu_d0c7f95cc89ca50a.webp 480w, /post/2026-01-26-shortcodes/galerie-4_hu_a11ce7d248ba3a2b.webp 768w"
      sizes="(max-width:480px) 100vw, 50vw"
      width="768" height="364" loading="lazy" decoding="async"></a></div></div>

Statt der Automatik kannst du die Spalten mit verschachtelten
`gallery-column`-Blöcken auch **explizit** belegen - `cols` wird dann
ignoriert, die Spaltenzahl ergibt sich aus der Zahl der Blöcke. Alle Details
(Spaltenlogik, Bildunterschriften, responsive Größen, verlinkte Bilder) zeigt
der Beitrag [Bilder und Galerien](/de/post/2026-02-02-bilder-und-galerien/).

## GitHub

Bettet die OpenGraph-Vorschau eines Repos ein. Das externe Vorschaubild lädt
erst nach Zustimmung über den Consent-Manager *Klaro* - der Link zum Projekt
funktioniert immer.

```markdown
{{< github repo="gohugoio/hugo" >}}
```

<div class="tb-gh-card"><div class="tb-gh-og-gate" data-name="consent-gate-github"><a class="tb-gh-og-link" href="https://github.com/gohugoio/hugo" target="_blank" rel="noopener noreferrer" aria-label="gohugoio/hugo auf GitHub">
        <img class="tb-gh-og" data-name="consent-gate-github"
          data-src="https://opengraph.githubassets.com/0/gohugoio/hugo"
          alt="gohugoio/hugo auf GitHub" loading="lazy" decoding="async" width="1200" height="600" referrerpolicy="no-referrer">
      </a>
    </div>
    <a class="tb-gh-link" href="https://github.com/gohugoio/hugo" target="_blank" rel="noopener noreferrer">
      <svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" />
</svg><span>gohugoio/hugo auf GitHub besuchen</span>
    </a>
  </div>

## Icons

`{{< ti name >}}` setzt ein *Tabler*-Icon mitten in den Text, das mit der
Schriftgröße mitwächst - z. B. <span class="tb-i-inline"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3" />
  <path d="M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3" />
  <path d="M14 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" />
</svg></span>
 oder <span class="tb-i-inline"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M3 14c.83 .642 2.077 1.017 3.5 1c1.423 .017 2.67 -.358 3.5 -1c.83 -.642 2.077 -1.017 3.5 -1c1.423 -.017 2.67 .358 3.5 1" />
  <path d="M8 3a2.4 2.4 0 0 0 -1 2a2.4 2.4 0 0 0 1 2" />
  <path d="M12 3a2.4 2.4 0 0 0 -1 2a2.4 2.4 0 0 0 1 2" />
  <path d="M3 10h14v5a6 6 0 0 1 -6 6h-2a6 6 0 0 1 -6 -6v-5" />
  <path d="M16.746 16.726a3 3 0 1 0 .252 -5.555" />
</svg></span>
.
Jeder Name aus dem [Tabler-Outline-Set](https://tabler.io/icons) funktioniert
(bewusst nur *Outline*, nicht *Filled* - das Theme bindet ausschließlich das
Strich-Set ein, damit alle Icons dieselbe Liniensprache sprechen).

## KaTeX

Setzt **einmalig** den Marker-Shortcode `{{< katex >}}` auf die Seite - er
lädt den (selbst gehosteten) *KaTeX*-Renderer. Danach schreibst du Mathematik
inline mit `$ ... $` und abgesetzt mit `$$ ... $$`; geladen wird KaTeX nur,
wenn der Marker vorkommt.

```markdown
{{< katex >}}
Inline: die Eulersche Identität $e^{i\pi} + 1 = 0$.
```


Inline: die Eulersche Identität $e^{i\pi} + 1 = 0$, abgesetzt die Gauß-Summe:

$$
\sum_{k=1}^{n} k = \frac{n(n+1)}{2}
$$

Block-, Matrizen- und mehrzeilige Formeln zeigt der Beitrag
[Diagramme und Mathe](/de/post/2026-02-09-diagramme-und-mathe/).

## Lead

Ein hervorgehobener Einleitungsabsatz. Der Inhalt wird als Markdown gerendert.

```markdown
{{< lead >}}
Ein **Lead**-Absatz fasst den Beitrag in ein, zwei Sätzen zusammen.
{{< /lead >}}
```

<div class="tb-lead">Ein <strong>Lead</strong>-Absatz fasst den Beitrag in ein, zwei Sätzen zusammen - größer
gesetzt und optisch abgesetzt vom Fließtext.</div>


## Mermaid

Schreibt ein Diagramm als Text in einen `mermaid`-Shortcode. Das (selbst
gehostete) *Mermaid* wird nur geladen, wenn der Shortcode vorkommt, und folgt
automatisch dem hellen bzw. dunklen Farbschema (auch beim Live-Umschalten).

```markdown
{{< mermaid >}}
graph LR
  A[Markdown] --> B[HTML]
{{< /mermaid >}}
```

<pre class="mermaid">
graph LR
  A[Markdown] --&gt; B[HTML]
</pre>


Flowcharts, Sequenz-, Klassen-, Zustands-, Gantt- und weitere Diagrammtypen
zeigt der Beitrag
[Diagramme und Mathe](/de/post/2026-02-09-diagramme-und-mathe/).

## Specs

Ein Datenblatt listet die Eckdaten eines Produkts als Zeilen mit Icon und
Bezeichnung. Mit `title2` und einem `value2` je Zeile wird daraus ein direkter
Vergleich zweier Produkte.

```markdown
{{< specs title="Midea PortaSplit Cool" badge="Datenblatt" >}}
{{< spec icon="snowflake" label="Kühlleistung" value="2,35 kW" >}}
{{< spec icon="tag" label="Preis (UVP)" value="899 €" >}}
{{< /specs >}}
```

<div class="tb-specs"><div class="tb-specs__head"><span class="tb-specs__badge">Datenblatt</span><span class="tb-specs__title">Midea PortaSplit Cool</span></div><div class="tb-specs__row">
      <span class="tb-specs__label"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M10 4l2 1l2 -1" />
  <path d="M12 2v6.5l3 1.72" />
  <path d="M17.928 6.268l.134 2.232l1.866 1.232" />
  <path d="M20.66 7l-5.629 3.25l.01 3.458" />
  <path d="M19.928 14.268l-1.866 1.232l-.134 2.232" />
  <path d="M20.66 17l-5.629 -3.25l-2.99 1.738" />
  <path d="M14 20l-2 -1l-2 1" />
  <path d="M12 22v-6.5l-3 -1.72" />
  <path d="M6.072 17.732l-.134 -2.232l-1.866 -1.232" />
  <path d="M3.34 17l5.629 -3.25l-.01 -3.458" />
  <path d="M4.072 9.732l1.866 -1.232l.134 -2.232" />
  <path d="M3.34 7l5.629 3.25l2.99 -1.738" />
</svg><span class="tb-specs__labeltext">Kühlleistung</span>
      </span>
      <span class="tb-specs__value">2,35 kW (8.000 BTU)</span></div><div class="tb-specs__row">
      <span class="tb-specs__label"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M17 3l4 4l-14 14l-4 -4l14 -14" />
  <path d="M16 7l-1.5 -1.5" />
  <path d="M13 10l-1.5 -1.5" />
  <path d="M10 13l-1.5 -1.5" />
  <path d="M7 16l-1.5 -1.5" />
</svg><span class="tb-specs__labeltext">Für Räume bis</span>
      </span>
      <span class="tb-specs__value">28 m²</span></div><div class="tb-specs__row">
      <span class="tb-specs__label"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M15 8a5 5 0 0 1 0 8" />
  <path d="M17.7 5a9 9 0 0 1 0 14" />
  <path d="M6 15h-2a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1h2l3.5 -4.5a.8 .8 0 0 1 1.5 .5v14a.8 .8 0 0 1 -1.5 .5l-3.5 -4.5" />
</svg><span class="tb-specs__labeltext">Lautstärke im Silent-Modus</span>
      </span>
      <span class="tb-specs__value">38 dB(A)</span></div><div class="tb-specs__row">
      <span class="tb-specs__label"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" />
  <path d="M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3" />
</svg><span class="tb-specs__labeltext">Preis (UVP)</span>
      </span>
      <span class="tb-specs__value">899 €</span></div></div>


Mit `title2` wird daraus ein Vergleich zweier Produkte; `image`/`image2` setzen ein Produktbild je Spalte, `link`/`link2` ergänzen einen Kauf-Button:

<div class="tb-specs tb-specs--compare"><div class="tb-specs__head"><span class="tb-specs__badge">Vergleich</span><span class="tb-specs__title">PortaSplit Cool</span><span class="tb-specs__title">PortaSplit</span></div><div class="tb-specs__media"><span class="tb-specs__media-spacer" aria-hidden="true"></span><img class="tb-specs__img" src="/post/2026-01-26-shortcodes/galerie-1_hu_a3eff9f5367a1d18.webp" width="400" height="400" alt="PortaSplit Cool" loading="lazy" decoding="async"><img class="tb-specs__img" src="/post/2026-01-26-shortcodes/galerie-2_hu_502a1fdb8ab252e.webp" width="400" height="217" alt="PortaSplit" loading="lazy" decoding="async"></div><div class="tb-specs__row">
      <span class="tb-specs__label"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M10 4l2 1l2 -1" />
  <path d="M12 2v6.5l3 1.72" />
  <path d="M17.928 6.268l.134 2.232l1.866 1.232" />
  <path d="M20.66 7l-5.629 3.25l.01 3.458" />
  <path d="M19.928 14.268l-1.866 1.232l-.134 2.232" />
  <path d="M20.66 17l-5.629 -3.25l-2.99 1.738" />
  <path d="M14 20l-2 -1l-2 1" />
  <path d="M12 22v-6.5l-3 -1.72" />
  <path d="M6.072 17.732l-.134 -2.232l-1.866 -1.232" />
  <path d="M3.34 17l5.629 -3.25l-.01 -3.458" />
  <path d="M4.072 9.732l1.866 -1.232l.134 -2.232" />
  <path d="M3.34 7l5.629 3.25l2.99 -1.738" />
</svg><span class="tb-specs__labeltext">Kühlleistung</span>
      </span>
      <span class="tb-specs__value">2,35 kW (8.000 BTU)</span><span class="tb-specs__value">3,5 kW (12.000 BTU)</span></div><div class="tb-specs__row">
      <span class="tb-specs__label"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M17 3l4 4l-14 14l-4 -4l14 -14" />
  <path d="M16 7l-1.5 -1.5" />
  <path d="M13 10l-1.5 -1.5" />
  <path d="M10 13l-1.5 -1.5" />
  <path d="M7 16l-1.5 -1.5" />
</svg><span class="tb-specs__labeltext">Für Räume bis</span>
      </span>
      <span class="tb-specs__value">28 m²</span><span class="tb-specs__value">42 m²</span></div><div class="tb-specs__row">
      <span class="tb-specs__label"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M15 8a5 5 0 0 1 0 8" />
  <path d="M17.7 5a9 9 0 0 1 0 14" />
  <path d="M6 15h-2a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1h2l3.5 -4.5a.8 .8 0 0 1 1.5 .5v14a.8 .8 0 0 1 -1.5 .5l-3.5 -4.5" />
</svg><span class="tb-specs__labeltext">Lautstärke im Silent-Modus</span>
      </span>
      <span class="tb-specs__value">38 dB(A)</span><span class="tb-specs__value">39 dB(A)</span></div><div class="tb-specs__row">
      <span class="tb-specs__label"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M12 10.941c2.333 -3.308 .167 -7.823 -1 -8.941c0 3.395 -2.235 5.299 -3.667 6.706c-1.43 1.408 -2.333 3.294 -2.333 5.588c0 3.704 3.134 6.706 7 6.706c3.866 0 7 -3.002 7 -6.706c0 -1.712 -1.232 -4.403 -2.333 -5.588c-2.084 3.353 -3.257 3.353 -4.667 2.235" />
</svg><span class="tb-specs__labeltext">Heizfunktion</span>
      </span>
      <span class="tb-specs__value">Nein</span><span class="tb-specs__value">Ja</span></div><div class="tb-specs__row">
      <span class="tb-specs__label"><svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" />
  <path d="M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3" />
</svg><span class="tb-specs__labeltext">Preis (UVP)</span>
      </span>
      <span class="tb-specs__value">899 €</span><span class="tb-specs__value">1.199 €</span></div><div class="tb-specs__foot"><span class="tb-specs__foot-spacer" aria-hidden="true"></span><a class="tb-btn tb-btn-primary tb-btn-sm" href="https://example.com/cool" target="_blank" rel="sponsored noopener noreferrer">Zum Angebot<svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M4 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M15 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M17 17h-11v-14h-2" />
  <path d="M6 5l14 1l-1 7h-13" />
</svg></a><a class="tb-btn tb-btn-primary tb-btn-sm" href="https://example.com/standard" target="_blank" rel="sponsored noopener noreferrer">Zum Angebot<svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M4 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M15 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
  <path d="M17 17h-11v-14h-2" />
  <path d="M6 5l14 1l-1 7h-13" />
</svg></a></div></div>


## Tabs

Tabs gruppieren alternative Inhalte (z. B. pro Betriebssystem). Tabs mit
gleichem `group` synchronisieren sich seitenweit: Wählst du in einer Gruppe
"macOS", springen alle anderen Gruppen ebenfalls auf "macOS". `group` ist
dabei nur der interne Sync-Schlüssel; `label` setzt den für Screenreader
vorgelesenen Namen der Tab-Leiste (ohne `label` greift die übersetzte
Standardbezeichnung "Tabs" - nie der `group`-Schlüssel selbst).

```markdown
{{< tabs group="os" label="Betriebssystem" >}}
{{< tab label="Linux" icon="brand-debian" >}}
`sudo apt install hugo`
{{< /tab >}}
{{< tab label="macOS" icon="brand-apple" >}}
`brew install hugo`
{{< /tab >}}
{{< /tabs >}}
```

<div class="tb-tab__container" data-tb-component="tabs" data-tab-group="os">
  <div class="tb-tab__nav" role="tablist" aria-label="Betriebssystem"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-25-tab-0" aria-controls="tabs-25-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        <svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M12 17c-2.397 -.943 -4 -3.153 -4 -5.635c0 -2.19 1.039 -3.14 1.604 -3.595c2.646 -2.133 6.396 -.27 6.396 3.23c0 2.5 -2.905 2.121 -3.5 1.5c-.595 -.621 -1 -1.5 -.5 -2.5" />
  <path d="M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" />
</svg>Linux
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-25-tab-1" aria-controls="tabs-25-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        <svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M8.286 7.008c-3.216 0 -4.286 3.23 -4.286 5.92c0 3.229 2.143 8.072 4.286 8.072c1.165 -.05 1.799 -.538 3.214 -.538c1.406 0 1.607 .538 3.214 .538s4.286 -3.229 4.286 -5.381c-.03 -.011 -2.649 -.434 -2.679 -3.23c-.02 -2.335 2.589 -3.179 2.679 -3.228c-1.096 -1.606 -3.162 -2.113 -3.75 -2.153c-1.535 -.12 -3.032 1.077 -3.75 1.077c-.729 0 -2.036 -1.077 -3.214 -1.077" />
  <path d="M12 4a2 2 0 0 0 2 -2a2 2 0 0 0 -2 2" />
</svg>macOS
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-25-tab-2" aria-controls="tabs-25-panel-2"
        aria-selected="false" tabindex="-1" data-tab-index="2">
        <svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M17.8 20l-12 -1.5c-1 -.1 -1.8 -.9 -1.8 -1.9v-9.2c0 -1 .8 -1.8 1.8 -1.9l12 -1.5c1.2 -.1 2.2 .8 2.2 1.9v12.1c0 1.2 -1.1 2.1 -2.2 1.9l0 .1" />
  <path d="M12 5l0 14" />
  <path d="M4 12l16 0" />
</svg>Windows
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-25-panel-0" aria-labelledby="tabs-25-tab-0" data-tab-index="0"><p>Installation per Paketmanager:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install hugo
</span></span></code></pre></div></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-25-panel-1" aria-labelledby="tabs-25-tab-1" data-tab-index="1"><p>Installation per Homebrew:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">brew install hugo
</span></span></code></pre></div></div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-25-panel-2" aria-labelledby="tabs-25-tab-2" data-tab-index="2"><p>Installation per Winget:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">winget</span> <span class="n">install</span> <span class="n">Hugo</span><span class="p">.</span><span class="py">Hugo</span><span class="p">.</span><span class="py">Extended</span>
</span></span></code></pre></div></div></div>
</div>


Mit `default="macOS"` wird ein anderer Tab als der erste vorausgewählt; mit
`md=false` wird der Inhalt eines Tabs nicht als Markdown interpretiert.

Diese zweite Gruppe nutzt dasselbe `group="os"` - wechsle oben das
Betriebssystem und beobachte, wie sie mitspringt (die Wahl wird zudem
gemerkt):

<div class="tb-tab__container" data-tb-component="tabs" data-tab-group="os">
  <div class="tb-tab__nav" role="tablist" aria-label="Tabs"><button class="tb-tab__button tb-tab--active" type="button" role="tab"
        id="tabs-26-tab-0" aria-controls="tabs-26-panel-0"
        aria-selected="true" tabindex="0" data-tab-index="0">
        <svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M12 17c-2.397 -.943 -4 -3.153 -4 -5.635c0 -2.19 1.039 -3.14 1.604 -3.595c2.646 -2.133 6.396 -.27 6.396 3.23c0 2.5 -2.905 2.121 -3.5 1.5c-.595 -.621 -1 -1.5 -.5 -2.5" />
  <path d="M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" />
</svg>Linux
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-26-tab-1" aria-controls="tabs-26-panel-1"
        aria-selected="false" tabindex="-1" data-tab-index="1">
        <svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M8.286 7.008c-3.216 0 -4.286 3.23 -4.286 5.92c0 3.229 2.143 8.072 4.286 8.072c1.165 -.05 1.799 -.538 3.214 -.538c1.406 0 1.607 .538 3.214 .538s4.286 -3.229 4.286 -5.381c-.03 -.011 -2.649 -.434 -2.679 -3.23c-.02 -2.335 2.589 -3.179 2.679 -3.228c-1.096 -1.606 -3.162 -2.113 -3.75 -2.153c-1.535 -.12 -3.032 1.077 -3.75 1.077c-.729 0 -2.036 -1.077 -3.214 -1.077" />
  <path d="M12 4a2 2 0 0 0 2 -2a2 2 0 0 0 -2 2" />
</svg>macOS
      </button><button class="tb-tab__button " type="button" role="tab"
        id="tabs-26-tab-2" aria-controls="tabs-26-panel-2"
        aria-selected="false" tabindex="-1" data-tab-index="2">
        <svg aria-hidden="true"
  xmlns="http://www.w3.org/2000/svg"
 
 
  viewBox="0 0 24 24"
  fill="none"
  stroke="currentColor"
  stroke-width="2"
  stroke-linecap="round"
  stroke-linejoin="round"
 
>
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  <path d="M17.8 20l-12 -1.5c-1 -.1 -1.8 -.9 -1.8 -1.9v-9.2c0 -1 .8 -1.8 1.8 -1.9l12 -1.5c1.2 -.1 2.2 .8 2.2 1.9v12.1c0 1.2 -1.1 2.1 -2.2 1.9l0 .1" />
  <path d="M12 5l0 14" />
  <path d="M4 12l16 0" />
</svg>Windows
      </button></div>
  <div class="tb-tab__content"><div class="tb-tab__panel tb-tab--active" role="tabpanel" tabindex="0"
        id="tabs-26-panel-0" aria-labelledby="tabs-26-tab-0" data-tab-index="0">Konfigurationsdatei unter <code>~/.config/hugo.toml</code>.</div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-26-panel-1" aria-labelledby="tabs-26-tab-1" data-tab-index="1">Konfigurationsdatei unter <code>~/Library/Application Support/hugo.toml</code>.</div><div class="tb-tab__panel " role="tabpanel" tabindex="0"
        id="tabs-26-panel-2" aria-labelledby="tabs-26-tab-2" data-tab-index="2">Konfigurationsdatei unter <code>%AppData%\hugo.toml</code>.</div></div>
</div>


