Включить код TikZ в среду с фигурами

Я хотел бы добавить фигуру TikZ к bookdown документ, чтобы включить некоторые причудливые графики.

Мой основной выходной формат - 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 (используя knitr а также bookdown). Однако я получаю подпись к рисунку, и если html_document тогда это тоже работает, и я вижу график.
  2. Для PDF текст отображается с использованием современного компьютерного шрифта. Я действительно хотел бы изменить это, и основной шрифт в документе LaTeX уже был установлен на что-то другое. Однако, поскольку код отображается локально механизмом TikZ и затем вставляется, он не является частью полного документа LaTeX. Могу ли я добавить некоторые опции LaTeX, пакеты и т. Д., Которые включены в движок TikZ до того, как код будет обработан?

Если есть другие способы включить код TikZ как часть графического окружения, я был бы рад узнать.

Обновление: я думаю, что вторую точку можно исправить, установив engine.opts = list(template = "latex/tikz2pdf.tex") где необходимые настройки для LaTeX включены в tikz2pdf.tex файл. Этот файл читается с использованием LaTeX, но я хотел бы использовать xelatex проанализировать файл, так как я использую fontspec Пакет LaTex. Можно ли это все равно изменить?

2 ответа

Я думаю, что нашел ответ на оба моих вопроса. Это заняло - как заметил Ихуэй - довольно много времени. Я включил ответ здесь, если кому-то это понадобится (или мне позже).

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") позволяет помещать любые нужные шрифты, пакеты LaTeX и т. д. в преамбулу перед визуализацией кода TikZ.

Глядя через knitr код, вы можете видеть, что texi2dvi используется для разбора tikz2pdf.tex файл с вставленным кодом TikZ. texi2dvi звонки pdflatex что портит все в случае, если вам нужно использовать XeLaTeX или LuaLaTeX, чтобы включить шрифты TrueType, используя 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 и связанные пакеты. Хорошая работа Yihui!

У меня были проблемы с составлением сюжетов с Thepgfplotsиbookdown. С использованиемengine='tikz', выдало сообщение об ошибке: «осевая среда не существует». Я исправил это, изменив\usepackage{tikz}к\usepackage{pgfplots}вtikz2pdf.texфайл и с помощьюengine.opts = list(template ="Tikz2pdf.tex")как было предложено.

Другие вопросы по тегам