Использование списка маркеров в метке узла tikz в rmarkdown - PullRequest
1 голос
/ 16 июня 2019

У меня есть код tikz для генерации некоторых графиков, которые работают должным образом в latex (проверено на оборотной стороне: https://www.overleaf.com). Однако, предполагается, что это часть большого файла rmarkdown, но я не могу использовать список маркеров в некоторых из моих ярлыков узлов в rmarkdown. Мои вопросы:

  • как я могу использовать список пуль в качестве метки узла tikz в rmarkdown?
  • как мне настроить этот список, включив в него некоторое форматирование, такое как цвет, поля и т. Д .?
  • Куда идут вещи, определенные в latex с использованием \newlist, \setlist при использовании rmarkdown?

Я мог бы сгенерировать эти цифры в latex и включить их, используя knitr :: include_graphics (...), но я предпочитаю использовать более автоматический способ, где я мог бы просто позволить коду генерировать фигуры и встраивать их по мере их появления в файл.

    ---
    title: "Title"
    author: "Me"
    output:
      bookdown::pdf_document2:
        keep_tex: yes
        latex_engine: xelatex
    ---

Следующее отлично работает вне блока knitr.

    p
    \begin{itemize}
    \item first item
    \item second item
    \end{itemize}

Он также будет работать внутри блока knitr как метка узла, когда эта метка не включает список элементов. В противном случае это приводит к: ! LaTeX Error: Something's wrong--perhaps a missing \item.

    ```{tikz, tikz-ex, echo=F, fig.cap = "Funky tikz", fig.ext = 'png', cache=TRUE, eval=T, engine.opts = list(template = "tikz2pdf.tex")}

    \usetikzlibrary{arrows, shapes}

    \definecolor{myColor}{rgb}{0.98, 0.94, 0.9}

    \begin{tikzpicture}

    \tikzstyle {stile} = [
    ellipse,
    draw=myColor,
    fill=myColor,
    thick,
    inner sep=0pt,
    text centered, 
    align=center
    ]

    \node [stile](P){
    p
    \begin{itemize}
    \item first item
    \item second item
    \end{itemize}
    };

    \end{tikzpicture}

Файл tikz2pdf.tex содержит следующее:

    \documentclass{article}

    \include{preview}
    \usepackage[utf8]{inputenc}
    \usepackage[skins]{tcolorbox}
    \usepackage{
    tikz,
    enumitem,
    xcolor
    }

    \usetikzlibrary{
    shapes,
    arrows
    }

    \begin{document}

    \begin{preview}
    \end{preview}

    \end{document}

В конечном счете, я хотел бы настроить этот список, чтобы изменить форматирование элементов, таких как цвета, поля и т. Д. Для этого у меня есть следующий код, который также работает в latex, но я не уверен, куда его поместить при использовании rmarkdown.

    \definecolor{BulletsColor}{rgb}{0.98, 0.94, 0.9}
    \newlist{myBullets}{itemize}{1}

    \setlist[myBullets]{
    label=\textcolor{BulletsColor}{\textbullet},
    leftmargin=*,
    topsep=0ex,
    partopsep=0ex,
    parsep=0ex,
    itemsep=0ex,
    before={\color{BulletsColor}\itshape}
    }

В идеале я бы хотел использовать это так же, как я бы использовал в latex как:

    \node [stile](P){
    p
    \begin{myBullets}
    \item first item
    \item second item
    \end{myBullets}
    };

Я ожидаю (и извините, что не смогу предоставить полную картину) результат будет примерно таким:

P

  • первый предмет
  • второй пункт

в метке узла.

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Ален Мериго решил твою проблему с Тикз.Другие ваши проблемы связаны именно с R Markdown.Я постараюсь обратиться к ним.

Вы спросили в комментарии, куда поместить код, который он дал вам.Чтобы решить это, вам нужно подумать о процессе R Markdown.Весь код в вашем кодовом блоке tikz будет вставлен в ваш tikz2pdf.tex в строке, где у вас есть %% TIKZ_CODE %%.Но у вас нет этой строки, поэтому вам нужно добавить ее.Затем LaTeX обработает этот файл для создания фигуры.Поэтому все, что будет использовано на рисунке, должно входить в ваш шаблон tikz2pdf.tex.Это большинство добавлений Алена.

После того, как LaTeX создаст рисунок, он снова будет вызван в вашем главном файле, который будет иметь своего рода макрос \includegraphics для включения рисунка в ваш основной файл.Если вам также нужно какое-либо из этих определений в основном файле (например, вы хотите, чтобы в обоих местах был один и тот же цвет), вам также придется повторить определения там.Они должны выходить за пределы фрагмента кода.Если они должны быть в заголовке (например, \usepackage вызовы), они должны быть в YAML.

Вот модификации вашего примера с использованием кода Алена Tikz.

tikz2pdf.tex:

\documentclass{article}
\usepackage[pdftex,active,tightpage]{preview}
\usepackage[utf8]{inputenc}
\usepackage[skins]{tcolorbox}
\usepackage{
tikz,
enumitem,
xcolor
}
\begin{document}

\definecolor{BulletsColor}{rgb}{0, 0, 0.9}
\definecolor{myColor}{rgb}{0.98, 0.94, 0.9}
\newlist{myBullets}{itemize}{1}

\setlist[myBullets]{
  label=\textcolor{BulletsColor}{\textbullet},
  leftmargin=*,
  topsep=0ex,
  partopsep=0ex,
  parsep=0ex,
  itemsep=0ex,
  before={\color{BulletsColor}\itshape}
}

\tikzstyle {stile} = [
ellipse,
draw=BulletsColor,
fill=myColor,
thick,
inner sep=0pt,
text centered, 
align=center
]

\begin{preview}
%% TIKZ_CODE %%
\end{preview}

\end{document}

Title.Rmd:

---
title: "Title"
author: "Me"
output:
  bookdown::pdf_document2:
    keep_tex: yes
    latex_engine: xelatex
---


```{tikz tikz-ex, echo=FALSE, fig.cap = "Funky tikz", fig.ext = 'pdf', cache=FALSE, eval=TRUE, engine.opts = list(template = "tikz2pdf.tex")}
\usetikzlibrary{
shapes,
arrows
}
\begin{tikzpicture}

\node[stile] (a){
\begin{minipage}{2.5cm}
p
\begin{myBullets}
\item first item
\item second item
\end{myBullets}
\end{minipage}
};

\end{tikzpicture}
```

Создает страницу, содержащую

screenshot

Примечание: я установил cache = FALSE в блоке кода, когда редактировал шаблон.Если вы этого не сделаете, knitr не будет смотреть на изменения в шаблоне, пока не будут внесены также изменения в блок tikz.Остановка кэширования позволяет избежать путаницы во время разработки.Когда вы будете довольны шаблоном, вы можете снова включить кеширование, чтобы ускорить процесс.

1 голос
/ 16 июня 2019

Если вы хотите иметь сложный текст в узле с абзацем, разрывом строки и т. Д., Вам нужно поместить его в поле, например, в парбокс или мини-страницу.В противном случае, tikz не сможет определить ширину текста и выполнить любое форматирование.

\documentclass{article}

\usepackage{tikz}
\usepackage{enumitem}

\begin{document}
\definecolor{BulletsColor}{rgb}{0, 0, 0.9}
\newlist{myBullets}{itemize}{1}

\setlist[myBullets]{
  label=\textcolor{BulletsColor}{\textbullet},
  leftmargin=*,
  topsep=0ex,
  partopsep=0ex,
  parsep=0ex,
  itemsep=0ex,
  before={\color{BulletsColor}\itshape}
}


\begin{tikzpicture}
  \node[draw, rounded corners] (a)  {
    \begin{minipage}{2.5cm}
      p
      \begin{myBullets}
      \item first item
      \item second item
      \end{myBullets}
    \end{minipage}
  }
  ;
  \end{tikzpicture}
\end{document}

enter image description here

Я изменил ваш BulletColor, так как текст был почти белым и невидимым.

...