有谁知道是否可以在渲染为 pdf 的 Quarto 或 RMarkdown 文档的页眉和/或页脚文本中包含参数?
本期展示了如何在页眉和页脚中包含常规文本。但我想做的是在页眉或页脚中包含一个参数。
下面的例子中,参数
name
可以渲染在主体中,但不知道是否可以包含在标题中。
---
title: "Untitled"
format:
pdf:
include-in-header:
text: |
\usepackage{scrlayer-scrpage}
\rohead{Header text}
\lofoot{Footer text}
params:
name: "John"
---
# Chapter ONE
My name is `r params$name`
\newpage
# Chapter TWO
编辑:我想使用参数的原因是因为我需要在渲染时传递参数,例如在 R 中使用
quarto::quarto_render()
。我正在渲染多个 PDF,并且我想在每个 PDF 的页眉/页脚中插入唯一的名称。
此处提供了出色的解决方案 - 让页眉/页脚引用宏,您稍后将在文档中定义该宏:
---
title: "Untitled"
format:
pdf:
keep-tex: true
include-in-header:
text: |
\usepackage{scrlayer-scrpage}
\rohead{\myname}
params:
name: "John"
engine: knitr
---
# Chapter ONE
My name is `r params$name`
\newcommand{\myname}{`r params$name`}
\newpage
# Chapter TWO
Latex Template Partials 和 pandoc 变量。
这里我使用了 模板部分,因为其中的所有内容都将附加在\begin{document}
之前,并将页眉和页脚文本的乳胶代码移至
title.tex
中。现在为了获取 LateX 代码中的参数值,我做了两件事,首先使用 YAML 键中的参数值
name
,然后使用
title.tex
中的键作为 pandoc 变量
$name$
(使用模板部分的唯一目的是可以使用 pandoc 变量)。
---
title: Untitled
format:
pdf:
keep-tex: true
template-partials:
- title.tex
params:
name: John
name: "`r params$name`"
---
# Chapter ONE
My name is `r params$name`
\newpage
# Chapter TWO
标题.tex
$if(title)$
\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
$endif$
$if(subtitle)$
\subtitle{$subtitle$}
$endif$
\author{$for(authors)$$it.name.literal$$sep$ \and $endfor$}
\date{$date$}
\usepackage{scrlayer-scrpage}
\rohead{Header text - $name$}
\lofoot{Footer text - $name$}
metadata 来解决这个问题。
我使用rmardown::pandoc_metadata_arg()
解决了这个问题,它接受
name
参数和
value
参数,并返回一个字符串向量,然后您可以将其传递给
quarto::render()
参数中的
pandoc_args
。我的用例是渲染一些字母,我想在乳胶模板中使用名字/姓氏。我有一个数据框,其中的数据位于不同的列中(姓名、地址等)。每一行应渲染到一个输出文件。数据框中的列名称是 pandoc 部分中变量的名称。数据帧的每一列都是一个变量。
我将其简化了一点,数据框中只有两列。
render_letter <- function(...) {
my_variables <- list(...)
my_variables |>
purrr::imap(
\(x, y) rmarkdown::pandoc_metadata_arg(y, x)
) |> unname() |> unlist() -> my_metadata
quarto::quarto_render(
input = "path/to/qmd/file.qmd",
output_file = paste0(my_metadata$name, ".pdf"),
pandoc_args = my_metadata
)
}
letter_data <- tibble::tribble(
~name, ~surname,
"John", "Doe",
"Jane", "Doe"
)
letter_data |>
purrr::pwalk(render_letter)
---
title: "Untitled"
format:
pdf:
include-in-header:
text: |
\usepackage{scrlayer-scrpage}
\rohead{\myname}
\lofoot{\mysurname}
engine: knitr
params:
name: NULL
surname: NULL
---
# Chapter ONE
Inline vector values: `{r} paste(params$name, params$surname, collapse = ", ")`
\newcommand{\myname}{`{r} params$name`}
\newcommand{\mysurname}{`{r} params$surname`}
\newpage
# Chapter TWO
letter_data <- tibble::tribble(
~name, ~surname,
"John", "Doe",
"Jane", "Doe"
)
letter_data |>
purrr::pmap(function(...){
vars <- list(...)
quarto::quarto_render(
input = "file.qmd",
output_file = paste0(vars["name"], ".pdf"),
execute_params = vars
)
})