wake-up-neo.com

knitr/rmarkdown/Latex: Wie kann man Zahlen und Tabellen miteinander vergleichen?

Ich versuche, Zahlen und Tabellen in einem mit knitr/rmarkdown erstellten PDF zu referenzieren. Es gibt einige Fragen zu SO und tex.stackexchange ( hier und hier zum Beispiel), die darauf hinweisen, dass der Weg für diese Inline das Hinzufügen von \ref{fig:my_fig} ist, wobei my_fig das Chunk-Label ist . Wenn ich das jedoch in meinem rmarkdown-Dokument versuche, erhalte ich ??, wo die Bildnummer sein sollte. Ich möchte herausfinden, wie man Querverweise auf die korrekte Arbeitsweise bringt. 

Ein reproduzierbares Beispiel ist unten. Es gibt zwei Dateien: die rmarkdown-Datei plus eine header.tex-Datei, die ich hinzugefügt habe, nur für den Fall, dass sie die Antwort beeinflusst (obwohl ich das gleiche Problem habe, ob ich die header.tex-Datei einbeziehe oder nicht).

In der Datei rmarkdown gibt es drei Querverweisbeispiele. Beispiel 1 ist eine Abbildung, für die die Querverweise fehlschlagen (?? wird anstelle der Abbildungsnummer angezeigt). Es gibt auch einen zweiten, auskommentierten Versuch (basierend auf dieser SO Antwort ), bei dem ich versuche, die Umgebung, das Label und die Beschriftung der Figur mit latex vor und nach dem Block einzustellen, dies führt jedoch dazu Eine pandoc-Fehlermeldung, wenn ich versuche, das Dokument zu stricken. Der Fehler ist:

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

In Beispiel 2 werden xtable und Querverweise verwendet. In Beispiel 3 wird kable verwendet, und die Querverweise schlagen fehl.

Einen Screenshot der Ausgabe von PDF finden Sie am Ende dieses Beitrags. 

rmarkdown Datei

---
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 datei

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

PDF-Ausgabe

 enter image description here

36
eipi10

Sie können das Ausgabeformat bookdown::pdf_document2 anstelle von pdf_document verwenden. Die Syntax für das Referenzieren einer Abbildung lautet \@ref(fig:chunk-label); Weitere Informationen finden Sie in der Dokumentation: https://bookdown.org/yihui/bookdown/figures.html

24
Yihui Xie

Nach kann ich\label {fig: mwe-plot} mit knitr nicht generieren, durch Hinzufügen von \label{...} zu den Caption-Argumenten werden Labels in der zugrunde liegenden tex-Datei erzeugt, d.

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

und 

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

Sie können das Paket captioner ausprobieren. Beispiele finden Sie unter diesem Link .

In meinem Fall füge ich einen Code-Block hinzu mit:

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

Ich füge bei der Definition von Codeabschnitten Bildunterschriften in Tabellen und Abbildungen ein:

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

oder

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

Referenzen sind als Inline-Text in meinem gesamten Rmarkdown enthalten:

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