我使用类似于上面 Nicholas 发布的解决方案来解决交叉引用问题。我在一些项目中使用 bookdown,但我发现在我只想简单交叉引用的其他项目中使用它很尴尬。
我在使用 rmarkdown 撰写论文时使用以下内容,并且我希望它以标准格式提交给期刊。最后我想要一个图例,然后是表格,然后我会有表格和数字。在我写作的时候,我只是粗略地知道这些数字在文本中的引用顺序。我只想用 fig:foobar 之类的文本代码引用它们,并在文本中根据外观分配数字。当我查看图形图例列表时,我会看到放置图例的顺序,并会根据需要移动图例。
这是我的结构。
我有一个 R 包,里面有我需要的东西,比如各种参考书目和辅助 R 函数。在那个包中,我有以下函数,它使用在主 Rmd 环境中定义的一些变量: .rmdenvir 和 .rmdctr 。
ref <- function(useName) {
require(stringr)
if(!exists(".refctr")) .refctr <- c(`_` = 0)
if(any(names(.refctr)==useName)) return(.refctr[useName])
type=str_split(useName,":")[[1]][1]
nObj <- sum(str_detect(names(.refctr),type))
useNum <- nObj + 1
newrefctr <- c(.refctr, useNum)
names(newrefctr)[length(.refctr) + 1] <- useName
assign(".refctr", newrefctr, envir=.rmdenvir)
return(useNum)
}
它假定我用 cntname:foo 之类的名称来命名我想要引用的东西,例如 fig:foo。它为每个计数器制作了一个新计数器,如果需要,我可以即时(在写作时)制作新的计数器。
在我的主 Rmd 文件中,我有一些设置行:
```{r setup_main}
require(myPackageforPapers)
# here is where the variables needed by ref() are defined.
.rmdenvir = environment()
.refctr <- c(`_` = 0)
````
在正文中我使用以下内容
You can see what I am trying to show in Figure `r ref("fig:foo")`
and you can see it also in Tables `r ref("tab:foo")`
and A`r ref("tabappA:foobig")`.
获得“您可以在图 1 中看到我想要展示的内容,并且您也可以在表 1 和 A1 中看到它。”虽然数字可能不是 1;要使用的数字将动态确定。第一次引用图形、表格或任何我计算的东西时,我不必使用特殊功能。 ref() 通过查看标签是否已经存在来解决这个问题。如果不是,它分配下一个数字,并返回它。所以你不必在一个地方使用“label”而在另一个地方使用“ref”。
在写作过程中,我可能会认为附录 A 太大了,我会将一些表格拆分为附录 B。我需要做的就是将上面的内容更改为
You can see what I am trying to show in Figure `r ref("fig:foo")`
and you can see it also in Tables `r ref("tab:foo")`
and B`r ref("tabappB:foobig")`.
我只是指定了一个新的计数器名称“tabappB”,其数字是动态确定的。
在我的 Rmd 文件的末尾,我有一个看起来像的图形列表
# Figure Legends
Figure `r ref("fig:foo")`. This is the legend for this figure.
Figure `r ref("fig:foo2")`. This is the legend for another figure.
然后我的表格看起来像这样
```{r print-tablefoo, echo=FALSE}
tablefoo=mtcars
thecap = "Tables appear with a legend while figures do not."
fullcap = paste("Table ", ref("tab:foo"), ". ", thecap, sep="")
kable(tablefoo, caption=fullcap)
```
然后是这样的数字:
```{r fig-foo, echo=FALSE, fig.cap=paste("Figure",ref("fig:foo"))}
plot(1,1)
```
附录 A 是作为子项包含的 Rmd 文件。它会有像
这样的表格
```{r print-tableAfoo, echo=FALSE}
tablefoo=mtcars
thecap = "This is a legend."
fullcap = paste("Table A", ref("tabappA:foobig"), ". ", thecap, sep="")
kable(tablefoo, caption=fullcap)
```
我确实必须添加“A”才能获得表 A1,但我发现如果 R 在标记我的计数器方面对我没有太多考虑,我会发现它会更容易。我只是希望它返回正确的数字。
交叉引用适用于 html、pdf/latex 或 word。我很乐意坚持使用乳胶解决方案,但我的合著者使用 word,所以我需要一个适用于 pandoc 和 word 的解决方案。此外,有时我想要 html 或其他一些输出,我需要一个适用于任何与 rmarkdown 一起使用的输出的解决方案。