This can also be done with TikZ and a \matrix
(or tikz-cd
) though it gets complicated for more than three dimensions.
Here is a approach that shifts every already placed node for dimension n in the dimension n + 1, n + 2, …, n total and connects it with its parent node (->
).
The \currentTransform
macro is setup in a way that it contains for every node all applied transformation (from 0-0
), this is used to connect the nodes in their own dimension (<->
). (A good reason for a grouped \foreach
loop.)
Code
\documentclass[tikz,convert=false]{standalone}
% a little support for all the keys
\def\hyperset{\pgfqkeys{/tikz/hyper}}
\tikzset{hypher/.code=\hyperset{#1}}
% Dimension setup
\hyperset{
set color/.code 2 args={\colorlet{tikz@hyper@dimen@#1}{#2}},
set color={0}{black},
set color={1}{blue!50!black},
set color={2}{red},
set color={3}{green},
set color={4}{yellow!80!black}}
\hyperset{
set dimens/.style args={#1:(#2)}{
dimen #1/.style={/tikz/shift={(#2)}}},
set dimens=0:(0:0),
set dimens=1:(right:1),
set dimens=2:(up:1),
set dimens=3:(30:.75),
set dimens=4:(180+70:.5),
every hyper node/.style 2 args={%
shape=circle,
inner sep=+0pt,
fill,
draw,
minimum size=+3pt,
color=tikz@hyper@dimen@#1,
label={[hyper/label #1/.try, hyper/dimen #1 style/.try]#1-#2}
},
every hyper edge/.style={draw},
every hyper shift edge/.style={->,tikz@hyper@dimen@#1!80},
every normal hyper edge/.style={<->,tikz@hyper@dimen@#1!40},
}
\newcommand*{\hyper}[1]{% #3 = max level
\def\currentTransform{}
\node[hyper/every hyper node/.try={0}{0}, hyper/dimen 0 node/.try] (0-0) {};
\hyperhyper{0}{0}{#1}}
\newcommand*{\hyperhyper}[3]{% #1 = current level
% #2 = current number
% #3 = maxlevel
\foreach \dimension in {#3,...,\the\numexpr#1+1\relax} {
\edef\newNumber{\the\numexpr#2+\dimension\relax}
\node[hyper/every hyper node/.try={\dimension}{\newNumber}, hyper/dimen \dimension node/.try, hyper/dimen \dimension\space style/.try] at ([hyper/dimen \dimension] #1-#2) (\dimension-\newNumber) {};
\path (#1-#2) edge[hyper/every hyper edge/.try=\dimension, hyper/every hyper shift edge/.try=\dimension, hyper/dimen \dimension\space style/.try] (\dimension-\newNumber);
\ifnum\newNumber>\dimension\relax
\foreach \oldShift in \currentTransform {
\if\relax\detokenize\expandafter{\oldShift}\relax\else
\path (\dimension-\newNumber) edge[hyper/every hyper edge/.try=\dimension, hyper/every normal hyper edge/.try=\dimension, hyper/dimen \dimension\space style/.try] (\dimension-\the\numexpr\newNumber-\oldShift\relax);
\fi
}
\fi
\edef\currentTransform{\dimension,\currentTransform}%
\ifnum\dimension<#3\relax
\edef\temp{{\dimension}{\the\numexpr#2+\dimension\relax}{#3}}
\expandafter\hyperhyper\temp
\fi
}
}
\tikzset{
@only for the animation/.style={
hyper/dimen #1 style/.style={opacity=0}}}
\begin{document}
\foreach \DIM in {0,...,4,4,3,...,0} {
\begin{tikzpicture}[
>=stealth,
scale=3,
every label/.append style={font=\tiny,inner sep=+0pt}, label position=above left,
@only for the animation/.list={\the\numexpr\DIM+1\relax,...,5}
]
\hyper{4}
\end{tikzpicture}}
\end{document}
Output

Algorithm (beamer
, step-for-step)
