在 rmarkdown 的 tikz 节点标签中使用项目符号列表
Using bullets list in tikz's node label in rmarkdown
我有一个 tikz 代码可以生成一些在 latex
中正常工作的图表(在背面测试:https://www.overleaf.com)。但是,这应该是大型 rmarkdown
文件的一部分,但在 rmarkdown
中我似乎无法在我的某些节点标签中使用项目符号列表。我的问题是:
- 如何在
rmarkdown
中使用项目符号列表作为 tikz 的节点标签?
- 如何自定义该列表以包含一些格式,如颜色、边距等?
- 使用
\newlist
、\setlist
时 latex
中定义的东西在使用 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
- 第一项
- 第二项
在节点标签中。
如果你想在一个有段落、换行等的节点中包含复杂的文本,你需要把它放在一个盒子里,比如 parbox 或 minipage。否则,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}
我更改了你的 BulletColor,因为文本几乎是白色的并且看不见。
Alain Merigot 解决了您的 Tikz 问题。您的其他问题具体与 R Markdown 有关。我会尝试解决这些问题。
您在评论中询问将他给您的代码放在哪里。要解决这个问题,您需要考虑 R Markdown 流程。 tikz
代码块中的所有代码都将插入到 tikz2pdf.tex
中 %% TIKZ_CODE %%
所在的行。但是你没有那行,所以你需要添加它。然后 LaTeX 将处理该文件以生成图形。因此图中将使用的任何内容都必须进入您的 tikz2pdf.tex
模板。这是 Alain 添加的大部分内容。
LaTeX 生成图形后,将在您的主文件中再次调用它,它将有某种 \includegraphics
宏来将图形包含在您的主文件中。如果您还想要主文件中的任何这些定义(例如,您想要在两个地方使用相同的颜色),您也必须在那里重复定义。他们应该在代码块之外。如果他们需要在 header 中(例如 \usepackage
调用),则需要
在 YAML 中。
以下是使用 Alain 的 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}
```
这会生成一个包含
的页面
注意:我在编辑模板时在代码块中设置了 cache = FALSE
。如果不这样做,knitr
将不会查看对模板的更改,除非 tikz
块也发生了更改。停止缓存可以避免开发过程中的混乱。对模板感到满意后,您可以再次打开缓存以加快速度。
我有一个 tikz 代码可以生成一些在 latex
中正常工作的图表(在背面测试:https://www.overleaf.com)。但是,这应该是大型 rmarkdown
文件的一部分,但在 rmarkdown
中我似乎无法在我的某些节点标签中使用项目符号列表。我的问题是:
- 如何在
rmarkdown
中使用项目符号列表作为 tikz 的节点标签? - 如何自定义该列表以包含一些格式,如颜色、边距等?
- 使用
\newlist
、\setlist
时latex
中定义的东西在使用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
- 第一项
- 第二项
在节点标签中。
如果你想在一个有段落、换行等的节点中包含复杂的文本,你需要把它放在一个盒子里,比如 parbox 或 minipage。否则,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}
我更改了你的 BulletColor,因为文本几乎是白色的并且看不见。
Alain Merigot 解决了您的 Tikz 问题。您的其他问题具体与 R Markdown 有关。我会尝试解决这些问题。
您在评论中询问将他给您的代码放在哪里。要解决这个问题,您需要考虑 R Markdown 流程。 tikz
代码块中的所有代码都将插入到 tikz2pdf.tex
中 %% TIKZ_CODE %%
所在的行。但是你没有那行,所以你需要添加它。然后 LaTeX 将处理该文件以生成图形。因此图中将使用的任何内容都必须进入您的 tikz2pdf.tex
模板。这是 Alain 添加的大部分内容。
LaTeX 生成图形后,将在您的主文件中再次调用它,它将有某种 \includegraphics
宏来将图形包含在您的主文件中。如果您还想要主文件中的任何这些定义(例如,您想要在两个地方使用相同的颜色),您也必须在那里重复定义。他们应该在代码块之外。如果他们需要在 header 中(例如 \usepackage
调用),则需要
在 YAML 中。
以下是使用 Alain 的 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}
```
这会生成一个包含
的页面注意:我在编辑模板时在代码块中设置了 cache = FALSE
。如果不这样做,knitr
将不会查看对模板的更改,除非 tikz
块也发生了更改。停止缓存可以避免开发过程中的混乱。对模板感到满意后,您可以再次打开缓存以加快速度。