I have simple RMarkdown document:
---
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}
```
It is example from 17.11 of pgfmanual.pdf.
HTML output is great if I change 'png'
to 'svg'
:
It produces circle and rectangle with tikz
engine.
But the resulting image looks ugly and pixelated in DOCX even with 100% zoom:
I tried to change fig.width
, dpi
, out.width
but did not get positive results.
The best result for me would me the following: get high resolution image with dimensions as specified in TikZ code.
Is it possible to increase resolution of image inserted to Word document from TikZ?
Update 1 : the proposed solution by @CL with set pandoc's dpi
using pandoc_args
does not work.
Update 2 : the proposed by @tarleb solution with {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}
```
ends in error:
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
The issue comes from the way TikZ images are created and converted. Knitr first compiles the code into a PDF file via pdflatex (or luatex/XeLaTeX). The resulting PDF is then converted to PNG via ImageMagick's convert
. The PDF contains a vector graphic, while PNG is a pixel-oriented bitmap format; quality of the resulting PNG is limited only by the sampling rate used by the converter. The default used by ImageMagick is 72 dpi, cranking it up to a large value (like 300) will give better results for small images.
R Markdown allows to control the PDF → PNG conversion via the engine.opts
setting:
{r, engine='tikz', engine.opts = list( convert = 'convert', convert.opts = '-density 300'), fig.ext = 'png'}
This tells ImageMagick to use a higher sampling rate / pixel density. A value like 300 should be enough, higher values will improve image quality at the cost of greater file sizes.