tikzDevice 在 RMarkdown 文档中使用时不使用 LaTeX 前导码

tikzDevice does not use LaTeX preamble when used in RMarkdown document

我想在 RMarkdown 中使用 tikz 作为图形设备,我希望它包含生成的 LaTeX 序言。

过去,我已经在 knitr 文档中使用了 tikzDevice。 tikzDevice 生成的 tex 文件通常包含我的 knitr/LaTeX 文档中的整个序言。当我将它与 RMarkdown 一起使用时,我得到了标准的序言(见下文)。

RMarkdown 文件:

---
title: "Title"
author: "Me"
fontsize: 12pt
documentclass: scrartcl
output:
  bookdown::pdf_document2:
    toc: true
    fig_caption: true
    keep_tex: true
---

# Introduction

```{r plot, dev="tikz"}
plot(rnorm(50))
``

生成的 tex 文件的开头 (plot-1.tex):

% Created by tikzDevice version 0.12.3 on 2019-06-16 16:09:40
% !TEX encoding = UTF-8 Unicode
\documentclass[10pt]{article}

Desired/expected 剧情开始-1.tex:

% Created by tikzDevice version 0.12.3 on 2019-06-16 16:09:40
% !TEX encoding = UTF-8 Unicode
\documentclass[12pt]{scrartcl}

我不确定您是否真的想要您所要求的。该图将作为一个单独的文档生成,除了该图之外什么都没有,它将被呈现为 PDF。 scrartclarticle 之间的差异不应该影响数字,它们对整个文档很重要。

但如果您确实需要该文档 class,您可以通过在文档早期的 R 块中指定 options(tikzDocumentDeclaration = "\documentclass[12pt]{scrartcl}") 来获得它。当我这样做时,我可以在源代码中看到它有效,但输出看起来与默认 class 时几乎相同。也可以使用块选项来指定它,但这样做不太可能有任何优势。

我想我明白了:

我的问题是,在使用 RMarkdown 时,选项 tikzDocumentDeclarationtikzLatexPackages ...(tikzDevice 的几乎所有选项)都没有自动设置。当您使用 knitr 时,tikzDevice 的选项会在从源文件中拆分标记和代码块的过程中设置。使用 RMarkdown 时,没有 LaTeX 代码可以提取并与 tikz 一起使用,因为 pandoc 在图形呈现后生成它。因此,可以手动定义 tikz... 选项,也可以像 建议的那样使用块选项 external=FALSE

示例minimal_knitr.Rnw:

\documentclass[fontsize=12pt]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\begin{document}

<<r plot, dev='tikz', echo=FALSE>>=
plot(rnorm(50))
@

\end{document}