Wie man Tabellen oder Bilder über beide Spalten im Typst-Zweispaltenlayout anzeigt (Quarto + Typst)

In diesem Beitrag zeige ich, wie man in Quarto in Kombination mit Typst bei einem zweispaltigen PDF-Layout dennoch Inhalte wie Tabellen oder Bilder erstellen kann, die sich über die gesamte Seitenbreite erstrecken. Ich erläutere sowohl den direkten Weg über Typst-Chunks als auch eine elegantere Lösung mithilfe eines Lua-Filters, der sich nahtlos in den Quarto-Workflow integriert.
quarto
typst
ubuntuusers
Autor:in

Joe Slam

Veröffentlichungsdatum

11 Juli 2025 - 21:19

Geändert

11 Juli 2025 - 21:36

Ich nutze Quarto, um wissenschaftliche Artikel zu schreiben, und exportiere das Ergebnis als PDF mit Typst. Mein Layout ist dabei zweispaltig, was ich in meinem Typst-Template wie folgt aktiviere:

show: columns.with(2)

Manchmal möchte ich jedoch sehr breite Tabellen oder Bilder einfügen, die sich über beide Spalten erstrecken sollen.

In Typst selbst lässt sich das mit dem place-Befehl lösen:

#place(top+center, scope: "parent", float: true)[INHALT]

In Quarto kann man das umsetzen, indem man manuell zwei Typst-Codeblöcke (typst-Chunks) um den Inhalt legt – z. B. um eine Tabelle:

```{=typst}
#place(top+center, scope: "parent", float: true)[
```


| **Default** | **Left** | **Right** | **Center** | **Default** | **Left** | **Right** | **Center** |
|:-----------|:--------|---------:|:--------:|:-----------|:--------|---------:|:--------:|
| 12         | 12      | 12       | 12       | 12         | 12      | 12       | 12       |
| 123        | 123     | 123      | 123      | 123        | 123     | 123      | 123      |
| 1          | 1       | 1        | 1        | 1          | 1       | 1        | 1        |

: Tolle Tabelle {#tbl-mulitcolumn1}

```{=typst}
]
```

Das funktioniert, ist aber nicht wirklich „the Quarto way“.

Lua-Filter

Um das eleganter zu lösen, habe ich einen kleinen Lua-Filter geschrieben (multicolumn.lua), der automatisch jede ::: {.multicolumn}-Umgebung in den passenden #place(...)-Befehl für Typst übersetzt:

function Div(div)
  if div.classes:includes("multicolumn") then
    local typst_start = pandoc.RawBlock("typst", '#place(top+center, scope: "parent", float: true)[')
    local typst_end = pandoc.RawBlock("typst", ']')

    local result = {typst_start}
    for _, el in ipairs(div.content) do
      table.insert(result, el)
    end
    table.insert(result, typst_end)
    return result
  end
end

Den Filter aktiviere ich im YAML-Header wie folgt:

      filters:
        - multicolumn.lua

Dann kann ich im Markdown einfach folgende Struktur verwenden:


:::{.multicolumn}

| **Default** | **Left** | **Right** | **Center** | **Default** | **Left** | **Right** | **Center** |
|:-----------|:--------|---------:|:--------:|:-----------|:--------|---------:|:--------:|
| 12         | 12      | 12       | 12       | 12         | 12      | 12       | 12       |
| 123        | 123     | 123      | 123      | 123        | 123     | 123      | 123      |
| 1          | 1       | 1        | 1        | 1          | 1       | 1        | 1        |

: My span table {#tbl-span2}

:::

Das Ergebnis: Die Tabelle erscheint über beide Spalten hinweg, ganz ohne manuelle Typst-Blöcke. Das funktioniert genauso gut auch mit Bildern oder R-Code-Chunks.

Viel Spass beim Coden!