web-dev-qa-db-fra.com

Position de la figure dans le démarque lors de la conversion en PDF avec knitr et pandoc

J'essaie de contrôler la position d'un tracé lors de la conversion en PDF en utilisant knitr et pandoc. Mon fichier .Rmd ressemble à ceci:

# My report

Some text some text some text some text some text some text some text some text some text


```{r myplot, echo=FALSE, fig.pos="placeHere", results='hide'}

library(ggplot2)

ggplot(mtcars, aes(mpg, drat)) + geom_point()

```

Some text some text some text some text some text some text some text some text some text

\usepackage{graphicx}
\begin{figure}[placeHere]
  \centering
    \includegraphics[width=0.5\textwidth]{placeHere}
\end{figure}

Some text some text some text some text some text some text some text some text some text

Je convertis en PDF en utilisant les fonctions fournies ici: http://quantifyingmemory.blogspot.co.uk/2013/02/reproducible-research-with-r-knitr .html

Comment puis-je placer l'intrigue entre les deuxième et troisième blocs de texte? Le code latex ne fonctionne pas tel qu'il est actuellement.

EDIT: C'est ce que j'essaie maintenant.

# My report

   ```{r setup, include=FALSE}
# set global chunk options
opts_chunk$set(cache=FALSE)
library(ggplot2)
```

```{r, echo=FALSE, fig.height=3}

ggplot(mtcars, aes(disp, hp)) + geom_point()


```



Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 

Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


```{r, echo=FALSE, fig.height=3}



ggplot(mtcars, aes(vs, am)) + geom_point()


```



Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 

Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


```{r, echo=FALSE, fig.height=6}



ggplot(mtcars, aes(disp, cyl)) + geom_point()

```


```{r, echo=FALSE, fig.height=6}

ggplot(mtcars, aes(hp, qsec)) + geom_point()


```


Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 




```{r, echo=FALSE, fig.height=3}

ggplot(mtcars, aes(hp, wt)) + geom_point()

```



Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 



```{r, echo=FALSE, fig.height=5}

ggplot(mtcars, aes(mpg, drat)) + geom_point()

```




Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 
32
luciano

Je ne suis pas au courant d'une telle option pour pandoc pour définir l'option flottante des chiffres lors de la conversion d'un document Markdown en LaTeX. Si vous choisissez Markdown pour sa simplicité, vous ne devriez pas en attendre trop de puissance, même avec des outils puissants comme pandoc. Bottom line: Markdown n'est pas LaTeX . Il a été conçu pour HTML au lieu de LaTeX.

Deux façons de procéder:

  1. utiliser la syntaxe Rnw (R + LaTeX) au lieu de Rmd (R Markdown) ( exemples ); alors vous pourrez utiliser l'option de bloc fig.pos='H' après vous \usepackage{float} dans le préambule; dans ce cas, vous avez la pleine puissance de LaTeX, et pandoc ne sera pas impliqué

  2. pirater le document LaTeX généré par pandoc, par ex. quelque chose comme

    library(knitr)
    knit('foo.Rmd')  # gives foo.md
    pandoc('foo.md', format='latex')  # gives foo.tex
    x = readLines('foo.tex')
    # insert the float package
    x = sub('(\\\\begin\\{document\\})', '\\\\usepackage{float}\n\\1', x)
    # add the H option for all figures
    x = gsub('(\\\\begin\\{figure\\})', '\\1[H]', x)
    # write the processed tex file back
    writeLines(x, 'foo.tex')
    # compile to pdf
    tools::texi2pdf('foo.tex')  # gives foo.pdf
    

Si vous n'aimez pas ces solutions, pensez à demander une nouvelle fonctionnalité pour pandoc sur Github, puis asseyez-vous et attendez.

26
Yihui Xie

Je présente une solution alternative. Au lieu d'insérer des symboles [H] dans un document en latex de manière post-hoc, je suggère de redéfinir l'environnement de la figure pour ignorer tous les arguments de position et utiliser [H].

Pour ce faire, créez un fichier .tex dans le même répertoire que le fichier .Rmd qui redéfinit l'environnement de la figure et mettez à jour l'en-tête YAML dans le .Rmd pour inclure le fichier lors de la compilation.

Voici un exemple de fichier .tex:

\usepackage{float}
\let\origfigure\figure
\let\endorigfigure\endfigure
\renewenvironment{figure}[1][2] {
    \expandafter\origfigure\expandafter[H]
} {
    \endorigfigure
}

Voici l'exemple .Rmd qui l'inclut (en supposant que vous avez appelé le fichier .tex 'preamble-latex.tex'):

---
title: "example"
author: "you"
date: "`r format(Sys.time(), '%d %B %Y')`"
output:
  rmarkdown::pdf_document:
    fig_caption: yes        
    includes:  
      in_header: preamble-latex.tex
---

```{r, fig.cap='Markdownvellous!'}
plot(1:10, 1:10)
```
75
paleo13

J'utilise KnitR et markdown dans RSTUDIO, la solution pour mon cas est d'ajouter dans le préambule \usepackage{float}:

    ---
title: "Proyect 2"
author: "FV"
date: "2016-12-3"
output:
  pdf_document:
    fig_caption: yes
    fig_crop: no
    fig_height: 2
    fig_width: 3
    highlight: haddock
    keep_tex: yes
    number_sections: yes
    toc: yes
    toc_depth: 2
  html_document:
    fig_caption: yes
    theme: journal
    toc: yes
    toc_depth: 2
header-includes: 
- \usepackage{graphicx}
- \usepackage{float}
---

Et puis ajouter ces lignes de code (fig.pos = 'H') dans les toutes premières lignes:

