-
Hello Quarto community, I have been working on a Lua filter designed to move tables and figures to the end of a DOCX document, as required by some academic journal formats. The filter functions well for general tables and external figures processed by Pandoc. Below is the Lua filter I am currently using: --- move-floats.lua
--- Move tables and figures to the end of docx
-- Function to create a page break
function create_page_break()
return pandoc.RawBlock('openxml', '<w:p><w:r><w:br w:type="page"/></w:r></w:p>')
end
-- Function to create a placeholder for the original position
function create_placeholder(element_type, index)
local text = element_type == 'Table' and pandoc.Strong({ pandoc.Str("TABLE " .. index .. " HERE") }) or
pandoc.Strong({ pandoc.Str("FIGURE " .. index .. " HERE") })
return pandoc.Para { text }
end
-- Function to move elements to the end of the document
function move_floats_to_end(doc, element_type, header_title)
local blocks = {}
local elements = {}
-- Separate the specified elements from other blocks
local index = 1
for _, el in ipairs(doc.blocks) do
if el.t == element_type then
-- Insert a placeholder in the original position
table.insert(blocks, create_placeholder(element_type, index))
table.insert(elements, el)
index = index + 1
else
table.insert(blocks, el)
end
end
-- Add a heading for the elements if any exist
if #elements > 0 then
-- Insert page break before heading
table.insert(blocks, create_page_break())
-- Create an unnumbered header
local header = pandoc.Header(1, pandoc.Str(header_title))
header.classes:insert("unnumbered")
table.insert(blocks, header)
-- Add elements and a page break after each one, except for the last element
for i, el in ipairs(elements) do
table.insert(blocks, el)
if i < #elements then
table.insert(blocks, create_page_break())
end
end
end
return blocks
end
-- Main function to handle the document
function Pandoc(doc)
-- Move tables to the end
local blocks_with_tables_moved = move_floats_to_end(doc, 'Table', 'Tables')
-- Create a new document to include the moved tables
local doc_with_tables_moved = pandoc.Pandoc(blocks_with_tables_moved, doc.meta)
-- Move figures to the end
local final_blocks = move_floats_to_end(doc_with_tables_moved, 'Figure', 'Figures')
-- Insert a page break after the last block
table.insert(final_blocks, create_page_break())
-- Return the modified document
return pandoc.Pandoc(final_blocks, doc.meta)
end Problem: While the filter works effectively for general tables and figures, it encounters issues when dealing with tables and figures produced by executable code blocks within Quarto documents. Specifically:
Steps to Reproduce:
---
title: Moving Tables and Figures Produced by Executable Code Blocks in Quarto
execute:
cache: true
freeze: auto
echo: false
warning: false
format:
docx:
filters:
- move-floats
---
Texts with executable code blocks in Quarto file `index.qmd`.
| Col1 | Col2 | Col3 |
|------|------|------|
| A | B | C |
| E | F | G |
| A | G | G |
: My Caption {#tbl-letters}
See @tbl-letters.
```{r}
#| message: false
#| fig-cap: "A demo figure"
#| label: carfig
library(ggplot2)
mtcars2 <- mtcars
mtcars2$am <- factor(
mtcars$am, labels = c('automatic', 'manual')
)
ggplot(mtcars2, aes(hp, mpg, color = am)) +
geom_point() + geom_smooth() +
theme(legend.position = 'bottom')
```
```{r}
#| label: tbl-example
#| tbl-cap: "Example"
#| tbl-subcap:
#| - "Cars"
#| - "Pressure"
#| layout-ncol: 2
library(knitr)
kable(head(cars))
kable(head(pressure))
```
```{r}
#| label: fig-charts
#| fig-cap: "Charts"
#| fig-subcap:
#| - "Cars"
#| - "Pressure"
#| layout-ncol: 2
plot(cars)
plot(pressure)
```
quarto render index.qmd --to docx
Questions:
Any guidance or suggestions on how to address these issues would be greatly appreciated. Thank you for your help! |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 4 replies
-
Could you add the format and the filters YAML keys in your example? See https://quarto.org/docs/extensions/filters.html. |
Beta Was this translation helpful? Give feedback.
-
Take a look at figure-table-formatter. It moves the tables, figures and supplements to wherever you indicate. You can cross-reference the figures and tables in the order that they are mentioned in the text, and sort them accordingly. It automatically outputs a file with the sorted tags of the figures and tables. You can use this file to automatically sort the figures in other files using the same filter (handy for supplements). It would be nice to have the same functionality in the native Quarto, but at least this is a viable alternative now. |
Beta Was this translation helpful? Give feedback.
Take a look at figure-table-formatter. It moves the tables, figures and supplements to wherever you indicate. You can cross-reference the figures and tables in the order that they are mentioned in the text, and sort them accordingly. It automatically outputs a file with the sorted tags of the figures and tables. You can use this file to automatically sort the figures in other files using the same filter (handy for supplements).
It would be nice to have the same functionality in the native Quarto, but at least this is a viable alternative now.