How to hold figure position with figure caption in pdf output of knitr?
knitr, r, r-markdown
Solution
As Yihui mentioned in his answer (Figure position in markdown when converting to PDF with knitr and pandoc), we cannot expect too much about formatting from mardown. To workaround this problem, just write some R scripts to replace `htbp` to `H`.
Compared with `knit` from knitr package, I found `render` from rmarkdown is better to export a `tex` file. Just remember to add `keep_tex: yes` in the yaml header of your rmarkdown file.
library(rmarkdown)
render('filepath.Rmd')
x <- readLines('filepath.tex')
pos <- grep('begin\\{figure\\}\\[htbp\\]', x)
x[pos] <- gsub('htbp', 'H', x[pos])
writeLines(x, 'filepath.tex')
tools::texi2pdf('filepath.tex', clean = TRUE) # gives foo.pdf
file.remove('filepath.tex')
Problem
I am using knitr (1.9.5 and 1.9.17) and rmarkdown (0.5.3.1), and would like to hold figure position in the pdf output. The generated pdf file is working fine when chunk option `fig.pos="H"` is used. However, the figure position is not hold when `fig_caption: yes` is set in the yaml header. How should I fix this problem? Thanks for any suggestions. EDIT: After learning the float environment of Latex. I add `float` package into header. ``` \usepackage{float} ``` But the generated tex file always use `htbp` in the `figure` environment regard to any `fig.pos` options are used. After manually changing `htbp` to `H`, positions of all figures are hold. This is my example of rmd file: ```` --- title: "Untitled" output: pdf_document: fig_caption: yes includes: in_header: mystyles.sty --- # Section 1 Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot. Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot. Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot. Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot. ```{r fig1, echo=FALSE, fig.height=8.5, fig.pos="H"} plot(cars) ``` # Section 2 More test ```{r fig2, echo=FALSE, fig.height=8.5, fig.pos="H"} plot(cars) ``` # Section 3 ```{r fig3, echo=FALSE, fig.height=8.5, fig.pos="H"} plot(cars) ``` More test ````