Unable to get tikzDevice to work

2019-04-29 06:42发布

问题:

I have a problem with tikzDevice. I'm using the latest versions of R (with latest knitr and tikzDevice packages) and RStudio, updated TeX Live to 2015 binaries (and I think I have all the required packages). When I try to output graphics to tikzDevice, compilation hangs. Other graphics devices like PDF or CairoPNG work without a problem.

As an example, I tried to compile a the simple code below from RStudio with XeLaTeX (set as the default LaTeX compiler in RStudio), but it hangs forever after using the TikZ metrics dictionary. What I see is that the compilation actually produces a file with .tikz extension in the "figure" folder, which can be successfully compiled if I run XeLaTeX on it.

I attached below the complete log from RStudio 'Compile PDF' console output pane while it hangs:

Le chargement a n�cessit� le package : knitr

processing file: test.Rnw
  |.............                                                    |  20%
  ordinary text without R code

  |..........................                                       |  40%
label: setup (with options) 
List of 2
 $ include: logi FALSE
 $ cache  : logi FALSE

  |.......................................                          |  60%
  ordinary text without R code

  |....................................................             |  80%
label: fig1 (with options) 
List of 3
 $ eval: logi TRUE
 $ echo: logi FALSE
 $ dev : chr "tikz"

Creating new TikZ metrics dictionary at:
    test-tikzDictionary
Using TikZ metrics dictionary at:
    test-tikzDictionary

Le chargement a n�cessit� le package : knitr 

processing file: knitr-graphics.Rnw
  |..                                                               |   2%
  ordinary text without R code

  |...                                                              |   5%
label: setup (with options) 
List of 2
 $ include: logi FALSE
 $ cache  : logi FALSE

  |.....                                                            |   7%
   inline R code fragments

  |......                                                           |  10%
label: test-plot (with options) 
List of 1
 $ eval: logi FALSE

  |........                                                         |  12%
  ordinary text without R code

  |..........                                                       |  15%
label: pdf-dev (with options) 
List of 4
 $ ref.label: chr "test-plot"
 $ dev      : chr "pdf"
 $ out.width: chr "\\linewidth"
 $ echo     : logi FALSE

  |...........                                                      |  17%
  ordinary text without R code

  |.............                                                    |  20%
label: png-dev (with options) 
List of 4
 $ ref.label: chr "test-plot"
 $ dev      : chr "png"
 $ out.width: chr "\\linewidth"
 $ echo     : logi FALSE

  |..............                                                   |  22%
  ordinary text without R code

  |................                                                 |  24%
label: cairo-png-dev (with options) 
List of 4
 $ ref.label: chr "test-plot"
 $ dev      : chr "CairoPNG"
 $ out.width: chr ".5\\linewidth"
 $ echo     : logi FALSE

  |.................                                                |  27%
  ordinary text without R code

  |...................                                              |  29%
label: two-high (with options) 
List of 3
 $ fig.width : num 3
 $ fig.height: num 2.5
 $ out.width : chr ".49\\linewidth"

Using TikZ metrics dictionary at:
    knitr-graphics-tikzDictionary

And an exerpt of the tikzStringWidthCalc.log found in R temporary folder:

This is XeTeX, Version 3.14159265-2.6-0.99992 (TeX Live 2015/W32TeX) (preloaded format=xelatex 2015.6.25)  1 JUL 2015 13:45
entering extended mode
 restricted \write18 enabled.
 %&-line parsing enabled.
