7

我想在bookdown文档中添加一个 TikZ 图形,以包含一些精美的图形。

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

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

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

```{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}
```

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

  1. knitr渲染到 gitbook(使用and bookdown)时,我没有得到任何输出。但是,我确实得到了图形标题,如果我渲染html_document它,它也可以工作,我可以看到图形。
  2. 对于 PDF,文本使用计算机现代字体呈现。我真的很想更改它,并且 LaTeX 文档中的主要字体已经设置为其他字体。但是,由于代码是由 TikZ 引擎在本地渲染然后插入的,因此它不是完整 LaTeX 文档的一部分。我可以在渲染代码之前添加一些 TikZ 引擎包含的 LaTeX 选项、包等吗?

如果还有其他方法可以将 TikZ 代码包含在图形环境中,那么我很高兴知道。

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

4

1 回答 1

8

我想我找到了两个问题的答案。正如易辉指出的那样,它确实花了相当长的时间。我在这里包括答案,以防其他人需要这个(或者我自己在以后)。

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

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

Re 2) 修改字体

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

查看knitr代码,您可以看到它texi2dvi用于解析tikz2pdf.tex插入了 TikZ 代码的文件。texi2dvi如果您需要pdflatex使用 XeLaTeX 或 LuaLaTeX 来包含使用fontspec.

我确信可以在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相关软件包的整体灵活性感到惊讶。一辉干得好!

于 2017-11-21T09:35:08.207 回答