【问题标题】:Include TikZ code in bookdown figure environment在 bookdown figure 环境中包含 TikZ 代码
【发布时间】:2017-11-17 20:41:05
【问题描述】:

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

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

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

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

更新:我猜第二点可以通过设置engine.opts = list(template = "latex/tikz2pdf.tex") 来解决,其中LaTeX 的必要设置包含在tikz2pdf.tex 文件中。该文件是使用 LaTeX 读取的,但我想使用 xelatex 来解析文件,因为我使用的是 fontspec LaTex 包。还能改吗?

【问题讨论】:

  • 我只能说这是可能的,但我没有时间调查它。您必须非常非常深入地查看 knitr 的源代码才能弄清楚(可能需要对 knitr 进行一些更改)。
  • pandoc 过滤器可能会有所帮助 pandoc.org/lua-filters.html#building-images-with-tikz

标签: r knitr r-markdown bookdown tikzdevice


【解决方案1】:

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

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

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

Re 2) 修改字体

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

查看knitr代码,可以看到texi2dvi用于解析插入TikZ代码的tikz2pdf.tex文件。 texi2dvi 调用 pdflatex 会搞砸,以防您需要使用 XeLaTeX 或 LuaLaTeX 来包含使用 fontspec 的 TrueType 字体。

我确信可以在texi2dvi 代码中以某种方式解决这个问题,但一个更简单的解决方案(至少对我而言)是改变环境。如果我设置两个环境变量before 启动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 和相关软件包的整体灵活性感到惊讶。一辉干得好!

【讨论】:

  • 我已经在 ubuntu 上安装了 texinfoimagemagick 软件包,但它可以工作!谢谢!
  • 关于 2) 你也可以看看这个答案:stackoverflow.com/a/51143900/8416610
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多