This question led to a new package:
smartdiagram
[1]
I haven't been using PowerPoint for years, but today I immediately fell in love with its "Smart Art" feature (2010 version of PowerPoint). The idea is that an (indented) bullet list is transformed automatically into a process diagram, a tree, a Venn diagram and whatnot. This allows creating simple yet expressive graphics in less than one minute.
Input:
Set up / adapt
Run
Analyze
Modify / add
Output:
I know that TikZ already contains code for most shapes needed to build these graphics. What would be missing is a preprocessor to convert these bulletted list to TikZ code, perhaps within (Lua)LaTeX or as standalone preprocessor. (Of course, "normal" LaTeX syntax would do just as well.) Is anyone aware of such a tool?
EDIT: Of course, TikZ can draw Lindenmayer systems, petri nets, automata etc. -- difficult to do that with PowerPoint. But, say, what about a "Process" library that would visualize process chains based on a simple syntax?
EDIT^2: Of course, we could also turn this question into a collection of diagram-producing commands, and later bundle it as something pluggable, like a package/library!
EDIT^3: The above circular process diagram is not the only "smart art" design available. There are other examples, some are more useful, some less. What is your favorite?
Here is one possibility: it's based on a list, but not on itemize
environments. Indeed I recall
Arrows coordinates in TikZ
[1] and adapted the things to:
Now you have basically to insert your list inside a command \smartart
or \smartartov
(for the automatic animation), but I don't know how much you will find the answer suitable for your needs.
Here is the code:
\documentclass{beamer}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{calc,shadows}
\makeatletter
\@namedef{color@1}{red!30}
\@namedef{color@2}{cyan!30}
\@namedef{color@3}{blue!30}
\@namedef{color@4}{green!30}
\@namedef{color@5}{magenta!30}
\@namedef{color@6}{yellow!30}
\@namedef{color@7}{orange!30}
\@namedef{color@8}{violet!30}
\newcommand{\smartart}[1]{%
\begin{tikzpicture}[every node/.style={align=center}]
\foreach \gritem [count=\xi] in {#1} {\global\let\maxgritem\xi}
\foreach \gritem [count=\xi] in {#1}
{%
\pgfmathtruncatemacro{\angle}{360/\maxgritem*\xi}
\edef\col{\@nameuse{color@\xi}}
\node[rectangle,
rounded corners,
thick,
draw=gray,
top color= white,
bottom color=\col,
drop shadow,
text width=1.75cm,
minimum width=2cm,
minimum height=1cm,
font=\small] (satellite\xi) at (\angle:2.75cm) {\gritem };
}%
\foreach \gritem [count=\xi] in {#1}
{%
\pgfmathtruncatemacro{\xj}{mod(\xi, \maxgritem) + 1)}
\edef\col{\@nameuse{color@\xj}}
\draw[<-,>=stealth,line width=.1cm,\col,shorten <=0.3cm,shorten >=0.3cm] (satellite\xj) to[bend left] (satellite\xi);
}%
\end{tikzpicture}
}%
\tikzset{
invisible/.style={opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
},
}
\newcommand{\smartartov}[1]{%
\begin{tikzpicture}[every node/.style={align=center}]
\foreach \gritem [count=\xi] in {#1} {\global\let\maxgritem\xi}
\foreach \gritem [count=\xi] in {#1}
{%
\pgfmathtruncatemacro{\angle}{360/\maxgritem*\xi}
\edef\col{\@nameuse{color@\xi}}
\node[rectangle,
rounded corners,
thick,
draw=gray,
top color= white,
bottom color=\col,
drop shadow={visible on=<\xi->},
text width=1.75cm,
minimum width=2cm,
minimum height=1cm,
font=\small,
visible on=<\xi->] (satellite\xi) at (\angle:2.75cm) {\gritem };
}%
\foreach \gritem [count=\xi] in {#1}
{%
\pgfmathtruncatemacro{\xj}{mod(\xi, \maxgritem) + 1)}
\pgfmathtruncatemacro{\adv}{\xi + 1)}
\edef\col{\@nameuse{color@\xi}}
\draw[<-,>=stealth,line width=.1cm,\col,shorten <=0.3cm,shorten >=0.3cm,
visible on=<\adv->] (satellite\xj) to[bend left] (satellite\xi);
}%
\end{tikzpicture}
}%
\makeatother
\begin{document}
\begin{frame}{Smart art}
\begin{center}
\smartartov{Set up~/ Adapt,Run,Analyze,Modify~/ Add}
\end{center}
\end{frame}
\end{document}
The diagram created by means of \smartart
is:
The animation created by means of \smartartov
:
I've seen EDIT^3, and I agree that one could also display differently the diagram, for example as a standard flow chart. A couple of weeks ago I built a library to draw switching architectures ( link [2]) in which main problem was similar, how to display automatically in a vertical fashion a given number of modules. Putting things together, two new commands are available:
\smartartflow
to create the flow diagram\smartartflowov
to create the flow diagram automatically overlay aware.The code:
\documentclass{beamer}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{calc,shadows}
\makeatletter
\@namedef{color@1}{red!30}
\@namedef{color@2}{cyan!30}
\@namedef{color@3}{blue!30}
\@namedef{color@4}{green!30}
\@namedef{color@5}{magenta!30}
\@namedef{color@6}{yellow!30}
\@namedef{color@7}{orange!30}
\@namedef{color@8}{violet!30}
\pgfmathsetmacro{\moduleysep}{1.2} % default value
\newcommand{\setmoduleysep}[1]{\pgfmathsetmacro{\moduleysep}{#1}}
\newcommand{\smartartflow}[1]{%
\begin{tikzpicture}[every node/.style={align=center}]
\foreach \gritem [count=\xi] in {#1} {\global\let\maxgritem\xi}
\foreach \gritem [count=\xi] in {#1}
{%
\edef\col{\@nameuse{color@\xi}}
\path let \n1 = {int(0-\xi)}, \n2={0-\xi*\moduleysep}
in node[rectangle,
rounded corners,
thick,
draw=gray,
top color= white,
bottom color=\col,
drop shadow,
text width=1.75cm,
minimum width=2cm,
minimum height=1cm,
font=\small] (satellite\xi) at +(0,\n2) {\gritem};
}%
\foreach \gritem [count=\xi] in {#1}
{%
\pgfmathtruncatemacro{\xj}{mod(\xi, \maxgritem) + 1)}
\edef\col{\@nameuse{color@\xj}}
\ifnum\xi<\maxgritem
\draw[<-,>=stealth,line width=.1cm,\col,] (satellite\xj) -- (satellite\xi);
\fi
\ifnum\xi=\maxgritem
\draw[<-,>=stealth,line width=.1cm,\col,] (satellite\xj.east)--($(satellite\xj.east)+(1,0)$) |- (satellite\xi);
\fi
}%
\end{tikzpicture}
}
\tikzset{
invisible/.style={opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
},
}
\newcommand{\smartartflowov}[1]{%
\begin{tikzpicture}[every node/.style={align=center}]
\foreach \gritem [count=\xi] in {#1} {\global\let\maxgritem\xi}
\foreach \gritem [count=\xi] in {#1}
{%
\edef\col{\@nameuse{color@\xi}}
\path let \n1 = {int(0-\xi)}, \n2={0-\xi*\moduleysep}
in node[rectangle,
rounded corners,
thick,
draw=gray,
top color= white,
bottom color=\col,
drop shadow={visible on=<\xi->},
text width=1.75cm,
minimum width=2cm,
minimum height=1cm,
font=\small,
visible on=<\xi->] (satellite\xi) at +(0,\n2) {\gritem};
}%
\foreach \gritem [count=\xi] in {#1}
{%
\pgfmathtruncatemacro{\adv}{\xi + 1)}
\pgfmathtruncatemacro{\xj}{mod(\xi, \maxgritem) + 1)}
\edef\col{\@nameuse{color@\xj}}
\ifnum\xi<\maxgritem
\draw[<-,>=stealth,line width=.1cm,\col,visible on=<\adv->] (satellite\xj) -- (satellite\xi);
\fi
\ifnum\xi=\maxgritem
\draw[<-,>=stealth,line width=.1cm,\col,visible on=<\adv->] (satellite\xj.east)--($(satellite\xj.east)+(1,0)$) |- (satellite\xi);
\fi
}%
\end{tikzpicture}
}
\makeatother
\begin{document}
\begin{frame}{Smart art flow}
\setmoduleysep{1.75} % to adjust the module separation
\begin{center}
\smartartflowov{Set up~/ Adapt,{Run, Compile},Analyze,Modify~/ Add, Build}
\end{center}
\end{frame}
\end{document}
The flow diagram created by means of \smartartflow
is:
The animation created by means of \smartartflowov
:
The code developed in the answer has been the base of the package
smartdiagram
[3]. Its macros are built on top of TikZ which is built on top of PGF: ok we can graphically see this with a priority descriptive diagram
.
The code:
\documentclass{beamer}
\usepackage{smartdiagram}
\begin{document}
\begin{frame}
\begin{center}
\smartdiagramset{set color list={blue!50!cyan,green!60!lime,orange!50!red},
descriptive items y sep=1.5}
\smartdiagramanimated[priority descriptive diagram]{PGF,Ti\textit{k}Z,Smartdiagram}
\end{center}
\end{frame}
\end{document}
The result:
One point not yet well documented is the possibility of declaring a priori styles, for example when you want to repeat several times a diagram with the same properties. So it is sufficient to declare:
\smartdiagramset{diagram style/.style={module shape=diamond,font=\scriptsize,
module minimum width=1cm,module minimum height=1cm,text width=1cm}}
Then a possible use is:
\documentclass[11pt,a4paper]{article}
\usepackage{smartdiagram}
\usetikzlibrary{shapes.geometric} % for the diamond
\smartdiagramset{diagram style/.style={module shape=diamond,font=\scriptsize,
module minimum width=1cm,module minimum height=1cm,text width=1cm}}
\begin{document}
\begin{center}
\smartdiagramset{diagram style, arrow tip=to}
\smartdiagram[circular diagram]{Do, This, Only,For, Me}
\end{center}
\begin{center}
\smartdiagramset{diagram style, module y sep=2.5}
\smartdiagram[flow diagram]{Do, This,For, Me}
\end{center}
\end{document}
[1] https://tex.stackexchange.com/questions/52961/arrows-coordinates-in-tikz:)
The only new thing here is just the method to make the diagram overlay-aware. - Claudio Fiandrino
{}
the label; for example: \smartartov{{Build,Set up~/ Adapt},Run,Analyze,Modify~/ Add}
- Claudio Fiandrino
chains
for example), so personally I post two answers on the same question if and only if the approaches used are different. For the name.. well, at the moment I did not had nothing better in mind, but I will change it soon (or if you prefer feel free to edit my answer). - Claudio Fiandrino
:)
- Claudio Fiandrino
decorations
or shapes
. - Daniel
:)
To be honest, I'm working on it (in the spare time or during the pc is doing my theses simulations) and I'm confident to have sooner a first release. - Claudio Fiandrino
\smartdiagram[flow diagram:vertical]{..}
. But there's time (after the thesis)... also because the answer isn't even accepted. - Claudio Fiandrino
\hspace{0pt}
in front of each label, but this is tedious. Is there any way you could implement this? - Glutanimate
priority descriptive diagram
(basically with a reversed arrow)? Are there options to disable the shadows and replace the color gradient filling by a solid filling? - user61658
module
style. - Claudio Fiandrino
module
style, but was unable to. Could you give me a hint how to get the solid filling? - user61658
\pause
from the smartdiagram package? They make things like beamer footlines invisible, see tex.stackexchange.com/q/569232/36296 Instead one could e.g. use \visible<+->{}
around the nodes. - samcarter_is_at_topanswers.xyz
\pause
s - samcarter_is_at_topanswers.xyz
chains
library anyway. What you want to have is to change the color and you are done. I don't think such a library would do any good. - percussechains
is far too powerful for just a simple diagram. Why do you think an abstraction layer that removes most of the complexity for the sake of a simpler usage is useless? Did you have a chance to look at what PowerPoint can do? - krlmlrbeamer
. - percusse[]
syntax. - krlmlr