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:
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!