Figura di posizione in markdown quando si converte in PDF con knitr e pandoc

Sto cercando di controllare la posizione di un grafico durante la conversione in PDF usando knitr e pandoc. Il mio file .Rmd sembra questo:

# 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 

Sto convertendo in PDF utilizzando le funzioni fornite qui: http://quantifyingmemory.blogspot.co.uk/2013/02/reproducible-research-with-r-knitr.html

Come posso posizionare la trama tra il secondo e il terzo blocco di testo? Il codice in latex non funziona come al momento.

EDIT: questo è quello che sto cercando ora.

 # 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 

    Non sono a conoscenza di una tale opzione per pandoc per impostare l’opzione fluttuante delle figure quando si converte un documento Markdown in LaTeX. Se scegli Markdown per la sua semplicità, non dovresti aspettarti troppa energia da esso, anche con strumenti potenti come pandoc . In conclusione : Markdown non è LaTeX . È stato progettato per HTML al posto di LaTeX.

    Due modi per andare:

    1. utilizzare la syntax Rnw (R + LaTeX) anziché Rmd (R Markdown) ( esempi ); quindi sarai in grado di usare l’opzione chunk fig.pos='H' dopo aver \usepackage{float} nel preambolo; in questo caso, hai pieno potere di LaTeX e pandoc non sarà coinvolto

    2. hackerare il documento LaTeX generato da pandoc, ad esempio qualcosa di simile

       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 

    Se non ti piacciono queste soluzioni, considera la possibilità di richiedere una nuova funzione su pandoc su Github, quindi siediti e aspetta.

    Presento una soluzione alternativa. Invece di inserire i simboli [H] in un documento in latex in modo post-hoc, suggerisco di ridefinire l’ambiente figure per ignorare qualsiasi argomento di posizione e usare [H].

    Per fare ciò, creare un file .tex nella stessa directory del file .Rmd che ridefinisce l’ambiente figure e aggiornare l’intestazione YAML in .Rmd per includere il file durante la compilazione.

    Ecco un esempio di un file .tex:

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

    Ecco un esempio .Rmd che lo include (assumendo che tu abbia chiamato il file .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) ``` 

    Ho alcuni progetti in cui converto da .Rmd a .pdf (principalmente una presentazione di diapositive) e voglio che i grafici non fluttuino (le figure fluttuanti non funzionano davvero con le presentazioni di diapositive).

    L’approccio che utilizzo è quello di aggiungere uno spazio di escape dopo la riga nel file .md. Ciò significa che il grafico si trova all’interno di un paragrafo anziché essere un paragrafo a sé stante, questo significa che pandoc non lo avvolgerà in un ambiente di figura (significa anche che non posso usare una didascalia con esso) e quindi lo posiziona esattamente quella posizione.

    Io uso un Makefile per fare tutte le conversioni per me, quindi dopo aver eseguito R e knitr eseguirà automaticamente uno script Perl (anche se potrebbe essere fatto usando R o altri strumenti) che trova dove sono inseriti i grafici e aggiunge lo spazio di escape a La fine della linea.

    Sto usando KnitR e markdown in RSTUDIO, la soluzione per il mio caso è aggiunta nel preambolo \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} --- 

    E poi aggiungendo queste linee di codice (fig.pos = ‘H’) nelle prime righe:

     ```{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 ``` 

    Se quello che stai cercando è solo controllare manualmente dove mettere le tue figure, usando questa pagina web: http://www.rci.rutgers.edu/~ag978/litdata/figs/ , ho scoperto che se aggiungi una barra retroversa ” \ “da qualche parte dopo i comandi di trama, i grafici non saranno fluttuanti ma saranno stampati nella loro posizione corrente.

    Se si desidera visualizzare solo alcuni grafici, è ansible modificare l’opzione per ciascuno.

    Nel tuo esempio:

     # 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 

    (eccetera)

    Usando un uncinetto

    In qualche modo sono incappato in questa domanda e voglio aggiungere un altro approccio. Qui uso la straordinaria flessibilità fornita dai ganci Knitr. Semplicemente cambio il hook della trama per usare la funzione hook_plot_tex() . Successivamente potrò semplicemente usare l’opzione chunk fig.pos come siamo abituati in documenti Rnw per posizionare gli ambienti figure ( fig.cap deve essere impostato per richiamare l’ambiente figure ).

    Questo funziona negli esempi forniti dall’OP. Suppongo che lavorino anche in (in qualche modo) esempi più complicati. Perché questo può essere fatto facilmente e non è l’impostazione predefinita per i documenti Rmd, non sono sicuro. Forse Yihui può chiarirlo.

    Ecco il codice:

     --- 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() ``` 

    Senza fig.pos='h' , la trama di solito salta alla seconda pagina.

    È questo quello che stai cercando:

     ```{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 

    La soluzione non è troppo semplice, forse qualcun altro sarà in grado di semplificarlo.

    I passaggi di base. (Windows 7)

    1. È ansible aggiungere l’argomento fig.pos="H" alle opzioni knitr, globalmente o per ogni singolo blocco. NOTA la Rmd maiuscola H. Questo indica al latex di posizionare le cifre mobili esattamente nel punto in cui sono chiamate nel file Rmd .

    2. MA, questo richiede che il pacchetto sia usato dal latex, questo è ansible specificare nel modello che pandoc usa per build file pdf. Lo fai aggiungendo la riga \usepackage{float}

    3. MA, prima devi trovare il file modello attuale da modificare. Non sono riuscito a trovarlo da nessuna parte ma puoi ottenere pandoc per stampare il contenuto del modello sulla console con questo comando: pandoc -D latex

    4. Taglia e incolla questo codice modello in un file di testo vuoto.

    5. Aggiungi la riga: \usepackage{float}

    6. Salva con il nome file "default.latex" in una directory come C:\Users\YOURNAME\pandoc\templates

    7. Aggiungi l’opzione --data-dir=C:/Users/YOURNAME/pandoc/templates" alla tua chiamata a pandoc OR Pandoc.convert("my file.md", format="pdf", options=c("--data-dir=C:/Users/YOURNAME/pandoc/templates")) se si utilizza pander in R.

    Spero che questo funzioni per te.