**c:/Users/guyader/AppData/Local/Temp/RtmpqwmJYG/tikzStringWidthCalc.tex
(c:/Users/guyader/AppData/Local/Temp/RtmpqwmJYG/tikzStringWidthCalc.tex
LaTeX2e <2015/01/01>
Babel <3.9l> and hyphenation patterns for 4 languages loaded.
(c:/texlive/2014/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(c:/texlive/2014/texmf-dist/tex/latex/base/size10.clo
File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
)
\c@part=\count79
\c@section=\count80
\c@subsection=\count81
\c@subsubsection=\count82
\c@paragraph=\count83
\c@subparagraph=\count84
\c@figure=\count85
\c@table=\count86
\abovecaptionskip=\skip41
\belowcaptionskip=\skip42
\bibindent=\dimen102
)
(c:/texlive/2014/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
(c:/texlive/2014/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
(c:/texlive/2014/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
(c:/texlive/2014/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
\pgfutil@everybye=\toks14
\pgfutil@tempdima=\dimen103
\pgfutil@tempdimb=\dimen104

(c:/texlive/2014/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)
) (c:/texlive/2014/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
\pgfutil@abb=\box26

[...]

LaTeX Font Info:    Redeclaring math symbol \Omega on input line 30.
LaTeX Font Info:    Redeclaring math symbol \mathdollar on input line 30.
LaTeX Font Info:    Redeclaring symbol font `operators' on input line 30.
LaTeX Font Info:    Encoding `OT1' has changed to `EU1' for symbol font
(Font)              `operators' in the math version `normal' on input line 30.
LaTeX Font Info:    Overwriting symbol font `operators' in version `normal'
(Font)                  OT1/cmr/m/n --> EU1/lmr/m/n on input line 30.
LaTeX Font Info:    Encoding `OT1' has changed to `EU1' for symbol font
(Font)              `operators' in the math version `bold' on input line 30.
LaTeX Font Info:    Overwriting symbol font `operators' in version `bold'
(Font)                  OT1/cmr/bx/n --> EU1/lmr/m/n on input line 30.
LaTeX Font Info:    Overwriting symbol font `operators' in version `normal'
(Font)                  EU1/lmr/m/n --> EU1/lmr/m/n on input line 30.
LaTeX Font Info:    Overwriting math alphabet `\mathit' in version `normal'
(Font)                  OT1/cmr/m/it --> EU1/lmr/m/it on input line 30.
LaTeX Font Info:    Overwriting math alphabet `\mathbf' in version `normal'
(Font)                  OT1/cmr/bx/n --> EU1/lmr/bx/n on input line 30.
LaTeX Font Info:    Overwriting math alphabet `\mathsf' in version `normal'
(Font)                  OT1/cmss/m/n --> EU1/lmss/m/n on input line 30.
LaTeX Font Info:    Overwriting math alphabet `\mathtt' in version `normal'
(Font)                  OT1/cmtt/m/n --> EU1/lmtt/m/n on input line 30.
LaTeX Font Info:    Overwriting symbol font `operators' in version `bold'
(Font)                  EU1/lmr/m/n --> EU1/lmr/bx/n on input line 30.
LaTeX Font Info:    Overwriting math alphabet `\mathit' in version `bold'
(Font)                  OT1/cmr/bx/it --> EU1/lmr/bx/it on input line 30.
LaTeX Font Info:    Overwriting math alphabet `\mathsf' in version `bold'
(Font)                  OT1/cmss/bx/n --> EU1/lmss/bx/n on input line 30.
LaTeX Font Info:    Overwriting math alphabet `\mathtt' in version `bold'
(Font)                  OT1/cmtt/m/n --> EU1/lmtt/bx/n on input line 30.
tikzTeXWidth=4.80003pt
! Missing \endgroup inserted.
<inserted text> 
                \endgroup 
l.37 \@@end

Here is how much of TeX's memory you used:
 23160 strings out of 495610
 491023 string characters out of 6186855
 478788 words of memory out of 5000000
 26156 multiletter control sequences out of 15000+600000
 6670 words of font info for 20 fonts, out of 8000000 for 9000
 14 hyphenation exceptions out of 8191
 55i,5n,54p,10417b,529s stack positions out of 5000i,500n,10000p,200000b,80000s

No pages of output.

In addition, if I run the command knit("test.Rnw") from R console, I get this:

processing file: test.Rnw
  |.............                                                    |  20%
  ordinary text without R code

  |..........................                                       |  40%
label: setup (with options) 
List of 2
 $ include: logi FALSE
 $ cache  : logi FALSE

  |.......................................                          |  60%
  ordinary text without R code

  |....................................................             |  80%
label: fig1 (with options) 
List of 3
 $ eval: logi TRUE
 $ echo: logi FALSE
 $ dev : chr "tikz"

Using TikZ metrics dictionary at:
    test-tikzDictionary
Quitting from lines 14-17 (test.Rnw) 
Error: failed to compile figure/graphics-fig1-1.tikz to PDF
In addition: Warning message:
running command '"C:\texlive\2014\bin\win32\xelatex.exe" "graphics-fig1-1.tikz"' had status 1 

Though, again if run xelatex on the .tikz graphics file from a windows command prompt, it successfully compiles to PDF.

Here's my sessionInfo():

R version 3.2.1 (2015-06-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=French_France.1252  LC_CTYPE=French_France.1252    LC_MONETARY=French_France.1252
[4] LC_NUMERIC=C                   LC_TIME=French_France.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.2.1

Following up on my problem with tikzDevice, the only workaround I found is to output the graphics to another device like png, add usepackage{tikz} to the preamble, call tikz() inside the code chunk and \input{} the resulting .tex figure like this:

\documentclass{article}
\usepackage{tikz}

\begin{document} 

<<setup, include=FALSE, cache=FALSE>>=
library(knitr)
library(tikzDevice)
options(formatR.arrow=TRUE,width=50,tikzDefaultEngine='xetex')
opts_chunk$set(fig.path='figure/graphics-', cache.path='cache/graphics-', fig.align='center', dev='png', fig.width=5,     fig.height=5, fig.show='hold', cache=TRUE, par=TRUE, concordance=TRUE)
@

\begin{figure} 

<<fig1,eval=TRUE,echo=FALSE>>= 
library(ggplot2)
setwd("~/")
td <- getwd()
tf <- file.path(td,'fig1.tex')
tikz(tf, standAlone=F, bareBones=F)
qplot(displ, hwy, data = mpg, colour = factor(cyl))
dev.off()
@

\input{fig1.tex}

\end{figure} 

\end{document}

This way I can get the consistency of fonts from using tikz, but it would be much easier to have tikzDevice() to work.