Включить код 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}
```
Однако есть две проблемы с кодом:
- Я не получаю вывод при рендеринге в gitbook (используя
knitr
а такжеbookdown
). Однако я получаю подпись к рисунку, и еслиhtml_document
тогда это тоже работает, и я вижу график. - Для 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")
как было предложено.