stackoverflow.com/a/51143900/8416610

ел бы добавить фигуру 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. Можно ли это все равно изменить?

 Yihui Xie21 нояб. 2017 г., 07:28
Все, что я могу сказать, это то, что это возможно, но у меня нет времени, чтобы исследовать это. Вы должны действительно, очень глубоко заглянуть в исходный код knitr, чтобы понять это (это может потребовать некоторых изменений в knitr).
 baptiste22 нояб. 2017 г., 06:21
Фильтры Pandoc могут помочьpandoc.org/lua-filters.html#building-images-with-tikz

Ответы на вопрос(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") позволяет помещать любые нужные шрифты, пакеты 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!

 0xcaff05 февр. 2018 г., 21:19
У меня была установкаtexinfo а такжеimagemagick пакеты на Ubuntu, но это работает! Спасибо!
 Ralf Stubner03 июл. 2018 г., 10:24
Относительно 2) вы также можете посмотреть на этот ответ:stackoverflow.com/a/51143900/8416610

Ваш ответ на вопрос