繁体   English   中英

使用 knitr 和 pandoc 转换为 PDF 时 Markdown 中的图形位置

[英]Figure position in markdown when converting to PDF with knitr and pandoc

在使用 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

我正在使用此处提供的功能转换为 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 

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

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

以下是 .tex 文件的示例:

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

这是包含它的示例 .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)
```

在将 Markdown 文档转换为 LaTeX 时,我不知道pandoc有这样一个选项来设置数字的浮动选项。 如果您选择 Markdown 是因为它的简单性,即使使用像pandoc这样的强大工具,您也不应该期望它有太多的功能。 底线: Markdown 不是 LaTeX 它是为 HTML 而不是 LaTeX 设计的。

两种方式:

  1. 使用 Rnw 语法 (R + LaTeX) 而不是 Rmd (R Markdown)(示例); 那么你将能够在序言中使用\\usepackage{float}之后的块选项fig.pos='H' ; 在这种情况下,您拥有 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

如果您不喜欢这些解决方案,请考虑在 Github 上向 pandoc请求一个新功能,然后坐等。

我在 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}
---

然后在第一行添加这行代码 (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
```

如果您正在寻找只是手动控制放置数字的位置,请使用此网页: 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 

(等等)

我有几个项目从 .Rmd 转换为 .pdf(主要是投影仪幻灯片演示)并希望图表不浮动(浮动数字确实不适用于幻灯片演示)。

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

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

使用 knitr 钩

我不知何故偶然发现了这个问题,并想添加另一种方法。 在这里,我利用了 knitr hooks 提供的惊人的灵活性。 我只是将绘图钩子更改为使用 knitr 函数hook_plot_tex() 之后,我可以像在 Rnw 文档中那样使用块选项fig.pos来定位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()
```

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

这是你追求的吗:

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

解决方案不是太简单,也许其他人可以简化它。

基本步骤。 (Windows 7的)

  1. 您可以将参数fig.pos="H"到 knitr 选项,全局或每个单独的块。 注意大写的 H。这指示Rmd将数字浮标准确地放置在Rmd文件中调用它们的位置。

  2. 但是,这需要乳胶使用的包,您可以在 pandoc 用于构建 pdf 文件的模板中指定。 您可以通过添加行\\usepackage{float}

  3. 但是,您首先需要找到要修改的当前模板文件。 我在任何地方都找不到它,但是您可以使用以下命令让 pandoc 将模板的内容打印到控制台: pandoc -D latex

  4. 将此模板代码剪切并粘贴到空文本文件中。

  5. 添加行: \\usepackage{float}

  6. 以文件名"default.latex"保存在C:\\Users\\YOURNAME\\pandoc\\templates

  7. 将选项--data-dir=C:/Users/YOURNAME/pandoc/templates"到您对 pandoc 或Pandoc.convert("my file.md", format="pdf", options=c("--data-dir=C:/Users/YOURNAME/pandoc/templates"))如果在 R 中使用Pandoc.convert("my file.md", format="pdf", options=c("--data-dir=C:/Users/YOURNAME/pandoc/templates"))

我希望这对你有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM