在 Quarto / RMarkdown PDF 中的页眉和页脚中包含参数?

问题描述 投票:0回答:4

有谁知道是否可以在渲染为 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 的页眉/页脚中插入唯一的名称。

pdf header latex r-markdown quarto
4个回答
4
投票

此处提供了出色的解决方案 - 让页眉/页脚引用宏,您稍后将在文档中定义该宏:

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

2
投票
一种可能的解决方案是使用

Latex Template Partials 和 pandoc 变量。

这里我使用了

title.tex

 模板部分,因为其中的所有内容都将附加在 \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$}
    

1
投票
我以前遇到过这个问题,我可以通过将我想在 pandoc 部分中使用的变量作为

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)
    

0
投票
Pascal 和 jhelvy 答案的更新/合并:

--- 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
  )
})
    
© www.soinside.com 2019 - 2024. All rights reserved.