如何将rmarkdown::render传入的参数传递到before_body指定的.tex文件
实现方案
有两种常用的落地方式,第一种操作成本最低:
方法1:通过LaTeX全局命令传递参数(推荐)
原理是在Rmd中先把R层的参数渲染成LaTeX全局命令,再在title.tex中直接调用命令即可:
- 步骤1:在Rmd文档的YAML头结束后、正文内容开始前,添加如下原始LaTeX代码块,把params参数转换为LaTeX可识别的全局命令:
```{=latex} % 定义全局命令存储传入的参数 \newcommand{\personone}{`r params$person1`} \newcommand{\persontwo}{`r params$person2`}如果参数中包含下划线、&、%等LaTeX特殊字符,建议加转义处理,避免编译报错: ```r ```{=latex} \newcommand{\personone}{`r knitr::latex_expr(params$person1)`} \newcommand{\persontwo}{`r knitr::latex_expr(params$person2)`} - 步骤2:修改
title.tex中的引用格式,直接调用上面定义的命令即可:\vspace{15pt}\hspace{15pt}\large [\personone] \par \vspace{15pt}\hspace{15pt}\large [\persontwo] \par
这个方法不需要修改现有渲染逻辑,也不用调整YAML配置,兼容性最好。
方法2:动态生成title.tex文件
如果需要传递的参数较多,可以先做模板再动态替换:
- 步骤1:新建
title.template.tex作为模板,内容里用占位符标记参数位置:\vspace{15pt}\hspace{15pt}\large [{{person1}}] \par \vspace{15pt}\hspace{15pt}\large [{{person2}}] \par - 步骤2:渲染Rmd前先读取模板,替换占位符生成最终的
title.tex,再调用rmarkdown::render:# 定义参数 params <- list(person1 = "John Doe, JD", person2 = "Charlie P. Adams, CPA") # 读取模板替换占位符 template <- readLines("title.template.tex", encoding = "UTF-8") template <- gsub("\\{\\{person1\\}\\}", params$person1, template) template <- gsub("\\{\\{person2\\}\\}", params$person2, template) # 输出最终的title.tex writeLines(template, "title.tex") # 渲染文档 rmarkdown::render("MyDocument.Rmd", params = params)
同样如果参数有特殊LaTeX字符,替换前先做转义处理即可。
内容的提问来源于stack exchange,提问作者bikeactuary
相关产品推荐
相关产品推荐

