这是this的后续问题。我知道knitr生成的PDF中交叉引用数字和表格的规范方法是使用bookdown::pdf_document2
(详情here)。
这太棒了!但是假设我想将我的Rmd发送给没有安装 bookdown 的用户?如果在尚未安装 bookdown 的环境中编织,我如何确保文档呈现?我希望在一个Rmd文件中包含所有内容。该文档的消费者可能是之前很少或根本没有R经验的人,并且刚安装了R和RStudio但没有安装包。如果他们点击编织他们将获得带有交叉引用的PDF,我该如何确保?或者,如果Binder或类似提供了执行(或者,更好地,编译为PDF)Rmd文件的方法,就像使用Jupyter笔记本一样,我希望能够捆绑在Rmd文件本身中以自动方式呈现PDF所需的一切。
示例文档如下所示:
---
title: "Cross-refs test"
author: "Me"
date: "13 December 2017"
output:
bookdown::pdf_document2:
citation_package: natbib
fig_caption: yes
keep_tex: yes
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Title
\begin{equation}
f\left(k\right)=\binom{n}{k}p^k\left(1-p\right)^{n-k} \label{eq:binom}
\end{equation}
You may refer to it using `\@ref(eq:binom)`, e.g., see Equation \@ref(eq:binom).
因此,如果这个Rmd文件是由脑死僵尸或Binder编译下载并编织的,我怎样才能确保不会发生这种情况:
Error in loadNamespace(name) : there is no package called 'bookdown'
Calls: <Anonymous> ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted
我不能假设我的Rmd的消费者会知道在这种情况下该怎么做,也没有任何我无法控制的自动化过程从Rmd渲染PDF,它从某个地方的回购中获取(比如什么Binder确实。)
如果有 no 交叉引用,我可以指定pdf_document
作为输出格式,RStudio将读取YAML,如果 knitr 和没有安装rmarkdown ,会自动触发这些安装(用户/脑死僵尸只需点击“确定”接受安装),PDF就会被渲染。所以,如果缺少这两个包:没问题,至少在使用RStudio时。用户获取Rmd,安装R和Rstudio,编织Rmd,然后显示PDF。如果使用 bookdown 来进行交叉引用,则情况并非如此。
似乎在执行R代码之前解释了YAML,因此用于在文档(date: "`r Sys.time()`"
)中打印当前时间的this相同的逻辑不起作用。否则,我r install.packages("bookdown")
在这里。
那么,有没有一种方法可以在没有书签的情况下进行交叉引用,但是像书本一样简单,优雅,或者是否有某种触发knitr来安装bookdown,以便在遇到{{1}时渲染不会崩溃}?
基本上,我想要的是在针织PDF中进行交叉引用,只需极少的用户干预就可以实现 - “因为我的用户可能是一个脑死亡的僵尸或机器人。
我想避免硬编码交叉引用。而且我宁愿不使用LaTeX。如果可能的话,只需要纯粹的Markdown和一些knitr魔法。
答案 0 :(得分:2)
有几种方法可以:
避免技术问题的最简单方法是预先安装“在云端”上的所有内容,并让您的用户使用“云”。例如,您可以安装RStudio Server,并预安装构建文档所需的所有包。然后,您的所有用户都需要一个Web浏览器。如果你要求他们在他们的计算机上本地安装软件包,已经足够复杂来安装R,RStudio和LaTeX,我不相信他们会再安装一件事:{ {1}}。
如果他们必须在本地安装所有内容,并且命令install.packages('bookdown')
仍然是一个巨大的痛苦,那么你可以做的是创建一个启用了packrat的RStudio项目(或启用现有项目中的 packrat )。这应该确保当用户使用此项目时,所有必需的R包都可用。
有关我不希望将此功能向后移植到 rmarkdown 包的原因的更多背景信息,请参阅this Github issue。