[英]Cross-referencing a table or figure in rmarkdown in the caption of another figure or table
I am producing a rmarkdown document, knitting to PDF and have a figure (figure 1) and a table (table 1) where the table explains the figure in more detail.我正在制作一个 rmarkdown 文档,编织到 PDF 并有一个图(图 1)和一个表(表 1),其中表更详细地解释了该图。 I have no issue giving either of them a standard caption but I would like to change the table caption to be "Explanation of Figure 1".我没有问题给他们中的任何一个提供标准标题,但我想将表格标题更改为“图 1 的解释”。 Is there any way of doing this?有什么办法吗?
The code chunks are listed below, please let me know if I need to provide more information:下面列出了代码块,如果我需要提供更多信息,请告诉我:
YAML: YAML:
- \usepackage{caption} #and several others
output:
bookdown::pdf_document2:
keep_tex: no
latex_engine: xelatex
Code Chunks: Figure 1:代码块:图 1:
```{r figure-1, fig.cap="Figure"}
ggplot()
```
Table 1:表格1:
```{r table, fig.cap="Explanation of Figure \@ref(fig:figure-1)"}
knitr
kableExtra::kable(caption = "Explanation of Figure \@ref(fig:figure-1)")
```
The main error message with one backslash is "Error: '@' is an unrecognized escape in character string" and suggests I forgot to quote character options, which is not true.带有一个反斜杠的主要错误消息是“错误:‘@’是字符串中无法识别的转义符”,并暗示我忘记引用字符选项,这是不正确的。
With two backslashes the document knits but produces the caption "Explanation of Figure reffig:table"使用两个反斜杠,文档编织但会生成标题“图 reffig 的解释:表”
3 backslashes: the same error as with 1. 3 个反斜杠:与 1 相同的错误。
4 backslashes: the error is "pandoc-citeproc: reference ref not found. : Package caption Error. \caption outside float." 4 个反斜杠:错误是“pandoc-citeproc:未找到引用 ref。:Package 标题错误。\caption outside float。”
Appreciate any suggestions!感谢任何建议!
Just a workaround, but may helps.只是一种解决方法,但可能会有所帮助。 The \\@ref(fig:xxx)
option works well when knitting to a html_document2
. \\@ref(fig:xxx)
选项在编织到html_document2
时效果很好。 To me pdf - creation worked fine when using pandoc
in the terminal.对我来说 pdf - 在终端中使用pandoc
时创建工作正常。 Eg:例如:
---
title: "Cross ref"
output:
bookdown::html_document2:
collapsed: no
theme: readable
toc: yes
link-citations: yes
---
```{r firstplot, fig.cap = "A plot with points." }
library(ggplot2)
plot_A = ggplot(data = data.frame(x = c(1:10),
y = seq(3, 8, length.out = 10)),
aes(x = x, y =y))+
geom_point()
plot_A
```
Now a second plot with a reference to Fig.: \@ref(fig:firstplot).
```{r secondplot, fig.cap = "This is the same as Fig.: \\@ref(fig:firstplot)
but now with a red line." }
library(ggplot2)
plot_A + geom_line(alpha = .75,col = "red")
```
after knitting just move to the folder containing the html and using pandoc
编织后只需移动到包含 html 并使用pandoc
的文件夹
pandoc mini_ex-crossref.html -o mini_ex.pdf
I tried many different approaches text references , chunk captions, caption argument in the kable function and I´m sure there is a clever solution somewhere, so here is just a workaround with pure Latex.我尝试了许多不同的方法文本引用、块标题、kable function 中的标题参数,我确信某处有一个聪明的解决方案,所以这里只是一个纯 Latex 的解决方法。
Add a latex chunk with a label
before the chunk with the figure:在带有图的块之前添加一个带有label
的 latex 块:
```{=latex}
\begin{figure}
\caption{Figure 1}
\label{Fig-1}
```
```{r figure-1, echo = FALSE}
ggplot(mtcars) +
geom_point(aes(cyl, gear))
```
```{=latex}
\end{figure}
```
Now you can refer to Fig-1
in your latex-caption for the table with normal latex code \ref{Fig-1}
:现在您可以参考您的乳胶标题中的Fig-1
以获取具有正常 latex 代码\ref{Fig-1}
的表格:
```{=latex}
\begin{table}
\caption{Explanation of Figure \ref{Fig-1}}
```
```{r table}
kableExtra::kable(x = mtcars)
```
```{=latex}
\end{table}
```
Notes: * In my opinion this is just a workaround.注意: * 在我看来,这只是一种解决方法。 * It´s not possible to use the chunk option fig.cap = ""
and the latex code in parallel * 不能同时使用块选项fig.cap = ""
和 latex 代码
J_F referenced Yihui Xie's excellent explanation of using text references in RMarkdown ( https://bookdown.org/yihui/bookdown/markdown-extensions-by-bookdown.html#text-references ), which you can use for figure and table captions that require more complicated things than plain text (eg, formatting, cross-references, etc.). J_F 引用了 Yihui Xie 关于在 RMarkdown 中使用文本引用的精彩解释( https://bookdown.org/yihui/bookdown/markdown-extensions-by-bookdown.html#text-references ),您可以将其用于图形和表格标题需要比纯文本更复杂的东西(例如,格式化、交叉引用等)。 This may be a more flexible solution overall than remembering to escape the backslash in Robert's answer, and does not require a workaround with LaTeX.这可能是一个比记住在 Robert 的回答中转义反斜杠更灵活的解决方案,并且不需要使用 LaTeX 的解决方法。
As Yihui explains, all you need to do is define a text reference on a single line in markdown and reference that in the chunk option "fig.cap" or the "caption" parameter in knitr::kable()
.正如 Yihui 解释的那样,您需要做的就是在 markdown 中的一行中定义一个文本引用,并在knitr::kable()
的块选项“fig.cap”或“caption”参数中引用它。 Just be careful to make sure that each text reference is one paragraph that does not end in a white space.请注意确保每个文本引用都是一个不以空格结尾的段落。
Here's a basic example.这是一个基本示例。
---
title: "Cross-referencing figures and tables within captions."
output: bookdown::pdf_document2
editor_options:
chunk_output_type: console
---
```{r load-packages}
library(knitr)
library(flextable)
```
(ref:first-fig-caption) Here's a complicated figure caption for the first figure, which can include complicated text styling like $m^2$ and references to other elements in the document, like Table \@ref(tab:mtcars) or Fig. \@ref(fig:cars).
```{r pressure, fig.cap = '(ref:first-fig-caption)'}
plot(pressure)
```
(ref:second-fig-caption) Here's a second complicated figure caption, also referencing Table \@ref(tab:mtcars).
```{r cars, fig.cap = '(ref:second-fig-caption)'}
plot(cars)
```
(ref:caption-table1) A caption for the first table. Check out this cross reference to Fig. \@ref(fig:pressure).
```{r mtcars}
mtcars |>
head() |>
kable(caption = '(ref:caption-table1)')
```
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.