gpt4 book ai didi

r - 在 bookdown 图形环境中包含 TikZ 代码

转载 作者:行者123 更新时间:2023-12-04 10:09:58 25 4
gpt4 key购买 nike

我想在 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}
    ```

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

  • 如果有其他方法可以将 TikZ 代码作为图形环境的一部分包含在内,那么我很乐意知道。

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

    最佳答案

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

    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用于解析 tikz2pdf.tex插入 TikZ 代码的文件。 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 的整体灵活性感到惊讶和相关的包。艺辉干得好!

    关于r - 在 bookdown 图形环境中包含 TikZ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47358934/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com