Position de la Figure dans le markdown lors de la conversion en PDF avec knitr et pandoc

j'essaie de contrôler la position d'une parcelle lors de la conversion en PDF en utilisant knitr et pandoc. Mon. Mdm fichier 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.5textwidth]{placeHere}
end{figure}

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

je suis en train de convertir en PDF en utilisant les fonctions fournies ici: http://quantifyingmemory.blogspot.co.uk/2013/02/reproducible-research-with-r-knitr.html

Comment puis-je place l'intrigue entre les deuxième et troisième blocs de texte? Le code latex ne fonctionne pas tel quel.

EDIT: C'est ce que je vais essayer 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 
26
demandé sur Tyler Rinker 2013-05-18 20:20:59

8 réponses

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

Deux façons de le faire:

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

  2. hack dans le document LaTeX généré par pandoc, par exemple, 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, envisagez de demander une nouvelle fonctionnalité pour pandoc sur Github, puis asseyez-vous et attendez.

24
répondu Yihui Xie 2018-05-15 14:45:52

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

Voici un exemple d'une .tex fichier:

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

voici un exemple .Mdm qui comprend (en supposant que vous avez appelé la .fichier tex " préambule 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)
```
54
répondu paleo13 2016-02-01 06:34:53

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 ajouter ensuite 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
```
7
répondu Ferran VilBer 2017-01-12 16:00:14

j'ai quelques projets qui me convertir .Mdm .pdf (la plupart du temps une présentation de diapositives beamer) et veulent que les graphiques ne flottent pas (les figures flottantes ne fonctionnent vraiment pas avec des présentations de diapositives).

l'approche que j'utilise est d'ajouter un espace échappé après la ligne dans le .dossier médical. Cela signifie que le graphique est à l'intérieur d'un paragraphe plutôt que d'être un paragraphe à part entière, cela signifie que pandoc ne va pas l'envelopper dans un environnement de figure (cela signifie également que je ne peux pas utiliser une 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 lancé R et knitr il lancera automatiquement un script Perl (bien que cela puisse être fait en utilisant R ou d'autres outils) qui trouvera où les placettes sont insérées et ajoutera l'espace échappé à la fin de la ligne.

6
répondu Greg Snow 2013-07-16 17:57:08

si ce que vous recherchez est de simplement 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 un antislash " \ " quelque part après vos commandes de parcelle, les parcelles ne seront pas flottantes mais seront plutôt imprimées dans leur emplacement actuel.

si vous voulez que seulement quelques parcelles apparaissent, vous pouvez modifier cette option pour chacune.

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 

( ... )

3
répondu Tamara vdD 2016-08-31 22:07:10

utilisant un crochet knitr

j'ai d'une façon ou d'une autre trébuché sur cette question et je veux ajouter une autre approche. Ici, je fais usage de la flexibilité impressionnante fourni par les crochets knitr. J'ai tout simplement changer l'intrigue crochet à utiliser le knitr fonction hook_plot_tex(). Après je peux juste utiliser l'option chunk fig.pos comme nous sommes habitués à dans les documents Rnw afin de positionner figure environnements (fig.cap doit être définie afin d'invoquer l' figure environnement).

Cela fonctionne dans les exemples fourni par L'OP. Je suppose qu'ils travaillent aussi (d'une manière ou d'une autre) dans des exemples plus compliqués. Pourquoi cela peut ê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 ça.

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 fig.pos='h', l'intrigue passe habituellement à la deuxième page.

1
répondu Martin Schmelzer 2018-03-23 13:10:11

Est-ce que vous êtes après:

```{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
répondu Tyler Rinker 2013-05-22 00:15:57

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, soit globalement, soit pour chaque morceau individuel. NOTEZ la majuscule H. Ceci indique à latex de placer la figure de flotteurs exactement où ils sont appelés dans le Rmd fichier.

  2. MAIS, cela nécessite le paquet par latex, vous pouvez spécifier dans le modèle que pandoc utilise pour construire des fichiers pdf. Vous faites cela en ajoutant la ligne \usepackage{float}

  3. MAIS, vous devez d'abord trouver le modèle de fichier à modifier. Je ne pouvais pas trouver n'importe où, mais vous pouvez obtenir pandoc pour imprimer le contenu du modèle de la console avec cette commande: pandoc -D latex

  4. couper et coller ce code modèle dans un fichier texte vide.

  5. Ajouter l' ligne: \usepackage{float}

  6. Enregistrer sous le nom "default.latex" dans le répertoire C:\Users\YOURNAME\pandoc\templates

  7. ajouter l'option --data-dir=C:/Users/YOURNAME/pandoc/templates" à votre appel au pandoc ou 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
répondu Andrew 2017-11-06 19:01:37