knitr / rmarkdown / Latex:如何交叉引用数字和表格?

时间:2016-08-09 21:54:09

标签: r latex knitr r-markdown cross-reference

我正在尝试交叉引用使用knitr / rmarkdown生成的PDF中的数字和表格。关于SO和tex.stackexchange(例如herehere)有一些问题,建议内联方式是添加\ref{fig:my_fig},其中my_fig是块标签。但是,当我在我的rmarkdown文档中尝试时,我会得到??图号应该是的地方。我想了解如何使交叉引用正常工作。

下面是一个可重现的例子。有两个文件:rmarkdown文件加上我已包含的header.tex文件以防它影响答案(尽管我是否包含header.tex文件或不是)。

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

pandoc

示例2使用! Missing $ inserted. <inserted text> $ l.108 ![](testCrossRef_ 和交叉引用工作。示例3使用xtable并且交叉引用失败。

PDF输出的屏幕截图包含在本文的底部。

kable档案

rmarkdown

--- title: | | My Title author: | | eipi10 | Department of Redundancy Department date: "`r format(Sys.time(), '%B %e, %Y')`" output: pdf_document: fig_caption: yes includes: in_header: header.tex keep_tex: yes fontsize: 11pt geometry: margin=1in graphics: yes --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = FALSE, message=FALSE, warning=FALSE, fig.height=2, fig.width=4) ``` # Example 1. Figure This is a report. Take a look at Figure \ref{fig:fig1}. ```{r fig1, echo=FALSE, fig.cap="This is a caption"} plot(mtcars$wt, mtcars$mpg) ``` <!-- Now, let's take a look at this other plot in Figure \ref{fig:fig2}. --> <!-- \begin{figure} --> <!-- ```{r fig2, echo=FALSE} --> <!-- plot(mtcars$cyl, mtcars$mpg) --> <!-- ``` --> <!-- \caption{This is another caption} --> <!-- \label{fig:fig2} --> <!-- \end{figure} --> # Example 2: `xtable` Some more text. See Table \ref{tab:tab1} below. ```{r echo=FALSE, results="asis"} library(xtable) print.xtable( xtable(mtcars[1:3,1:4], label="tab:tab1", caption="An xtable table"), comment=FALSE) ``` # Example 3: `kable` Some more text. See Table \ref{tab:tab2} below. ```{r tab2, echo=FALSE} library(knitr) kable(mtcars[1:3,1:4], caption="A `kable` table") ``` 档案

header.tex

PDF输出

enter image description here

3 个答案:

答案 0 :(得分:28)

您可以使用输出格式bookdown::pdf_document2代替pdf_document,引用数字的语法为\@ref(fig:chunk-label);有关详细信息,请参阅文档:https://bookdown.org/yihui/bookdown/figures.html

答案 1 :(得分:25)

关注I can't generate \label{fig:mwe-plot} with knitr,在标题参数中添加\label{...}会在基础tex文件中生成标签,即

```{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")
```

答案 2 :(得分:2)

您可以尝试使用captioner软件包。您可以在this link中找到示例。

在我的情况下,我在代码块中包含:

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")
```

在我的Rmarkdown中,引用都作为inline_text包含在内:

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