将变量从 Rmd/YAML 标头传递到 before_body .tex

Posted

技术标签:

【中文标题】将变量从 Rmd/YAML 标头传递到 before_body .tex【英文标题】:Pass variables from Rmd/YAML header to before_body .tex 【发布时间】:2021-12-24 23:51:35 【问题描述】:

我有一个这样的 YAML 标头:

---
output:
  pdf_document:
    latex_engine: xelatex
    includes:
      in_header: "preamble.tex"
      before_body: "title.tex"
    keep_tex: yes
documentclass: report
classoption:
  - landscape
---

然后我通过调用rmarkdown::render() 来编写文档。

我想要的是这样称呼render()

rmarkdown::render("MyDocument.Rmd", params = list(
  person1 = "John Doe, JD",
  person2 = "Charlie P. Adams, CPA"
))

它们被传递到 Rmd 中,但随后被进一步下推到 title.tex(包含在 YAML 标头中),其中会发生这样的事情:

\vspace15pt\hspace15pt\large [$person1$] \par
\vspace15pt\hspace15pt\large [$person2$] \par

如何将字符串传递给 title.tex 以及如何在其中解析它?

【问题讨论】:

这有帮助吗:***.com/a/54746683/2777074 可能(我现在知道这是如何工作的),我真的很想避免将整个 .tex 放在标题中,因为它不是一个小文件。我确实编辑了 OP 以澄清我需要什么。抱歉,但实际上参数需要来自对 render() 的调用,在那里(可能)它们会转到 YAML 标头(或者可能不会),然后进一步到 title.tex。 也就是说,我知道如何将参数放入标题中。所以我可以按照我认为的这些思路拼凑出一个解决方案。如果有一种方法可以在不直接在 YAML 标头中包含 200 行乳胶的情况下做到这一点,那我会更喜欢…… 您是否尝试过与头文件相同的方法? 我有一个 title.tex 文件,而不是头文件。我只是尝试将它放在“before_body:”部分而不传递参数,但我收到一个错误,就像它需要一个文件一样:“资源路径中找不到文件 \begintitlepage 错误:pandoc 文档转换失败,错误 99” 【参考方案1】:

0

我认为不可能按照我目前要求的方式进行。所以我会用我想出的解决方法来回答:方法是将一些字符串存储在 title_template.tex 中 - 而不是 $person1$ 我选择了person1 作为更安全的使用模式。然后我像这样从 R 中 gsub 文件(改编自这个要点):

fin <- "title_template.tex"
fout <- "title.tex"
x <- readLines(fin)

y <- gsub( "`clientname`", "Really Big Client", x ) %>%
  gsub( "`groupname`", "Ministry of Silly Walks", .) %>%
  gsub( "`person1`", "John Doe, JD", . ) %>%
  gsub( "`person2`", "Charlie P. Adams, CPA", . )

cat(y, file=fout, sep="\n")

由于我需要在闪亮的应用程序中对事件执行此操作,我将把该代码放在一个 observeEvent() 中,替换字符串来自 ui 中的 textInput,并且将发生新文件的 gsub/write就在调用 rmarkdown::render(fout) 之前。每次一定会覆盖文件。

【讨论】:

以上是关于将变量从 Rmd/YAML 标头传递到 before_body .tex的主要内容,如果未能解决你的问题,请参考以下文章

将上下文从 Web 请求的控制器传递到数据库层

spring boot - 假装客户端发送基本授权标头|将 jwt 令牌从一个微服务传递到另一个微服务

如何使用 Ruby on Rails 将数据从控制器传递到模型?

如何将自定义标头从 mvc 项目发送到 Web api 项目?

我应该通过 HTTP 标头或将正文作为 JSON 传递到 REST Api 吗?

pytest使用parametrize将参数化变量传递到fixture