knitr/rmarkdown/Latex:如何交叉参考图表?

knitr/rmarkdown/Latex:如何交叉参考图表?,r,latex,knitr,r-markdown,cross-reference,R,Latex,Knitr,R Markdown,Cross Reference,我正试图交叉引用knitr/rmarkdown生成的PDF中的图表。关于SO和tex.stackexchange(和,例如),有一些问题表明内联的方法是添加\ref{fig:my_fig},其中my_fig是块标签。然而,当我在我的r标记文档中尝试此操作时,我得到了??数字编号应该在哪里。我想了解如何使交叉引用正常工作 下面是一个可复制的示例。有两个文件:rmarkdown文件加上一个header.tex文件,以防它影响答案(尽管我在是否包含header.tex文件时遇到同样的问题) 在rmar

我正试图交叉引用knitr/rmarkdown生成的PDF中的图表。关于SO和tex.stackexchange(和,例如),有一些问题表明内联的方法是添加
\ref{fig:my_fig}
,其中
my_fig
是块标签。然而,当我在我的
r标记
文档中尝试此操作时,我得到了
??
数字编号应该在哪里。我想了解如何使交叉引用正常工作

下面是一个可复制的示例。有两个文件:
rmarkdown
文件加上一个
header.tex
文件,以防它影响答案(尽管我在是否包含
header.tex
文件时遇到同样的问题)

rmarkdown
文件中,有三个交叉引用示例。示例1是交叉引用失败的图形(
??
显示,而不是图形编号)。还有第二个注释掉的尝试(基于),我尝试在区块前后使用
latex
标记设置图形环境、标签和标题,但这会在我尝试编织文档时导致
pandoc
错误。错误是:

header.tex
文件 PDF输出

接下来,将
\label{…}
添加到标题参数将在底层
tex
文件中生成标签,即

```{r fig1, echo=FALSE, fig.cap="\\label{fig:fig1}This is a caption"}
plot(mtcars$wt, mtcars$mpg)
```


您可以使用输出格式
bookdown::pdf\u document2
而不是
pdf\u document
,引用图形的语法是
\@ref(图:块标签)
;有关详细信息,请参阅文档:

您可以试用该软件包。您可以在中找到示例

在我的例子中,我包含一个代码块,其中包含:

table_captions <- captioner::captioner(prefix="Tab.")
figure_captions <- captioner::captioner(prefix="Fig.")

t.ref <- function(label){
  stringr::str_extract(table_captions(label), "[^:]*")
}

f.ref <- function(label){
  stringr::str_extract(figure_captions(label), "[^:]*")
}

参考作为内联文本包含在我的Rmarkdown中,包括:

As shown in figure `r f.ref("one_figure")`
Data is shown on table `r t.ref("one_table")`

此问题似乎已在此处讨论:。硬编码
{r fig1,echo=FALSE,fig.cap=“\\label{fig:fig1}这是一个标题”}
似乎可以工作。@易慧,既然这是基于a的,这仍然是最先进的,还是现在有更好的方法来做这件事?现在有更好的方法了。简而言之,使用
bookdown::pdf_document2
而不是
pdf_document
;请参阅是否有与自定义
r标记
格式兼容的方法,例如从
rticles
模板执行此操作?@cboettig是。也许我说得不够清楚:您可以将
base\u format
更改为任何软件包中的任何输出格式函数。对于与pdf_document2正确显示的图形,交叉引用显示为“?”当输出格式更改为tufte_book2.FYI时,似乎无法更改bookdown::pdf_document2的基本格式,但应该使用bookdown::pdf_book…我不知道如何在
rmarkdown
文件上使用
pdf_document2
格式?我只知道如何将它与
render\u book
一起使用。将
bookdown::pdf_document2
添加到YAML前端后,“knit to pdf_document2”选项将出现在RStudio中,但我不知道如何从命令行执行。
```{r fig1, echo=FALSE, fig.cap="\\label{fig:fig1}This is a caption"}
plot(mtcars$wt, mtcars$mpg)
```
```{r tab2, echo=FALSE}
library(knitr)
kable(mtcars[1:3,1:4], caption="\\label{tab:tab2}A `kable` table")
```
table_captions <- captioner::captioner(prefix="Tab.")
figure_captions <- captioner::captioner(prefix="Fig.")

t.ref <- function(label){
  stringr::str_extract(table_captions(label), "[^:]*")
}

f.ref <- function(label){
  stringr::str_extract(figure_captions(label), "[^:]*")
}
```{r chunk_creating_one_figure, echo=FALSE, fig.cap=figure_captions("one_figure", "figure label")}
plot(1)
```
```{r chunk_creating_one_table, echo=FALSE, fig.cap=table_captions("one_table", "table label")}
knitr::kable(data.frame(col="something"), format="markdown")
```
As shown in figure `r f.ref("one_figure")`
Data is shown on table `r t.ref("one_table")`