在记账图环境中包含TikZ代码

时间:2017-11-17 20:41:05

标签: r knitr r-markdown bookdown tikzdevice

我想在copy \\server1\vinoth_new\vinoth\Test\SubroQuePrint.txt \\server1\vinoth_new\cp_SubroQuePrint.txt 文档中添加TikZ图,以便包含一些精美的图片。

我的主要输出格式是LaTeX,这意味着我基本上只需将TikZ图形逐字地包含在Rmarkdown文件中,它就可以正常渲染。然而,有两个问题困扰着我:

  • 我希望TikZ图形成为数字环境的一部分(编号,标题等)。
  • 我希望能够为PDF(LaTeX)和Gitbook(HTML)呈现相同的代码。

现在我有以下块,当我渲染为pdf时,它很好地生成相关图形作为图形。

bookdown

但是,代码存在两个问题:

  1. 渲染到gitbook时我没有得到任何输出(使用```{r, echo=FALSE, engine='tikz', out.width='90%', fig.ext='pdf', fig.cap='Some caption.'} \begin{tikzpicture}[scale=.7] \draw [fill=gray!30,very thick] (0,-1) rectangle (5,1); \draw [very thick] (5, 0) -- (13,0); \node [below] at (2,-1) {\large Hello}; \node [below, align=center] at (0,-1) {\large Two\\ lines}; \end{tikzpicture} ``` knitr)。但是,我确实得到了数字标题,如果我渲染到bookdown,那么它也能正常工作,我可以看到图形。
  2. 对于PDF,文本使用计算机现代字体呈现。我真的想改变它,并且LaTeX文档中的主要字体已经被设置为其他东西。但是,因为代码是由TikZ引擎本地呈现然后插入的,所以它不是完整LaTeX文档的一部分。我可以在呈现代码之前添加TikZ引擎包含的一些LaTeX选项,包等吗?
  3. 如果还有其他方法可以将TikZ代码作为图形环境的一部分包含在内,那么我很乐意知道。

    更新我想第二点可以通过设置html_document来修复,其中LaTeX的必要设置包含在engine.opts = list(template = "latex/tikz2pdf.tex")文件中。该文件是使用LaTeX读取的,但我想使用tikz2pdf.tex来解析该文件,因为我正在使用xelatex LaTex包。无论如何都可以改变吗?

1 个答案:

答案 0 :(得分:5)

我想我找到了我的两个问题的答案。它确实需要 - 正如易辉所指出的 - 相当一段时间。我在这里包括答案,以防其他人证明需要这个(或者我以后)。

Re 1)将TikZ代码渲染为pdf和gitbook

事实证明这比我预想的要容易。将参数fig.ext=if (knitr:::is_latex_output()) 'pdf' else 'png'设置为块参数的一部分有助于此。如果我编织为PDF,那么imagemagick或其他软件会自动将其转换为PNG。

Re 2)修改字体

如我更新的问题所列,可以通过调整属于knitr的文件tikz2pdf.tex来设置。下面包含了它的副本,因此您不必自己搜索它。设置块参数engine.opts = list(template = "latex/tikz2pdf.tex")使您可以在呈现TikZ代码之前将任何所需的字体,LaTeX包等放入前导码中。

查看knitr代码,您可以看到texi2dvi用于解析插入了TikZ代码的tikz2pdf.tex文件。 texi2dvi调用pdflatex,如果您需要使用XeLaTeX或LuaLaTeX来使用fontspec包含TrueType字体,那么这会让事情变得混乱。

我确信可以在texi2dvi代码中以某种方式修复它,但更简单的解决方案(至少对我而言)是改变环境。如果我在开始R之前设置了两个环境变量并渲染了本书,那么xelatex会自动用于编译所有代码。在我的bash终端中,这是使用

完成的
export LATEX="xelatex"
export PDFLATEX="xelatex"

瞧!

块变为

```{r, echo=FALSE, engine='tikz', out.width='90%', fig.ext=if (knitr:::is_latex_output()) 'pdf' else 'png', fig.cap='Some caption.', engine.opts = list(template = "latex/tikz2pdf.tex")
}
\begin{tikzpicture}[scale=.7]
\draw [fill=gray!30,very thick] (0,-1) rectangle (5,1);
\draw [very thick] (5, 0) -- (13,0);
\node [below] at (2,-1) {\large Hello};
\node [below, align=center] at (0,-1) {\large Two\\ lines};
\end{tikzpicture}
```

tikz2pdf.tex

\documentclass{article}
\include{preview}
\usepackage[pdftex,active,tightpage]{preview}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{matrix}
%% INSERT YOUR OWN CODE HERE 
\begin{document}
\begin{preview}
%% TIKZ_CODE %%
\end{preview}
\end{document}

我仍然对knitr及相关套餐的整体灵活性感到惊讶。干得好啊!