web-dev-qa-db-fra.com

knitr/rmarkdown/Latex: Comment référencer des figures et des tableaux?

J'essaie de croiser les chiffres et les tableaux dans un PDF produit avec knitr/rmarkdown. Il y a quelques questions sur SO et tex.stackexchange ( ici et ici , par exemple), qui suggèrent que la façon de le faire en ligne consiste à ajouter \ref{fig:my_fig}, où my_fig est le libellé du bloc. . Cependant, lorsque j'essaie cela dans mon document rmarkdown, j'obtiens ?? où le chiffre doit être. J'aimerais savoir comment faire en sorte que les renvois croisés fonctionnent correctement. 

Un exemple reproductible est ci-dessous. Il y a deux fichiers: le fichier rmarkdown et un fichier header.tex que j'ai inclus au cas où cela aurait une incidence sur la réponse (bien que le même problème existe si j'inclus le fichier header.tex ou non).

Le fichier rmarkdown contient trois exemples de références croisées. L'exemple 1 est une figure pour laquelle les références croisées échouent (?? s'affiche à la place du numéro de la figure). Il existe également une deuxième tentative commentée (basée sur cette SO réponse ), où je tente de définir l’environnement de la figure, le libellé et la légende avec le balisage latex avant et après le bloc, mais cela entraîne une erreur pandoc lorsque j'essaie de tricoter le document. L'erreur est:

! Missing $ inserted.
<inserted text> 
                $
l.108 ![](testCrossRef_

L'exemple 2 utilise xtable et des travaux de références croisées. L'exemple 3 utilise kable et les références croisées échouent.

Une capture d'écran de la sortie PDF est incluse au bas de cet article. 

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

fichier header.tex

% Caption on top
% https://tex.stackexchange.com/a/14862/4762
\usepackage{floatrow}
\floatsetup[figure]{capposition=top}
\floatsetup[table]{capposition=top}

Sortie PDF

 enter image description here

36
eipi10

Vous pouvez utiliser le format de sortie bookdown::pdf_document2 au lieu de pdf_document et la syntaxe pour référencer une figure est \@ref(fig:chunk-label); voir la documentation pour plus de détails: https://bookdown.org/yihui/bookdown/figures.html

24
Yihui Xie

Après je ne peux pas générer\label {fig: mwe-plot} avec knitr , ajouter \label{...} aux arguments de légende produira des étiquettes dans le fichier tex sous-jacent, c.-à-d.

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

et 

```{r tab2, echo=FALSE}
library(knitr)
kable(mtcars[1:3,1:4], caption="\\label{tab:tab2}A `kable` table")
```
21
Weihuang Wong

Vous pouvez essayer le captioner package. Vous pouvez trouver des exemples dans ce lien .

Dans mon cas, j'inclus un morceau de code avec:

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), "[^:]*")
}

J'inclus des légendes dans des tableaux et des figures lors de la définition de fragments de code, comme ceci:

```{r chunk_creating_one_figure, echo=FALSE, fig.cap=figure_captions("one_figure", "figure label")}
plot(1)
```

ou

```{r chunk_creating_one_table, echo=FALSE, fig.cap=table_captions("one_table", "table label")}
knitr::kable(data.frame(col="something"), format="markdown")
```

Les références sont incluses en tant que inline_text dans l'ensemble de Rmarkdown avec:

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