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