是否可以提高从RMarkdown的TikZ插入Word文档的图像的分辨率?

时间:2018-08-07 21:41:38

标签: r-markdown knitr docx tikz

我有一个简单的RMarkdown文档:

---
output:
  word_document: default
  html_document: default
---


```{r,engine='tikz', fig.ext = 'png'}
\begin{tikzpicture}
\path (0,0) node
(x) {Hello World!}
(3,1) node[circle,draw](y) {$\int_1^2 x \mathrm d x$};
\draw[->,blue]
(x) -- (y);
\draw[->,red]
(x) -| node[near start,below] {label} (y);
\draw[->,orange] (x) .. controls +(up:1cm) and +(left:1cm) .. node[above,sloped] {label} (y);
\end{tikzpicture}
```

这是示例from 17.11 of pgfmanual.pdf

如果我将'png'更改为'svg',则HTML输出效果很好:

TikZ SVG image in HTML - looks great

它使用tikz引擎生成圆形和矩形。
但是即使在100%缩放的情况下,生成的图像在DOCX中看起来也很难看和像素化:

TikZ image in docx - low resolution

我尝试更改fig.widthdpiout.width,但没有得到积极的结果。

对我来说最好的结果是:获得具有TikZ代码指定尺寸的高分辨率图像。

是否可以提高从TikZ插入Word文档的图像的分辨率?

更新1:@CL设置为pandoc's dpi using pandoc_args的建议解决方案不起作用。

更新2:@tarleb解决方案通过{r,engine='tikz', engine.opts = list(convert.opts = '-density 800 -resize 800x800'), fig.ext = 'png'}提出的建议:

---
output:
  word_document: default
  html_document: default
---

```{r,engine='tikz', engine.opts = list(convert.opts = '-density 800 -resize 800x800'), fig.ext = 'png'}
\begin{tikzpicture}
\path (0,0) node
(x) {Hello World!}
(3,1) node[circle,draw](y) {$\int_1^2 x \mathrm d x$};
\draw[->,blue]
(x) -- (y);
\draw[->,red]
(x) -| node[near start,below] {label} (y);
\draw[->,orange] (x) .. controls +(up:1cm) and +(left:1cm) .. node[above,sloped] {label} (y);
\end{tikzpicture}
```

错误结束:

sh: -density 800 -resize 800x800: command not found
Quitting from lines 8-18 (tikz-sizing.Rmd) 
Error in engine(options) : 
  Failed to compile tikz-sizing_files/figure-docx/unnamed-chunk-1-1.pdf to tikz-sizing_files/figure-docx/unnamed-chunk-1-1.png
Calls: <Anonymous> ... process_group.block -> call_block -> block_exec -> in_dir -> engine
Execution halted

1 个答案:

答案 0 :(得分:5)

问题出在创建和转换Ti k Z图像的方式上。 Knitr首先通过pdflatex(或luatex / XeLaTeX)将代码编译为PDF文件。然后,将生成的PDF通过ImageMagick的convert转换为PNG。 PDF包含矢量图形,而PNG是面向像素的位图格式。生成的PNG的质量仅受转换器使用的采样率限制。 ImageMagick使用的默认值为72 dpi,将其提高到一个较大的值(例如300)会为较小的图像提供更好的效果。

R Markdown允许通过engine.opts设置控制PDF→PNG转换:

{r, engine='tikz', engine.opts = list( convert = 'convert', convert.opts = '-density 300'), fig.ext = 'png'}

这告诉ImageMagick使用更高的采样率/像素密度。像300这样的值就足够了,更高的值将以更大的文件大小为代价来提高图像质量。