使用knitr和pandoc转换为PDF时,在markdown中的位置

luc*_*ano 33 markdown r pandoc knitr

我正在尝试使用knitr和pandoc转换为PDF时控制绘图的位置.我的.Rmd文件看起来像这样:

# 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
Run Code Online (Sandbox Code Playgroud)

我正在使用此处提供的功能转换为PDF:http://quantifyingmemory.blogspot.co.uk/2013/02/reproducible-research-with-r-knitr.html

如何在第二和第三块文本之间放置图?乳胶代码目前无法正常工作.

编辑:这就是我现在正在尝试的.

# 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 
Run Code Online (Sandbox Code Playgroud)

pal*_*o13 76

我提出了另一种解决方案.我不建议以事后方式将[H]符号插入到乳胶文档中,而是建议重新定义图形环境以忽略任何位置参数并使用[H].

为此,请在与.Rmd文件相同的目录中创建一个.tex文件,该文件重新定义图形环境,并更新.Rmd中的YAML标头以在编译期间包含该文件.

以下是.tex文件的示例:

\usepackage{float}
\let\origfigure\figure
\let\endorigfigure\endfigure
\renewenvironment{figure}[1][2] {
    \expandafter\origfigure\expandafter[H]
} {
    \endorigfigure
}
Run Code Online (Sandbox Code Playgroud)

这是包含它的示例.Rmd(假设您调用了.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)
```
Run Code Online (Sandbox Code Playgroud)

  • 这很好用,并且比接受的答案恕我直言.你可以简化,因为这里对晕影等的引用是无关紧要的. (6认同)
  • 我绝对同意,这个答案比我的答案(五年前发布的)更为优雅,我鼓励OP接受这个答案。 (3认同)
  • 完美的解决方案。找了一段时间 (2认同)
  • 如果像我一样,您同时遇到表的相同问题 - 这里有一个解决方案:/sf/ask/3139500801/ -pdf 中的页面 (2认同)

Yih*_*Xie 27

pandoc在将Markdown文档转换为LaTeX时,我不知道设置浮动选项的选项.如果您选择Markdown的简单性,那么即使使用强大的工具,您也不应期望它具有太大的功率pandoc.底线:Markdown不是LaTeX.它是为HTML而不是LaTeX而设计的.

两种方法:

  1. 使用Rnw语法(R + LaTeX)代替Rmd(R Markdown)(例子); 那么你就可以使用块选项fig.pos='H'后,你\usepackage{float}在序言; 在这种情况下,您拥有LaTeX的全部功能,并且不会涉及pandoc

  2. 破解由pandoc生成的LaTeX文档,例如

    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
    
    Run Code Online (Sandbox Code Playgroud)

如果您不喜欢这些解决方案,请考虑在Github上请求 pandoc 的新功能,然后等待.

  • 由于我花了 20 分钟才找到它,我在这里发表评论,@yihui 和团队在 bookdown 中添加了一个特殊选项来做到这一点:https://bookdown.org/yihui/rmarkdown-cookbook/figure-placement.html#fn10 (2认同)

小智 14

我在RSTUDIO中使用KnitR和markdown,我的案例的解决方案是在序言中添加\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}
---
Run Code Online (Sandbox Code Playgroud)

然后在第一行添加这行代码(fig.pos ='H'):

```{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
```
Run Code Online (Sandbox Code Playgroud)


Gre*_*now 7

我有一些项目,我将.Rmd转换为.pdf(主要是beamer幻灯片演示文稿),并希望图形不浮动(浮动数字实际上不适用于幻灯片演示).

我使用的方法是在.md文件中的行后面添加一个转义空格.这意味着图形在一个段落内而不是它自己的一个段落,这意味着pandoc不会将它包装在一个图形环境中(这也意味着我不能使用它的标题)并因此将其准确放置那个位置.

我使用Makefile为我做所有的转换,所以在运行R和knitr后,它会自动运行一个Perl脚本(尽管可以使用R或其他工具完成),找到插入图块的位置并添加转义空间行的结尾.

  • 这个答案为我解决了这个问题.对于那些不知道转义空间是什么的人,你可以使用反斜杠:`![SourceTree commit message](images/sourcetree-commit-message.png)\` (4认同)

小智 6

如果您要寻找的是只是手动控制放置图形的位置,请使用以下网页:http : //www.rci.rutgers.edu/~ag978/litdata/figs/,我发现如果您添加一个反斜杠“ \“在您的绘图命令之后的某处,这些绘图将不会浮动,而是会打印在其当前位置。

如果只希望显示一些图,则可以为每个图修改该选项。

在您的示例中:

# 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 
Run Code Online (Sandbox Code Playgroud)

(等等)


Mar*_*zer 6

使用 knitr 钩

我不知何故偶然发现了这个问题,并想添加另一种方法。在这里,我利用了 knitr hooks 提供的惊人的灵活性。我只是将绘图挂钩更改为使用 knitr 函数hook_plot_tex()。之后,我可以fig.pos像在 Rnw 文档中那样使用 chunk 选项来定位figure环境(fig.cap必须设置才能调用figure环境)。

这适用于 OP 提供的示例。我猜他们也在(以某种方式)更复杂的例子中工作。为什么这可以轻松完成并且不是 Rmd 文档的默认设置,我不确定。也许一辉可以澄清这一点。

这是代码:

---
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()
```
Run Code Online (Sandbox Code Playgroud)

没有fig.pos='h',情节通常会跳到第二页。