TikZ:从 smartdiagram 包向圆形图添加节点

TikZ:从 smartdiagram 包向圆形图添加节点

这就是我想要实现的目标:

在此处输入图片描述

我的 MWE 如下:

\documentclass{article}
\pagestyle{empty}

\usepackage{lmodern}

\usepackage{smartdiagram}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{positioning}

\tikzstyle{every picture}+=[remember picture]

\smartdiagramset{%
circular distance=40mm,
font=\normalsize,
text width=20mm,
module minimum width=30mm,
module minimum height=30mm,
module shape=diamond,
arrow tip=to,
%uniform arrow color=true,
arrow color=gray!50!black,
border color=black,
set color list={white,white,white,white,white,white}
}

\tikzstyle{mystyle}=[align=center,fill=white,drop shadow,draw,thick,circle,overlay,minimum width=20mm,text width=25mm]

\begin{document}
~\vfill
\smartdiagram[circular diagram]{a, b, c, d, e, f}
\tikz \node (a) [mystyle,above=10mm of module1] {Start}; 
\tikz \node (b) [mystyle,right=10mm of module6] {Finish};
\begin{tikzpicture}[overlay,>=to]
\path[->,gray!50!black,line width=3pt,fill=gray!50!black] (a) edge (module1);
\path[->,gray!50!black,line width=3pt,fill=gray!50!black] (module6) edge (b);
\end{tikzpicture}
\vfill
\end{document}

我会以更直观的方式实现类似的结果。如您所见,我需要进入内部smartdiagram.sty才能知道节点的命名方式,然后我需要使用overlay。此外,欢迎提出有关开始和结束的建议。

答案1

使用该软件包的 0.3 版本(已在 CTAN 上发送,因此几天后即可在 TeXLive 上获取),创建这样的图表会更容易一些。

代码:

\documentclass[12pt]{article} 
\usepackage{smartdiagram}
\usesmartdiagramlibrary{additions} % library to create annotations 
\usetikzlibrary{shapes.geometric}
\begin{document} 
\begin{center}
\smartdiagramset{%
 circular distance=40mm,
 text width=20mm,
 module minimum width=30mm,
 module minimum height=30mm,
 module shape=diamond,
 arrow tip=to,
 uniform arrow color=true,
 arrow color=gray!50!black,
 border color=black,
 uniform color list=white for 6 items, % new key to make colors uniform easily
 circular final arrow disabled=true, % new key to remove the final arrow
 additions={
   additional item offset=15mm,
   additional item shape=circle,
   additional item border color=black,
   additional item shadow=drop shadow,
   additional arrow color=gray!50!black,
 }
}
\smartdiagramadd[circular diagram]{a, b, c, d, e, f}{
above of module1/Start,right of module6/End}
\smartdiagramconnect{-to}{additional-module1/module1}
\smartdiagramconnect{-to}{module6/additional-module2}
\end{center}
\end{document}

结果:

在此处输入图片描述

这种方法不再受到可添加数量的限制。


第一个版本

首先声明:我提供的解决方案作品当且仅当必须添加一个开始结尾参见图表。

它提供了一个新命令\smartdiagramadd,可以设置通常的图表以及开始/结束:它接收 3 个参数:

  1. 图表类型
  2. 图表中的元素列表
  3. position/text开始,position/text结束(例如above/Start,right/End:)。

它可以用作:

\smartdiagramadd[circular diagram]{a, b, c, d, e, f}{above/Start,right/End}

此外,该解决方案允许通过两个新键自定义开始/结束模块的距离:

\pgfkeys{/smart diagram/.cd,
  add start module offset/.initial=10mm,
  add start module offset/.get=\addstartmodoffset,
  add start module offset/.store in=\addstartmodoffset,
  add end module offset/.initial=10mm,
  add end module offset/.get=\addendmodoffset,
  add end module offset/.store in=\addendmodoffset,
}

它们应始终在内使用\smartdiagramset;例如:

\smartdiagramset{add end module offset=20mm}

现在,代码:

\documentclass{article}
\pagestyle{empty}

\usepackage{lmodern}

\usepackage{smartdiagram}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{positioning}

\pgfkeys{/smart diagram/.cd,
  add start module offset/.initial=10mm,
  add start module offset/.get=\addstartmodoffset,
  add start module offset/.store in=\addstartmodoffset,
  add end module offset/.initial=10mm,
  add end module offset/.get=\addendmodoffset,
  add end module offset/.store in=\addendmodoffset,
}

\smartdiagramset{%
circular distance=40mm,
font=\normalsize,
text width=20mm,
module minimum width=30mm,
module minimum height=30mm,
module shape=diamond,
arrow tip=to,
uniform arrow color=true,
arrow color=gray!50!black,
border color=black,
set color list={white,white,white,white,white,white}
}

\tikzset{module start-end/.style={
  align=center,
  fill=white,
  drop shadow,
  draw,
  thick,
  circle,
  minimum width=20mm,
  text width=25mm}
}


\NewDocumentCommand{\smartdiagramadd}{r[] m m}{
\tikzstyle{every picture}+=[remember picture]
\smartdiagram[#1]{#2}
\begin{tikzpicture}[overlay]
\foreach \smitem [count=\xi] in {#2}  {\global\let\numitems\xi}
\StrCut{#3}{,}\startdiagram\enddiagram
% start
\StrCut{\startdiagram}{/}\pos\textitem
 \node (module1-start) [module start-end,\pos=\addstartmodoffset of module1] {\textitem}; 
 \path[->,gray!50!black,line width=3pt,fill=gray!50!black] 
  (module1-start) edge (module1);
% end
\StrCut{\enddiagram}{/}\pos\textitem 
 \node (module\numitems-end) [module start-end,\pos=\addendmodoffset of module\numitems] {\textitem};
 \path[->,gray!50!black,line width=3pt,fill=gray!50!black] 
  (module\numitems) edge (module\numitems-end); 
\end{tikzpicture}
}

\begin{document}
\begin{center}
\smartdiagramset{add end module offset=20mm}
\smartdiagramadd[circular diagram]{a, b, c, d, e, f}{above/Start,right/End}
\end{center}
\end{document}

给出的结果(类似于 OP 提供的图片,但最终模块很远):

在此处输入图片描述

免责声明

此解决方案仅适用于smartdiagram已加载的 0.2 版本xstring,否则应单独加载该包。

相关内容