knitr / rmarkdown / Latex: come fare il cross-reference di figure e tabelle?

Sto cercando di fare riferimenti incrociati su figure e tabelle in un PDF prodotto con knitr / rmarkdown. Ci sono alcune domande su SO e tex.stackexchange ( qui e qui , per esempio), che suggeriscono che il modo per farlo inline è aggiungere \ref{fig:my_fig} , dove my_fig è l’etichetta del blocco. Tuttavia, quando provo nel mio documento rmarkdown , ottengo ?? dove dovrebbe essere il numero della figura. Mi piacerebbe scoprire come far funzionare correttamente i riferimenti incrociati.

Un esempio riproducibile è qui sotto. Ci sono due file: il file rmarkdown più un file header.tex che ho incluso nel caso in cui influenzi la risposta (anche se ho lo stesso problema se header.tex o meno il file header.tex ).

Nel file rmarkdown ci sono tre esempi di riferimenti incrociati. L’Esempio 1 è una figura per la quale il cross-referencing fallisce (viene visualizzato invece il numero della figura). C’è anche un secondo tentativo commentato (basato su questa risposta SO ), in cui provo ad impostare l’ambiente figura, l’etichetta e la didascalia con il markup in latex prima e dopo il blocco, ma questo si traduce in un errore pandoc quando provo a lavorare a maglia il documento. L’errore è:

 ! Missing $ inserted.  $ l.108 ![](testCrossRef_ 

L’esempio 2 utilizza lavori xtable e di riferimento incrociato. L’esempio 3 utilizza kable e i riferimenti incrociati falliscono.

Una schermata dell’output PDF è inclusa in fondo a questo post.

rmarkdown file

 --- 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) ```         # 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 file

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

Output PDF

inserisci la descrizione dell'immagine qui

È ansible utilizzare il formato di output bookdown::pdf_document2 anziché pdf_document e la syntax per il riferimento a una figura è \@ref(fig:chunk-label) ; vedere la documentazione per i dettagli: https://bookdown.org/yihui/bookdown/figures.html

Di seguito non riesco a generare \ label {fig: mwe-plot} con knitr , aggiungendo \label{...} agli argomenti della didascalia produrranno etichette nel file tex sottostante, cioè

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

e

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