```{r echo=FALSE,warning=FALSE}
 library(knitr)
  opts_chunk$set(fig.path='figure/graphics-', 
                 cache.path='cache/graphics-', 
                 fig.align='center',
                 external=TRUE,
                 echo=TRUE,
                 warning=FALSE,
                 fig.pos='H'
                )
  a4width<- 8.3
  a4height<- 11.7
```
11
Ferran VilBer

J'ai quelques projets où je convertis de .Rmd en .pdf (principalement une présentation de diapositives beamer) et je veux que les graphiques ne flottent pas (les figures flottantes ne fonctionnent vraiment pas avec les présentations de diapositives).

L'approche que j'utilise consiste à ajouter un espace échappé après la ligne dans le fichier .md. Cela signifie que le graphique est à l'intérieur d'un paragraphe plutôt que d'être un paragraphe propre, cela signifie que pandoc ne l'enveloppera pas dans un environnement de figure (cela signifie également que je ne peux pas utiliser de légende avec lui) et le place donc exactement cette position.

J'utilise un Makefile pour faire toutes les conversions pour moi, donc après avoir exécuté R et knitr, il exécutera automatiquement un script Perl (bien que cela puisse être fait en utilisant R ou d'autres outils) qui trouve où les tracés sont insérés et ajoute l'espace échappé à La fin de la ligne.

7
Greg Snow

Si ce que vous cherchez est de contrôler manuellement où placer vos chiffres, en utilisant cette page Web: http://www.rci.rutgers.edu/~ag978/litdata/figs/ , j'ai trouvé que si vous ajoutez une barre oblique inverse "\" quelque part après vos commandes de tracé, les tracés ne flotteront pas mais seront imprimés à leur emplacement actuel.

Si vous ne souhaitez que certains tracés apparaissent, vous pouvez modifier cette option pour chacun.

Dans votre exemple:

# My report

```{r setup, include=FALSE}
# set global chunk options
knitr::opts_chunk$set(cache=FALSE)

library(ggplot2)
```

Some text Some text Some text Some text Some text Some text Some text Some       text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 

```{r, echo=FALSE, fig.height=3}
ggplot(mtcars, aes(disp, hp)) + geom_point()
```
\

Some text Some text Some text Some text Some text Some text Some text Some       text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 

(etc)

6
Tamara vdD

Utiliser un crochet knitr

Je suis en quelque sorte tombé sur cette question et je veux ajouter une autre approche. Ici, je profite de la flexibilité impressionnante fournie par les crochets knitr. Je change simplement le crochet du tracé pour utiliser la fonction knitr hook_plot_tex(). Ensuite, je peux simplement utiliser l'option de bloc fig.pos comme nous en avons l'habitude dans les documents Rnw afin de positionner les environnements figure (fig.cap doit être défini pour invoquer l'environnement figure).

Cela fonctionne dans les exemples fournis par l'OP. Je suppose qu'ils fonctionnent également dans des exemples (en quelque sorte) plus compliqués. Pourquoi cela peut-il être fait aussi facilement et n'est pas la valeur par défaut pour les documents Rmd, je ne suis pas sûr. Peut-être que Yihui peut clarifier cela.

Voici le code:

---
title: "Example"
author: "Martin"
output: pdf_document
---

```{r}
knitr::knit_hooks$set(plot = function(x, options)  {
  hook_plot_tex(x, options)
})
```


```{r myplot, echo=FALSE, results='hide', fig.cap='Test', fig.pos='h'}
library(ggplot2)
ggplot(mtcars, aes(mpg, drat)) + geom_point()
```

Sans pour autant fig.pos='h', l'intrigue passe généralement à la deuxième page.

4
Martin Schmelzer

Est-ce ce que vous recherchez:

```{r setup, include=FALSE}
# set global chunk options
opts_chunk$set(cache=FALSE)
library(ggplot2)
```

# My report

Some text some text some text some text some text some text some text some text some text

Some text some text some text some text some text some text some text some text some text

```{r myplot, echo=FALSE}

ggplot(mtcars, aes(mpg, drat)) + geom_point()

```

Some text some text some text some text some text some text some text some text some text
0
Tyler Rinker

La solution n'est pas trop simple, peut-être que quelqu'un d'autre pourra la rationaliser.

Les étapes de base. (Windows 7)

  1. Vous pouvez ajouter l'argument fig.pos="H" Aux options knitr, globalement ou pour chaque bloc individuel. NOTEz le H. majuscule. Ceci demande au latex de placer les flotteurs des figures exactement où ils sont appelés dans le fichier Rmd.

  2. MAIS, cela nécessite que le package soit utilisé par latex, ce que vous pouvez spécifier dans le modèle que pandoc utilise pour construire des fichiers pdf. Pour ce faire, ajoutez la ligne \usepackage{float}

  3. MAIS, vous devez d'abord trouver le fichier de modèle actuel à modifier. Je n'ai pu trouver cela nulle part mais vous pouvez demander à pandoc d'imprimer le contenu du modèle sur la console avec cette commande: pandoc -D latex

  4. Coupez et collez ce code de modèle dans un fichier texte vide.

  5. Ajoutez la ligne: \usepackage{float}

  6. Enregistrez sous le nom de fichier "default.latex" Dans un répertoire tel que C:\Users\YOURNAME\pandoc\templates

  7. Ajoutez l'option --data-dir=C:/Users/YOURNAME/pandoc/templates" À votre appel à pandoc OR Pandoc.convert("my file.md", format="pdf", options=c("--data-dir=C:/Users/YOURNAME/pandoc/templates")) si vous utilisez pander dans R.

J'espère que cela fonctionne pour vous.

0
Andrew