Search code examples
rlatexr-markdowntex

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. 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". 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:

- \usepackage{caption} #and several others

output:
  bookdown::pdf_document2:
    keep_tex: no
    latex_engine: xelatex

Code Chunks: Figure 1:

```{r figure-1, fig.cap="Figure"}
ggplot()
```

Table 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"

3 backslashes: the same error as with 1.

4 backslashes: the error is "pandoc-citeproc: reference ref not found. ! Package caption Error: \caption outside float."

Appreciate any suggestions!


Solution

  • 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.

    Add a latex chunk with a label before the chunk with the figure:

    ```{=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}:

    ```{=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