knitr/rmarkdown/Latex: 如何cross-reference 图表?
knitr/rmarkdown/Latex: How to cross-reference figures and tables?
我正在尝试 cross-reference 使用 knitr/rmarkdown 生成的 PDF 中的图形和表格。有一些关于 SO 和 tex.stackexchange(例如 here and )的问题,建议内联的方法是添加 \ref{fig:my_fig}
,其中 my_fig
是块标签.但是,当我在我的 rmarkdown
文档中尝试这样做时,我得到 ??
数字应该在的位置。我想了解如何让 cross-referencing 正常工作。
下面是一个可重现的例子。有两个文件:rmarkdown
文件加上我包含的 header.tex
文件,以防它影响答案(尽管我有同样的问题,无论我包含 header.tex
文件还是不是)。
在 rmarkdown
文件中有三个 cross-reference 示例。示例 1 是 cross-referencing 失败的图形(显示 ??
而不是图形编号)。还有第二个 commented-out 尝试(基于 this SO answer),我尝试在块前后使用 latex
标记设置图形环境、标签和标题,但这会导致当我尝试编织文档时出现 pandoc
错误。错误是:
! Missing $ inserted.
<inserted text>
$
l.108 ![](testCrossRef_
示例 2 使用 xtable
和 cross-referencing 有效。示例 3 使用 kable
和 cross-referencing 失败。
PDF 输出的屏幕截图包含在此 post 的底部。
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
文件
% Caption on top
% https://tex.stackexchange.com/a/14862/4762
\usepackage{floatrow}
\floatsetup[figure]{capposition=top}
\floatsetup[table]{capposition=top}
PDF 输出
在 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")
```
您可以使用输出格式bookdown::pdf_document2
代替pdf_document
,引用图形的语法是\@ref(fig:chunk-label)
;有关详细信息,请参阅文档:https://bookdown.org/yihui/bookdown/figures.html
你可以试试captioner package. You can find examples in 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")`
经过大量搜索,我偶然发现了一个似乎有效的解决方案 (link for this approach),尽管我从未在任何 bookdown 标准参考文献中找到它(我会继续寻找)。在 .rmd 文件中创建绘图的块上方,将标题定义为字符串,此处称为“crossref2”,并以正常方式 \@ref(fig:myChunkLabel)
将图引用放入字符串中。不需要引号。这是一个示例,其中 Fig207 是所引用图形的块标签:
(ref:crossref2) Variations on boxplot using data from Figure \@ref(fig:Fig207) a) plain violin plot, b) enchanced violin plot, c) add outliers, d) Beeswarm plot
然后在图块header中你想让Fig207包含在标题中,图标题写成
fig.cap='(ref:crossref2)'
这样做之后,连接到 ref(fig:Fig207) 的图编号在标题中很好地显示了。
请注意,相同的过程允许您通过将 \@ref(fig:Fig207)
替换为 [@bibref]
来将参考书目放入图形标题中,其中 bibref 是在您的 .bib 文件中定义的参考关键字文献引用。
我正在尝试 cross-reference 使用 knitr/rmarkdown 生成的 PDF 中的图形和表格。有一些关于 SO 和 tex.stackexchange(例如 here and \ref{fig:my_fig}
,其中 my_fig
是块标签.但是,当我在我的 rmarkdown
文档中尝试这样做时,我得到 ??
数字应该在的位置。我想了解如何让 cross-referencing 正常工作。
下面是一个可重现的例子。有两个文件:rmarkdown
文件加上我包含的 header.tex
文件,以防它影响答案(尽管我有同样的问题,无论我包含 header.tex
文件还是不是)。
在 rmarkdown
文件中有三个 cross-reference 示例。示例 1 是 cross-referencing 失败的图形(显示 ??
而不是图形编号)。还有第二个 commented-out 尝试(基于 this SO answer),我尝试在块前后使用 latex
标记设置图形环境、标签和标题,但这会导致当我尝试编织文档时出现 pandoc
错误。错误是:
! Missing $ inserted. <inserted text> $ l.108 ![](testCrossRef_
示例 2 使用 xtable
和 cross-referencing 有效。示例 3 使用 kable
和 cross-referencing 失败。
PDF 输出的屏幕截图包含在此 post 的底部。
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
文件
% Caption on top
% https://tex.stackexchange.com/a/14862/4762
\usepackage{floatrow}
\floatsetup[figure]{capposition=top}
\floatsetup[table]{capposition=top}
PDF 输出
在 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")
```
您可以使用输出格式bookdown::pdf_document2
代替pdf_document
,引用图形的语法是\@ref(fig:chunk-label)
;有关详细信息,请参阅文档:https://bookdown.org/yihui/bookdown/figures.html
你可以试试captioner package. You can find examples in 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")`
经过大量搜索,我偶然发现了一个似乎有效的解决方案 (link for this approach),尽管我从未在任何 bookdown 标准参考文献中找到它(我会继续寻找)。在 .rmd 文件中创建绘图的块上方,将标题定义为字符串,此处称为“crossref2”,并以正常方式 \@ref(fig:myChunkLabel)
将图引用放入字符串中。不需要引号。这是一个示例,其中 Fig207 是所引用图形的块标签:
(ref:crossref2) Variations on boxplot using data from Figure \@ref(fig:Fig207) a) plain violin plot, b) enchanced violin plot, c) add outliers, d) Beeswarm plot
然后在图块header中你想让Fig207包含在标题中,图标题写成
fig.cap='(ref:crossref2)'
这样做之后,连接到 ref(fig:Fig207) 的图编号在标题中很好地显示了。
请注意,相同的过程允许您通过将 \@ref(fig:Fig207)
替换为 [@bibref]
来将参考书目放入图形标题中,其中 bibref 是在您的 .bib 文件中定义的参考关键字文献引用。