How to resolve rmarkdown to latex errors involving tikz devices

1.4k views Asked by At

I am trying to compile an rmarkdown document that includes a geographic plot into a PDF file. Here is a MWE:

---
title: "Problems with maps in tikz"
output: pdf_document
---

```{r setup, include=FALSE}
library(ggplot2)
library(sf)
```

## sf:png
Builds find when `nctikz` chunk is excluded.
```{r nc}
nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
ggplot(nc) +
  geom_sf(aes(fill = AREA))
```

## sf:tikz
This graphic fails to build.
```{r nctikz, dev = 'tikz'}
ggplot(nc) +
  geom_sf(aes(fill = AREA)) 
```

I am compiling this document using the "Knit" button in RStudio. I'm going to discuss each of the errors / warnings I get when I compile the document in case one leads to the others.

tinytex

Every time I try to run a chunk that includes dev = 'tikz', tinytex will try to reinstall the pgf TeX package, then discover it's already there, then give up trying to link it. I'm able to build document with non-geographic tikz outputs, however, so I've mostly just accepted this fact.

tlmgr search --file --global '/tikzlibrarytopaths.code.tex'
Trying to automatically install missing LaTeX packages...
tlmgr install pgf
tlmgr: package repository http://mirror.utexas.edu/ctan/systems/texlive/tlnet (not verified: gpg unavailable)
tlmgr install: package already present: pgf
tlmgr path add
add_link_dir_dir: /usr/local/share/info/dir exists; not making symlink.

Invalid characters

Tikz (in knitr) seems unable to handle the degree symbol as part of a tex file. As a note, the nctikz-1.tex object can be built by pdflatex without issue.

! Package inputenc Error: Invalid UTF-8 byte "B0.

Quitting from lines 24-27 (test.Rmd) 
Error: Failed to compile test_files/figure-latex/nctikz-1.tex. See https://yihui.name/tinytex/r/#debugging for debugging tips. See nctikz-1.log for more info.

Underscore in filepath

I can get around the invalid characters error by suppressing the axis titles theme(axis.text = element_blank()) on my plot, but this then introduces another error dealing with bringing in a file.

! Missing $ inserted.
<inserted text> 
                $
l.3975 ...72.27pt,interpolate=true]{nctikz-1_ras1}
                                                  }; 

Quitting from lines 24-27 (test.Rmd) 

The full line that generates this error is

\node[inner sep=0pt,outer sep=0pt,anchor=south west,rotate=  0.00] at (423.16, 120.24) {
    \pgfimage[width= 14.45pt,height= 72.27pt,interpolate=true]{nctikz-1_ras1}};

The image it's trying to reference is barely an image (I think it's for the legend).

<code>nctikz-1_ras1.png</code>

Environment

I am building this document on MacOS with a whole pile of libraries. In an effort to isolate the issue, I also attempted to build the document on Rstudio.cloud (Ubuntu) in a brand new project. In this environment, only the issue with the math environment / underscore occurs.

! Missing $ inserted.
<inserted text> 
                $
l.4049 ...72.27pt,interpolate=true]{nctikz-1_ras1}
                                                  }; 

Quitting from lines 26-28 (test.Rmd) 
Error: Failed to compile test_files/figure-latex/nctikz-1.tex. See https://yihui.name/tinytex/r/#debugging for debugging tips. See nctikz-1.log for more info.
1

There are 1 answers

3
Ralf Stubner On

Not a full answer, but I would like to document my current state:

  1. It makes sense to enable debugging by adding

    ```{r, include=FALSE}
    options(tinytex.verbose = TRUE)
    ```
    

    to the Rmd file as suggested.

  2. The pgf issue is sort of a red herring. With debugging we see that it happens after some other error occurs (illegal character or underscore in file path). The corresponding regular expression was recently introduced and should probably be extended to check for actual error messages from Tikz/pgf.

  3. I can reproduce the illegal character on Debian Linux. Somehow ° is written as 0xB0, i.e. Latin-1 encoded instead of UTF-8. I am not sure why/where this is happening. BTW, I can process the resulting tex file directly with pdflatex only from RStudio, since that re-encodes the 0xB0 as a question mark. If I use pdflatex via Emacs or directly on the command line, I get the same error message.

  4. Removing the degree symbol from the output via

    ```{r nctikz, dev = 'tikz'}
    ggplot(nc) + 
      theme(axis.text = element_blank()) +
      geom_sf(aes(fill = AREA)) 
    ```
    

    I can reproduce the "underscore in file path" issue. With debugging turned on, one sees that the issue is again somewhere else:

    Package pgf Warning: File "nctikz-1_ras1" not found when defining image "pgflas
    timage". Tried all extensions in ".pdf:.jpg:.jpeg:.png:" on input line 3975.
    
    ! Missing $ inserted.
    <inserted text> 
                    $
    l.3975 ...72.27pt,interpolate=true]{nctikz-1_ras1}
                                                      };
    !  ==> Fatal error occurred, no output PDF file produced!
    

    The file nctikz-1_ras1.png that is present in the same directory as nctikz-1.tex is not found. One can reproduce this issue directly using

    tinytex::latexmk("<path>/nctikz-1.tex", install_packages = FALSE, clean = FALSE)
    

    However, if one changes to the directory first, no such error occurs:

    setwd("<path>")
    tinytex::latexmk("./nctikz-1.tex", install_packages = FALSE, clean = FALSE)