From 8ca12b2a0f11ad124c828a79c8edb0f828b15ffc Mon Sep 17 00:00:00 2001 From: Carlos Scheidegger Date: Mon, 19 May 2025 10:54:54 -0400 Subject: [PATCH 1/2] beamer - convert PanelLayouts to column div structure (#12775) --- news/changelog-1.8.md | 4 +++ src/resources/filters/common/layout.lua | 3 -- src/resources/filters/common/validate.lua | 4 +-- src/resources/filters/layout/latex.lua | 36 +++++++++++++++++++++-- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/news/changelog-1.8.md b/news/changelog-1.8.md index 8d8b3e2065..98c02ea195 100644 --- a/news/changelog-1.8.md +++ b/news/changelog-1.8.md @@ -30,6 +30,10 @@ All changes included in 1.8: - ([#12554](https://github.com/quarto-dev/quarto-cli/pull/12554)): CSS properties `font-weight` and `font-style` are translated to Typst `text` properties. - ([#12739](https://github.com/quarto-dev/quarto-cli/pull/12739)): Remove unused variable `heading-background-color` and `heading-decoration` from Typst's templates. They are leftover from previous change, and not part of Brand.yml schema for typography of headings. +### `beamer` + +- ([#12775](https://github.com/quarto-dev/quarto-cli/issues/12775)): Convert Quarto-native layouts (divs with `layout` syntax) to Beamer columns, equivalent to using the Pandoc-native syntax of div with `columns` and `column` classes. + ## Projects ### `website` diff --git a/src/resources/filters/common/layout.lua b/src/resources/filters/common/layout.lua index c50e5561f0..3931c34d07 100644 --- a/src/resources/filters/common/layout.lua +++ b/src/resources/filters/common/layout.lua @@ -11,12 +11,9 @@ function layout_align_attribute(el_with_attr, default) return validatedAlign(el_with_attr.attributes[kLayoutAlign], default) end --- now unused. Remove? --- luacov: disable function layout_valign_attribute(el_with_attr, default) return validatedVAlign(el_with_attr.attributes[kLayoutVAlign] or default) end --- luacov: enable function attr_has_layout_attributes(attr) local attribs = tkeys(attr.attributes) diff --git a/src/resources/filters/common/validate.lua b/src/resources/filters/common/validate.lua index 7e6cfab681..ef4fd9c527 100644 --- a/src/resources/filters/common/validate.lua +++ b/src/resources/filters/common/validate.lua @@ -1,14 +1,14 @@ -- validate.lua -- Copyright (C) 2020-2022 Posit Software, PBC -kAlignments = pandoc.List({ "center", "left", "right" }) -kVAlignments = pandoc.List({"top", "center", "bottom"}) function validatedAlign(align, default) + local kAlignments = pandoc.List({ "center", "left", "right" }) return validateInList(align, kAlignments, "alignment", default) end function validatedVAlign(vAlign) + local kVAlignments = pandoc.List({"top", "top-baseline", "center", "bottom"}) return validateInList(vAlign, kVAlignments, "vertical alignment", "top") end diff --git a/src/resources/filters/layout/latex.lua b/src/resources/filters/layout/latex.lua index 6660e70a44..e5bce66ba4 100644 --- a/src/resources/filters/layout/latex.lua +++ b/src/resources/filters/layout/latex.lua @@ -4,7 +4,7 @@ kSideCaptionEnv = 'sidecaption' _quarto.ast.add_renderer("PanelLayout", function(_) return _quarto.format.isLatexOutput() -end, function(layout) +end, function (layout) local rendered_panel = latexPanel(layout) local preamble = layout.preamble if preamble == nil then @@ -18,9 +18,41 @@ end, function(layout) return result end) +_quarto.ast.add_renderer("PanelLayout", function(_) + return _quarto.format.isBeamerOutput() +end, function(panel) + local result = pandoc.Blocks({}) + if panel.preamble then + panel_insert_preamble(result, panel.preamble) + end + + for i, row in ipairs(panel.layout) do + local beamer_cols = pandoc.Div({}, pandoc.Attr("", { "columns" })) + for j, cell in ipairs(row) do + local attrs = {} + local align = nil + -- NB: column "align" in beamer is "valign" in our layouts + if cell.attributes["valign"] then + align = cell.attributes["valign"] + end + if cell.attributes["width"] then + attrs.width = cell.attributes["width"] + end + if align then + attrs.align = align + end + local beamer_col = pandoc.Div({}, pandoc.Attr(cell.identifier, { "column" }, attrs)) + beamer_col.content:extend(cell.content) + beamer_cols.content:insert(beamer_col) + end + result:insert(beamer_cols) + end + + return result +end) + -- function latexPanel(divEl, layout, caption) function latexPanel(layout) - -- begin container local env, pos = latexPanelEnv(layout) local panel_node, panel = quarto.LatexEnvironment({ From 4ef2c65a27a9f9df13877e8545ae14c14d86b061 Mon Sep 17 00:00:00 2001 From: Carlos Scheidegger Date: Mon, 19 May 2025 10:56:46 -0400 Subject: [PATCH 2/2] regression test --- tests/docs/smoke-all/2025/05/19/issue-12775.qmd | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/docs/smoke-all/2025/05/19/issue-12775.qmd diff --git a/tests/docs/smoke-all/2025/05/19/issue-12775.qmd b/tests/docs/smoke-all/2025/05/19/issue-12775.qmd new file mode 100644 index 0000000000..4dfd33f99c --- /dev/null +++ b/tests/docs/smoke-all/2025/05/19/issue-12775.qmd @@ -0,0 +1,17 @@ +--- +title: "title" +date: last-modified +format: beamer +--- + +## slide + +::::::{layout="[48, 48]"} +:::{#first-column valign="bottom"} +hallo +::: +:::{#second-column valign="top-baseline"} +### a block title +du +::: +::::::