Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
385 views
in Technique[技术] by (71.8m points)

knitr - Using tikz graphdrawing library within RMarkdown ... Need to use lualatex engine, but can't get it to work

I have the following code in an rmd file which leverages tikz for diagrams:

---
title: "TestNonTufteLua"
author: "Me"
output:
  pdf_document :
    latex_engine: lualatex
---

Prove tikz works:
```{r tikTest1, engine = "tikz"}
usetikzlibrary{shapes}
egin{tikzpicture}
    
ode[ellipse, draw=black, align = center] (Data) {Data $y_{n}$};
end{tikzpicture}
```

Then, when you set `eval = TRUE` in the below code, it will not work. 
```{r tikTest2, eval = FALSE, engine = "tikz"}
usetikzlibrary{graphs, graphdrawing}
usegdlibrary{layered}
ikz [gr/.style={gray!50}, font=fseries]
graph [layered layout] {
    % A and F are horizontally aligned if you also set weight=0.5 for A -- C.
    A -- [minimum layers=2] C -- F,
    { [nodes=gr, edges=gr] A -- B -- { E, D -- F } }
};
```

When changing to eval=TRUE in the second chunk, I get the following error:

Quitting from lines 24-29 (testNonTufteLua.Rmd) Error: running 'texi2dvi' on '.ikz36747a021b22.tex' failed

LaTeX errors: rarygraphdrawing.code.tex:22: Package pgf Error: You need to run LuaTeX to use the graph drawing library.

This error occurs when using the knit button from RStudio or using render("testNonTufteLua.Rmd", output_format = pdf_document(keep_tex = TRUE, latex_engine = "lualatex"). I have also experimented with setting options(tikzDefaultEngine = "luatex") to get tikzDevice to handle it properly, but it still does not work. I just can't seem to get the graphdrawing library to work even though the tikz-shapes library can be loaded and also that the rest of the document seems to be compiled with lualatex. Thanks for any help!!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Update: Meanwhile knitr no longer uses tools::texi2dvi but tinytex::latexmk. One therefore has to use options(tinytex.engine = 'lualatex') in a set-up chunk.


This is rather tricky, since you are not using tikzDevice but the tikz engine, which uses tools::texi2dvi to convert to PDF. You can change this using options(texi2dvi = "lualatex"). However, the default template does not work with LuaLaTeX. I have therefore created a modified template:

RequirePackage{luatex85}
documentclass{article}
usepackage[luatex,active,tightpage]{preview}
usepackage{amsmath}
usepackage{tikz}
usetikzlibrary{matrix}
egin{document}
egin{preview}
%% TIKZ_CODE %%
end{preview}
end{document}

And specify that file with engine.opts = list(template = "tikz2pdf.tex"). Putting it all together here my working file:

---
title: "TestNonTufteLua"
author: "Me"
output:
  pdf_document :
    latex_engine: lualatex
---

```{r}
options(texi2dvi = "lualatex")
```

```{r tikTest2, eval = TRUE, engine = "tikz", engine.opts = list(template = "tikz2pdf.tex")}
usetikzlibrary{graphs, graphdrawing}
usegdlibrary{layered}
ikz [gr/.style={gray!50}, font=fseries]
graph [layered layout] {
    % A and F are horizontally aligned if you also set weight=0.5 for A -- C.
    A -- [minimum layers=2] C -- F,
    { [nodes=gr, edges=gr] A -- B -- { E, D -- F } }
};
```

Result:

enter image description here

References:


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...