在R Markdown中将图像和文本居中以生成PDF报告

83

我想在R Markdown中居中图片和/或文本,并生成PDF报告。

我尝试使用了以下方法:

->Text<-

->![](image1.jpg)<-

那并不能解决问题!还有其他方法可以完成这个任务吗?

14个回答

90

我也有同样的问题。我尝试了上面提供的所有解决方案,但它们都没有起作用...但我找到了一个适合我的解决方案,希望对其他人也有帮助。

<center>

![your image caption](image.png)

</center>

这段代码可以同时将图像和标题居中。必须<center>、 图像代码和 </center>之间保留空行,否则图片会居中,但标题会消失。

如果您想让图像具有可点击的链接,可以嵌入以下内容:

[![your image caption](image.png)](www.link_to_image.com)

然而,标题将不再显示。

因此,如果您想要一个可单击的标题,则需要分两步完成:

<center>

![](image.png)

[your image caption](www.link_to_image.com)

</center>

我也是这样做的,确保每个命令之间有空行。如果你希望图片和标题都可点击,则将上面的中间代码和最后一个代码组合起来。希望这能有所帮助。


10
最有用(请将其加粗):"<center> </center>内部和图片代码之间必须留有空行,否则图像将被居中显示,但标题将消失。" - warship
对我来说什么都不起作用..还要考虑到战舰的澄清。 - jose920405
10
这似乎对 PDF 输出无效,这是 OP 要求的。也许你可以在回答中提到? - Marcelo Avila
如果您不想要标题,似乎无法使用此技术。 - GJCode

78

如果您想将R代码块的输出(如绘图)居中显示,则可以使用knitr中的 fig.align 选项

```{r fig.align="center"}
plot(mtcars)
```

25

您可以在R Markdown中使用原始LaTeX。尝试以下内容:

\begin{center}
Text
\end{center}
当然,有一个限制:Pandoc会将begin{...\end{...之间的所有内容解释为原始的LaTeX代码,因此您不能使用此技术来居中R代码块或Markdown内容。

6
如果我们想要将R代码块的输出居中,该怎么做? - gd047
任何“特殊”的新错误只是,正如所提到的那样,您不能再在其中使用Markdown或HTML。只允许使用LaTeX语法。至于R代码块,由于knitr的fig.align="center",它们实际上非常容易放置。 - mirh
所以你不能使用这种技术来居中 R 代码块或 Markdown 内容,我意识到了为什么我没有成功。 - Matthew Son

20

您可以使用Knitr选项来设置整个文档的中心(或其他)对齐方式,方法如下:

knitr::opts_chunk$set(echo = TRUE, fig.align="center")

19

没有一种答案适用于所有输出类型,而其他答案则侧重于代码块内绘制的图形而不是外部图像。

include_graphics() 函数提供了一个简单的解决方案。唯一的参数是文件名(如果在子文件夹中,则为相对路径)。通过将 echo 设置为 FALSEfig.align=center,您可以获得所需的结果。

```{r, echo=FALSE, fig.align='center'}
include_graphics("image.jpg")
```

2
很棒的解决方案!只想补充一下,这是来自于 knitr 包,而不是 rmarkdown 包,如果有人使用此解决方案。 - dre

12

我使用了Jonathan的回答来学习如何在LaTeX中插入图片,如果你想要插入一张名为image1.jpg的图片并且想让它居中显示,在Rmarkdown中的代码可能是这样的

\begin{center}
\includegraphics{image1}
\end{center}

请记住,LaTex不需要文件扩展名(.jpg)。这个问题帮助我找到了答案。谢谢。


9
简单的解决方案由Jonathan提供,通过修改以欺骗Pandoc来实现。而不是直接使用Latex命令,例如:
\begin{center}
Text
\end{center}

您可以在YAML头中定义自己的命令:

header-includes:
- \newcommand{\bcenter}{\begin{center}}
- \newcommand{\ecenter}{\end{center}}

然后你使用:

\bcenter
Text and more
\ecenter

对于我来说,这种方法可以使整个文档在其中包含许多代码块和Markdown命令时居中。


这个运行得非常好。 - user16051136

7

我正在使用beamer从Rmarkdown中生成pdf,以下内容适用于我:

\centering
![](image1.jpg)

3
如果您知道您的格式是PDF,那么我不认为HTML标签会有用...对我来说它绝对不起作用。其他纯LaTeX解决方案显然都可以正常工作。但Markdown的整个重点不是做LaTeX,而是允许多种格式编译,包括HTML。
因此,考虑到这一点,对我有用的是Nicolas Hamilton在Color Text Stackoverflow question上的答案变体。
#############
## CENTER TXT
ctrFmt = function(x){
  if(out_type == 'latex' || out_type == 'beamer')
    paste0("\\begin{center}\n", x, "\n\\end{center}")
  else if(out_type == 'html')
    paste0("<center>\n", x, "\n</center>")
  else
    x
}

我将这段代码放在我的初始设置块中。 然后我可以在我的.rmd文件中轻松使用它:

`r ctrFmt("Centered text in html and pdf!")`

3

现在有一个更好的解决方案,更加优雅,基于fenced div,已经在pandoc中实现,如这里所述:

::: {.center data-latex=""}
Some text here...
:::

你只需要相应地更改你的css文件。例如,以下代码就能完成任务:
```{cat, engine.opts = list(file = "style.css")}
.center {
  text-align: center;
}
``` 

(显然,您也可以直接将代码块的内容键入到您的 .css 文件中...)
tex 文件包括适当的居中命令。
这种方法的关键优点是它允许在块内编写 markdown 代码。
在我之前的答案中,r ctrFmt("Centered **text** in html and pdf!") 没有将单词 "text" 加粗,但如果在 fenced div 内部,则会加粗。
对于图片等等... 可以使用 lua 过滤器,在此处 可用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接