tda-networks/dissertation/tikz-network.sty
2018-07-30 12:04:51 +01:00

1384 lines
51 KiB
TeX

%=============================================================================
% File: tikz-network.tex -- Library for plotting networks in TikZ
% Author(s): Jürgen Hackl <hackl@ibi.baug.ethz.ch>
% Creation: 28 Feb 2017
% Time-stamp: <Mon 2018-05-21 08:32 juergen>
%
% Copyright (c) 2017 Jürgen Hackl <hackl@ibi.baug.ethz.ch>
% http://www.ibi.ethz.ch
% $Id$
%
% More information on LaTeX: http://www.latex-project.org/
% LaTeX symbol list:
% http://www.ctan.org/tex-archive/info/symbols/comprehensive/symbols-a4.pdf
%=============================================================================
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{tikz-network}
%=============================================================================
% Used packages
%=============================================================================
\RequirePackage{etex}
\RequirePackage{xifthen}
\RequirePackage{xkeyval}[2005/11/25]
\RequirePackage{tikz}
\RequirePackage{datatool}
\RequirePackage{graphicx}
\usetikzlibrary{arrows}
\usetikzlibrary{positioning}
\usetikzlibrary{3d}
\usetikzlibrary{fit}
\usetikzlibrary{calc}
\usetikzlibrary{backgrounds}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{shapes.geometric}
%=============================================================================
%=============================================================================
% Predefined variables
%=============================================================================
%<--------------------------------------------------------------------------->
% Vertex
%<--------------------------------------------------------------------------->
\definecolor{vertexfill}{HTML}{abd7e6}
\newcommand*{\DefaultUnit}{cm}
\newcommand*{\DistanceScale}{1}
\newcommand*{\VertexShape}{circle}
\newcommand*{\VertexInnerSep}{2pt}
\newcommand*{\VertexOuterSep}{0pt}
\newcommand*{\VertexMinSize}{0.6\DefaultUnit}
\newcommand*{\VertexLineWidth}{1pt}
\newcommand*{\VertexLineColor}{black}
\newcommand*{\VertexLineOpacity}{1}
\newcommand*{\VertexTextColor}{black}
\newcommand*{\VertexFillColor}{vertexfill}
\newcommand*{\VertexFillOpacity}{1}
\newcommand*{\VertexTextFont}{\scriptsize}%\tiny}
\newcommand*{\VertexTextRotation}{0}
\newcommand*{\VertexTextOpacity}{1}
%<--------------------------------------------------------------------------->
% Edge
%<--------------------------------------------------------------------------->
\newcommand*{\EdgeArrow}{-latex}
\newcommand*{\EdgeLineWidth}{1.5pt}
\newcommand*{\EdgeColor}{black!75}
\newcommand*{\EdgeOpacity}{1}
\newcommand*{\EdgeTextFillColor}{white}
\newcommand*{\EdgeTextFillOpacity}{1}
\newcommand*{\EdgeInnerSep}{0pt}
\newcommand*{\EdgeOuterSep}{1pt}
\newcommand*{\EdgeTextRotation}{0}
\newcommand*{\EdgeTextOpacity}{1}
\newcommand*{\EdgeTextFont}{\scriptsize}
%<--------------------------------------------------------------------------->
% Plane
%<--------------------------------------------------------------------------->
\newcommand*{\PlaneLineWidth}{1.5pt}
\newcommand*{\PlaneLineColor}{black}
\newcommand*{\PlaneLineOpacity}{1}
\newcommand*{\PlaneGridLineWidth}{.5pt}
\newcommand*{\PlaneGridColor}{black}
\newcommand*{\PlaneGridOpacity}{.5}
\newcommand*{\PlaneFillColor}{vertexfill}
\newcommand*{\PlaneFillOpacity}{.3}
\newcommand*{\PlaneWidth}{5\DefaultUnit}
\newcommand*{\PlaneHeight}{5\DefaultUnit}
%<--------------------------------------------------------------------------->
% Text
%<--------------------------------------------------------------------------->
\newcommand*{\TextInnerSep}{2pt}
\newcommand*{\TextOuterSep}{0pt}
\newcommand*{\TextFont}{\normalsize}
\newcommand*{\TextColor}{black}
\newcommand*{\TextRotation}{0}
\newcommand*{\TextOpacity}{1}
%<--------------------------------------------------------------------------->
% Network
%<--------------------------------------------------------------------------->
\newcommand*{\NetworkLayerDistance}{-2}
\newcommand*{\xAngle}{-12}
\newcommand*{\xLength}{1}
\newcommand*{\yAngle}{37}
\newcommand*{\yLength}{1}
\newcommand*{\zAngle}{90}
\newcommand*{\zLength}{1}
\tikzset{edge canvas/.style={}}
\tikzset{multilayer 2d/.style={y={(0:1cm)},x={(90:1cm)},z={(90:0cm)},every
node/.append style={transform shape},}}
\def\Origin{\draw [->] (0,0,0) -- (2,0,0) node [at end, right] {$y$};
\draw [->] (0,0,0) -- (0,2,0) node [at end, right] {$x$};
\draw [->] (0,0,0) -- (0,0,2) node [at end, left] {$z$};}
%=============================================================================
% Predefined Styles
%=============================================================================
%<--------------------------------------------------------------------------->
% Init Default Vertex Style
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {DVS} {Shape}{}
\define@cmdkey [NW] {DVS} {MinSize}{}
\define@cmdkey [NW] {DVS} {LineWidth}{}
\define@cmdkey [NW] {DVS} {LineColor}{}
\define@cmdkey [NW] {DVS} {LineOpacity}{}
\define@cmdkey [NW] {DVS} {FillColor}{}
\define@cmdkey [NW] {DVS} {FillOpacity}{}
\define@cmdkey [NW] {DVS} {TextColor}{}
\define@cmdkey [NW] {DVS} {TextFont}{}
\define@cmdkey [NW] {DVS} {TextRotation}{}
\define@cmdkey [NW] {DVS} {TextOpacity}{}
\define@cmdkey [NW] {DVS} {InnerSep}{}
\define@cmdkey [NW] {DVS} {OuterSep}{}
\presetkeys [NW] {DVS} {Shape = \VertexShape,
MinSize = \VertexMinSize,
LineWidth = \VertexLineWidth,
LineColor = \VertexLineColor,
FillColor = \VertexFillColor,
LineOpacity = \VertexLineOpacity,
FillOpacity = \VertexFillOpacity,
InnerSep = \VertexInnerSep,
OuterSep = \VertexOuterSep,
TextColor = \VertexTextColor,
TextRotation = \VertexTextRotation,
TextOpacity = \VertexTextOpacity,
TextFont = \VertexTextFont}{}
%<--------------------------------------------------------------------------->
% Init Default Edge Style
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {DES} {Arrow}{}
\define@cmdkey [NW] {DES} {LineWidth}{}
\define@cmdkey [NW] {DES} {Color}{}
\define@cmdkey [NW] {DES} {Opacity}{}
\define@cmdkey [NW] {DES} {TextFillColor}{}
\define@cmdkey [NW] {DES} {TextFillOpacity}{}
\define@cmdkey [NW] {DES} {TextFont}{}
\define@cmdkey [NW] {DES} {TextRotation}{}
\define@cmdkey [NW] {DES} {TextOpacity}{}
\define@cmdkey [NW] {DES} {InnerSep}{}
\define@cmdkey [NW] {DES} {OuterSep}{}
\presetkeys [NW] {DES} {Arrow = \EdgeArrow,
LineWidth = \EdgeLineWidth,
Color = \EdgeColor,
Opacity = \EdgeOpacity,
TextFillColor = \EdgeTextFillColor,
TextFillOpacity = \EdgeTextFillOpacity,
InnerSep = \EdgeInnerSep,
OuterSep = \EdgeOuterSep,
TextRotation = \EdgeTextRotation,
TextOpacity = \EdgeTextOpacity,
TextFont = \EdgeTextFont}{}
%<--------------------------------------------------------------------------->
% Init Default Plane Style
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {DPS} {LineWidth}{}
\define@cmdkey [NW] {DPS} {LineColor}{}
\define@cmdkey [NW] {DPS} {LineOpacity}{}
\define@cmdkey [NW] {DPS} {GridLineWidth}{}
\define@cmdkey [NW] {DPS} {GridColor}{}
\define@cmdkey [NW] {DPS} {GridOpacity}{}
\define@cmdkey [NW] {DPS} {FillColor}{}
\define@cmdkey [NW] {DPS} {FillOpacity}{}
\presetkeys [NW] {DPS} {LineWidth = \PlaneLineWidth,
LineColor = \PlaneLineColor,
LineOpacity = \PlaneLineOpacity,
GridLineWidth = \PlaneGridLineWidth,
GridColor = \PlaneGridColor,
GridOpacity = \PlaneGridOpacity,
FillColor = \PlaneFillColor,
FillOpacity = \PlaneFillOpacity}{}
%<--------------------------------------------------------------------------->
% Init Default Text Style
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {DTS} {InnerSep}{}
\define@cmdkey [NW] {DTS} {OuterSep}{}
\define@cmdkey [NW] {DTS} {TextFont}{}
\define@cmdkey [NW] {DTS} {TextColor}{}
\define@cmdkey [NW] {DTS} {TextRotation}{}
\define@cmdkey [NW] {DTS} {TextOpacity}{}
\presetkeys [NW] {DTS} {InnerSep = \TextInnerSep,
OuterSep = \TextOuterSep,
TextFont = \TextFont,
TextColor = \TextColor,
TextRotation = \TextRotation,
TextOpacity = \TextOpacity}{}
%<--------------------------------------------------------------------------->
% Init Default Coordinates 3D
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {COS} {xAngle}{}
\define@cmdkey [NW] {COS} {xLength}{}
\define@cmdkey [NW] {COS} {yAngle}{}
\define@cmdkey [NW] {COS} {yLength}{}
\define@cmdkey [NW] {COS} {zAngle}{}
\define@cmdkey [NW] {COS} {zLength}{}
\presetkeys [NW] {COS} {xAngle = \xAngle,
xLength = \xLength,
yAngle = \yAngle,
yLength = \yLength,
zAngle = \zAngle,
zLength = \zLength}{}
%<--------------------------------------------------------------------------->
% Default Style
%<--------------------------------------------------------------------------->
\newcommand*{\SetVertexStyle}[1][]{\NW@SetVertexStyleDefault[#1]}%
\def\NW@SetVertexStyleDefault[#1]{%
\setkeys[NW]{DVS}{#1}%
\tikzset{VertexStyle/.style = {draw,
shape = \cmdNW@DVS@Shape,
color = \cmdNW@DVS@LineColor,
fill = \cmdNW@DVS@FillColor,
inner sep = \cmdNW@DVS@InnerSep,
outer sep = \cmdNW@DVS@OuterSep,
minimum size = \cmdNW@DVS@MinSize,
line width = \cmdNW@DVS@LineWidth,
font = \cmdNW@DVS@TextFont,
fill opacity = \cmdNW@DVS@FillOpacity,
draw opacity = \cmdNW@DVS@LineOpacity}}
\tikzset{LabelStyle/.style={ \cmdNW@DVS@TextColor,
font = \cmdNW@DVS@TextFont,
rotate = \cmdNW@DVS@TextRotation,
opacity = \cmdNW@DVS@TextOpacity,}}
}%
\newcommand*{\SetEdgeStyle}[1][]{\NW@SetEdgeStyleDefault[#1]}%
\def\NW@SetEdgeStyleDefault[#1]{%
\setkeys[NW]{DES}{#1}%
\tikzset{EdgeStyle/.style = {\cmdNW@DES@Arrow,
line width = \cmdNW@DES@LineWidth,
color = \cmdNW@DES@Color,
opacity = \cmdNW@DES@Opacity}}
\tikzset{EdgeLabelStyle/.style={circle,
fill = \cmdNW@DES@TextFillColor,
fill opacity = \cmdNW@DES@TextFillOpacity,
inner sep = \cmdNW@DES@InnerSep,
outer sep = \cmdNW@DES@OuterSep,
rotate = \cmdNW@DES@TextRotation,
text opacity = \cmdNW@DES@TextOpacity,
font = \cmdNW@DES@TextFont}}
}%
\newcommand*{\SetPlaneStyle}[1][]{\NW@SetPlaneStyleDefault[#1]}%
\def\NW@SetPlaneStyleDefault[#1]{%
\setkeys[NW]{DPS}{#1}%
\tikzset{PlaneBorderStyle/.style = {draw,
line width = \cmdNW@DPS@LineWidth,
color = \cmdNW@DPS@LineColor,
draw opacity = \cmdNW@DPS@LineOpacity}}
\tikzset{PlaneFillStyle/.style = {
fill = \cmdNW@DPS@FillColor,
fill opacity = \cmdNW@DPS@FillOpacity}}
\tikzset{PlaneGridStyle/.style = {draw,
line width = \cmdNW@DPS@GridLineWidth,
color = \cmdNW@DPS@GridColor,
opacity = \cmdNW@DPS@GridOpacity}}
}%
\newcommand*{\SetTextStyle}[1][]{\NW@SetTextStyleDefault[#1]}%
\def\NW@SetTextStyleDefault[#1]{%
\setkeys[NW]{DTS}{#1}%
\tikzset{TextStyle/.style = {inner sep = \cmdNW@DTS@InnerSep,
outer sep = \cmdNW@DTS@OuterSep,
color = \cmdNW@DTS@TextColor,
rotate = \cmdNW@DTS@TextRotation,
text opacity = \cmdNW@DTS@TextOpacity,
font = \cmdNW@DTS@TextFont}}
}%
\tikzset{
multilayer/.code={%
\ifthenelse{\equal{#1}{3d}}{
\tikzset{edge canvas/.style={canvas is yx plane at z=0}}
\tikzset{multilayer 3d}
}{
\tikzset{edge canvas/.style={}}
\tikzset{multilayer 2d}
}
},
}
\newcommand*{\SetCoordinates}[1][]{\NW@SetCoordinates[#1]}%
\def\NW@SetCoordinates[#1]{%
\setkeys[NW]{COS}{#1}%
\tikzset{multilayer 3d/.style={
y={(\cmdNW@COS@xAngle:\cmdNW@COS@xLength \DefaultUnit)},
x={(\cmdNW@COS@yAngle:\cmdNW@COS@yLength \DefaultUnit)},
z={(\cmdNW@COS@zAngle:\cmdNW@COS@zLength \DefaultUnit)},
every node/.append style={transform shape},
}}
%\tikzset{edge canvas/.style={canvas is yx plane at z=0}}
}%
%<--------------------------------------------------------------------------->
% Apply default settings
%<--------------------------------------------------------------------------->
\SetCoordinates
\SetVertexStyle
\SetEdgeStyle
\SetPlaneStyle
\SetTextStyle
%<--------------------------------------------------------------------------->
% Redefine settings
%<--------------------------------------------------------------------------->
\newcommand*{\SetLayerDistance}[1]{\renewcommand{\NetworkLayerDistance}{#1}}
\newcommand*{\SetDefaultUnit}[1]{\renewcommand{\DefaultUnit}{#1}}
\newcommand*{\SetDistanceScale}[1]{\renewcommand{\DistanceScale}{#1}}
\newcommand*{\SetPlaneWidth}[1]{\renewcommand{\PlaneWidth}{#1}}
\newcommand*{\SetPlaneHeight}[1]{\renewcommand{\PlaneHeight}{#1}}
\newcommand*{\EdgesInBG}{\presetkeys [NW] {edge} {NotInBG = false}{}}
\newcommand*{\EdgesNotInBG}{\presetkeys [NW] {edge} {NotInBG = true}{}}
%=============================================================================
% Vertex and Edge creation
%=============================================================================
%<--------------------------------------------------------------------------->
% Init Vertex
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {vertex} {x}{}
\define@cmdkey [NW] {vertex} {y}{}
\define@cmdkey [NW] {vertex} {label}{}
\define@cmdkey [NW] {vertex} {size}{}
\define@cmdkey [NW] {vertex} {color}{}
\define@cmdkey [NW] {vertex} {opacity}{}
\define@cmdkey [NW] {vertex} {style}{}
\define@cmdkey [NW] {vertex} {layer}{}
\define@cmdkey [NW] {vertex} {shape}{}
\define@cmdkey [NW] {vertex} {fontsize}{}
\define@cmdkey [NW] {vertex} {fontcolor}{}
\define@cmdkey [NW] {vertex} {fontscale}{}
\define@boolkey [NW] {vertex} {RGB}[true]{}
\define@boolkey [NW] {vertex} {IdAsLabel}[true]{}
\define@boolkey [NW] {vertex} {NoLabel}[true]{}
\define@boolkey [NW] {vertex} {Math}[true]{}
\define@boolkey [NW] {vertex} {Network}[true]{}
\define@boolkey [NW] {vertex} {Pseudo}[true]{}
\define@cmdkey [NW] {vertex} {distance}{}
\define@cmdkey [NW] {vertex} {position}{}
\presetkeys [NW] {vertex} {Network = false,}{}
%<--------------------------------------------------------------------------->
% Vertex
%<--------------------------------------------------------------------------->
\newcommand*{\Vertex}[1][]{\@vertex[#1]}%
\def\@vertex[#1]#2{%
\setkeys[NW]{vertex}{#1}%
% Check if Vertex is used in a network, if so no default settings are
% necessary, otherwise default settings are applied.
\ifNW@vertex@Network
\cmdNW@vertex@opacity
\else
\setkeys[NW]{vertex}{x = {0},
y = {0},
label = {},
size = {},
color = {},
opacity = {},
layer = {},
shape = {},
style = {},
fontsize = {},
fontcolor = {},
fontscale = {},
NoLabel = false,
IdAsLabel = false,
Math = false,
RGB = false,
Pseudo = false,
distance = {0},
position = {center},}
\setkeys[NW]{vertex}{#1}%
\fi
\@@vertex{#2}%
}
\def\@@vertex#1{%
\def\vstyle{VertexStyle}
\begin{scope}
% [
% scale=1,yshift=0,every node/.append style={yslant=0.5,xslant=-1},yslant=0.5,xslant=-1
% ]
% If option NoLabel is true, no labels are printed in the network
\ifNW@vertex@NoLabel
\def\vertex@L{}%
\def\vertex@Name{}%
\else
% if IdAsLabel is true, the label of the vertex is equal to the vertex id
\ifNW@vertex@IdAsLabel
\def\vertex@Name{#1}
\def\vertex@L{\vertex@Name}
% Otherwise the label is equal to the label if it is non empty
\else
\ifthenelse{\not\equal{\cmdNW@vertex@label}{}}{
\def\vertex@L{\cmdNW@vertex@label}
\def\vertex@Name{#1}
}{
\def\vertex@Name{#1}
\def\vertex@L{}
}
\fi
\fi
% Check if Math is true, if so the label will be in math mode
\ifNW@vertex@Math
\def\vertex@Label{$\vertex@L$}%
\else
\def\vertex@Label{\vertex@L}%
\fi
% Check if the size of the vertex is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@vertex@size}{}}{
\tikzset{LocalVertexSize/.style={minimum size = \cmdNW@vertex@size
\DefaultUnit}}
}{
\tikzset{LocalVertexSize/.style={}}
}
% Check if the font size of the vertex label is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@vertex@fontsize}{}}{
\tikzset{LocalVertexFontSize/.style={font = \cmdNW@vertex@fontsize}}
}{
\tikzset{LocalVertexFontSize/.style={}}
}
% Check if the font scale of the vertex label is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@vertex@fontscale}{}}{
\tikzset{LocalVertexFontScale/.style={scale = \cmdNW@vertex@fontscale}}
}{
\tikzset{LocalVertexFontScale/.style={}}
}
% Check if the opacity of the vertex is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@vertex@opacity}{}}{
\tikzset{LocalVertexOpacity/.style={fill opacity = \cmdNW@vertex@opacity}}
}{
\tikzset{LocalVertexOpacity/.style={}}
}
% Check if the shape of the vertex is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@vertex@shape}{}}{
\tikzset{LocalVertexShape/.style={shape = \cmdNW@vertex@shape}}
}{
\tikzset{LocalVertexShape/.style={}}
}
% Check if the color of the vertex is redefined, if so the new style is
% used. If the option RGB is true, RGB values can be used to define the
% color of the vertex entered in the form {R,G,B}. If RGB is not true the
% default colors of tikz can be used (e.g. blue!50!green)
\ifNW@vertex@RGB
\ifthenelse{\not\equal{\cmdNW@vertex@color}{}}{
\pgfutil@definecolor{LocalColor}{RGB}{\cmdNW@vertex@color}
\tikzset{LocalVertexFill/.style={fill = LocalColor}}
}{
\tikzset{LocalVertexFill/.style={}}
}
\ifthenelse{\not\equal{\cmdNW@vertex@fontcolor}{}}{
\pgfutil@definecolor{LocalFontColor}{RGB}{\cmdNW@vertex@fontcolor}
\tikzset{LocalVertexFontColor/.style={color = LocalFontColor}}
}{
\tikzset{LocalVertexFontColor/.style={}}
}
\else
\ifthenelse{\not\equal{\cmdNW@vertex@color}{}}{
\tikzset{LocalVertexFill/.style={fill = \cmdNW@vertex@color}}
}{
\tikzset{LocalVertexFill/.style={}}
}
\ifthenelse{\not\equal{\cmdNW@vertex@fontcolor}{}}{
\tikzset{LocalVertexFontColor/.style={color = \cmdNW@vertex@fontcolor}}
}{
\tikzset{LocalVertexFontColor/.style={}}
}
\fi
% Define empty style for the vertex
\ifNW@vertex@Pseudo
\tikzset{LocalPseudo/.style={opacity = 0}}
\else
\tikzset{LocalPseudo/.style={}}
\fi
% Define local style for the label
\tikzset{LocalLabel/.style={label = {[LabelStyle, LocalVertexFontColor,
LocalVertexFontSize, LocalVertexFontScale, label
distance=\cmdNW@vertex@distance]\cmdNW@vertex@position:\vertex@Label}}}
\ifthenelse{\equal{\cmdNW@vertex@layer}{}}{
\protected@edef\@tempa{%
\noexpand\node[\vstyle,LocalVertexSize,LocalVertexOpacity,LocalVertexFill,LocalVertexShape,LocalLabel,\cmdNW@vertex@style,LocalPseudo](#1)%
at (\cmdNW@vertex@x*\DistanceScale\DefaultUnit,\cmdNW@vertex@y*\DistanceScale\DefaultUnit){}}%
\@tempa;
}{
\begin{scope}[canvas is yx plane at z=(\cmdNW@vertex@layer-1)*\NetworkLayerDistance]
\protected@edef\@tempa{%
\noexpand\node[\vstyle,LocalVertexSize,LocalVertexOpacity,LocalVertexFill,LocalVertexShape,LocalLabel,\cmdNW@vertex@style,LocalPseudo](#1)%
at (\cmdNW@vertex@x*\DistanceScale\DefaultUnit,\cmdNW@vertex@y*\DistanceScale\DefaultUnit){}}%
\@tempa;
\end{scope}
}
\end{scope}
}
%<--------------------------------------------------------------------------->
% Init Edge
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {edge} {label}{}
\define@cmdkey [NW] {edge} {lw}{}
\define@cmdkey [NW] {edge} {color}{}
\define@cmdkey [NW] {edge} {opacity}{}
\define@cmdkey [NW] {edge} {style}{}
\define@cmdkey [NW] {edge} {fontcolor}{}
\define@cmdkey [NW] {edge} {fontsize}{}
\define@cmdkey [NW] {edge} {fontscale}{}
\define@boolkey [NW] {edge} {RGB}[true]{}
\define@boolkey [NW] {edge} {Math}[true]{}
\define@boolkey [NW] {edge} {Direct}[true]{}
\define@boolkey [NW] {edge} {Network}[true]{}
\define@cmdkey [NW] {edge} {bend}{}
\define@cmdkey [NW] {edge} {position}{}
\define@cmdkey [NW] {edge} {distance}{}
\define@cmdkey [NW] {edge} {loopsize}{}
\define@cmdkey [NW] {edge} {loopposition}{}
\define@cmdkey [NW] {edge} {loopshape}{}
\define@boolkey [NW] {edge} {NotInBG}[true]{}
\define@cmdkey [NW] {edge} {path}{}
\presetkeys [NW] {edge} {Network = false,}{}
% NotInBG = false,}{}
%<--------------------------------------------------------------------------->
% Edge
%<--------------------------------------------------------------------------->
\newcommand*{\Edge}[1][]{\@edge[#1]}%
\def\@edge[#1](#2)(#3){%
\setkeys[NW]{edge}{#1}%
% Check if Vertex is used in a network, if so no default settings are
% necessary, otherwise default settings are applied.
\ifNW@edge@Network
\else
\setkeys[NW]{edge}{label = {},
lw = {},
path = {},
color = {},
opacity = {},
style = {},
fontcolor = {},
fontsize = {},
fontscale = {},
RGB = false,
Math = false,
Direct = false,
NotInBG = false,
bend = {0},
loopsize = {1\DefaultUnit},
position = {},
loopposition= {0},
loopshape = {90},
distance = {.5}}
\setkeys[NW]{edge}{#1}%
\fi
\def\estyle{EdgeStyle}
%
\ifNW@edge@NotInBG
\tikzset{EdgeInBG/.style={}}
\else
\tikzset{EdgeInBG/.style={on background layer}}
\fi
\begin{scope}[edge canvas,EdgeInBG]
% [
% scale=1,yshift=0,every node/.append style={yslant=0.5,xslant=-1},yslant=0.5,xslant=-1
% ]
% Check if Direct is true, if so use default arrow style
\ifNW@edge@Direct
\tikzset{LocalArrow/.style={}}
\else
\tikzset{LocalArrow/.style={-}}
\fi
% Check if the line width of the vertex is redefined, if so the new style is
% used
\ifthenelse{\not\equal{\cmdNW@edge@lw}{}}{
\tikzset{LocalEdgeLW/.style={line width = \cmdNW@edge@lw}}
}{
\tikzset{LocalEdgeLW/.style={}}
}
% Check if the opacity of the vertex is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@edge@opacity}{}}{
\tikzset{LocalEdgeOpacity/.style={opacity = \cmdNW@edge@opacity}}
\tikzset{LocalTextOpacity/.style={text opacity = \cmdNW@edge@opacity}}
}{
\tikzset{LocalEdgeOpacity/.style={}}
\tikzset{LocalTextOpacity/.style={}}
}
% Check if the font size of the edge is redefined, if so the new style is
% used
\ifthenelse{\not\equal{\cmdNW@edge@fontsize}{}}{
\tikzset{LocalEdgeFontSize/.style={font = \cmdNW@edge@fontsize}}
}{
\tikzset{LocalEdgeFontSize/.style={}}
}
% Check if the font scale of the edge is redefined, if so the new style is
% used
\ifthenelse{\not\equal{\cmdNW@edge@fontscale}{}}{
\tikzset{LocalEdgeFontScale/.style={scale = \cmdNW@edge@fontscale}}
}{
\tikzset{LocalEdgeFontScale/.style={}}
}
% Check if the color of the vertex is redefined, if so the new style is
% used. If the option RGB is true, RGB values can be used to define the
% color of the vertex entered in the form {R,G,B}. If RGB is not true the
% default colors of tikz can be used (e.g. blue!50!green)
\ifNW@edge@RGB
\ifthenelse{\not\equal{\cmdNW@edge@color}{}}{
\pgfutil@definecolor{LocalColor}{RGB}{\cmdNW@edge@color}
\tikzset{LocalEdgeColor/.style={color = LocalColor}}
}{
\tikzset{LocalEdgeColor/.style={}}
}
\ifthenelse{\not\equal{\cmdNW@edge@fontcolor}{}}{
\pgfutil@definecolor{LocalFontColor}{RGB}{\cmdNW@edge@fontcolor}
\tikzset{LocalEdgeFontColor/.style={text = LocalFontColor}}
}{
\tikzset{LocalEdgeFontColor/.style={}}
}
\else
\ifthenelse{\not\equal{\cmdNW@edge@color}{}}{
\tikzset{LocalEdgeColor/.style={color = \cmdNW@edge@color}}
}{
\tikzset{LocalEdgeColor/.style={}}
}
\ifthenelse{\not\equal{\cmdNW@edge@fontcolor}{}}{
\tikzset{LocalEdgeFontColor/.style={text = \cmdNW@edge@fontcolor}}
}{
\tikzset{LocalEdgeFontColor/.style={}}
}
\fi
% Check if Math is true, if so the label will be in math mode
\ifNW@edge@Math
\def\edge@L{$\cmdNW@edge@label$}%
\else
\def\edge@L{\cmdNW@edge@label}%
\fi
% Check if a label is assigned, if so create a label variable
\ifthenelse{\not\equal{\cmdNW@edge@label}{}}{ \def\edge@Label{node[EdgeLabelStyle,LocalTextOpacity,LocalEdgeFontColor,LocalEdgeFontSize,LocalEdgeFontScale,pos=\cmdNW@edge@distance,\cmdNW@edge@position]{\edge@L}}
}{
\def\edge@Label{}
}
% Check if it is a self loop or a normal edge
% Normal edge
\ifthenelse{\not\equal{#2}{#3}}{
\ifthenelse{\not\equal{\cmdNW@edge@path}{}}{
\def\edge@pts{}%
\@for\tmp:=\cmdNW@edge@path\do{
\edef\edge@pts{\edge@pts (\tmp) --}
}
\protected@edef\@tempa{%
\noexpand\draw[\estyle,LocalEdgeLW,LocalEdgeOpacity,LocalEdgeColor,LocalArrow,\cmdNW@edge@style] (#2) -- \edge@pts (#3)} \@tempa;
}{
\protected@edef\@tempa{%
\noexpand\path[\estyle,LocalEdgeLW,LocalEdgeOpacity,LocalEdgeColor,LocalArrow,\cmdNW@edge@style] (#2) edge [bend left = \cmdNW@edge@bend] \edge@Label (#3)}%
\@tempa;
}
}{% Self loop
\protected@edef\@tempa{%
\noexpand\path[\estyle,LocalEdgeLW,LocalEdgeOpacity,LocalEdgeColor,LocalArrow,\cmdNW@edge@style]
(#2) edge [in=-\cmdNW@edge@loopshape/2+\cmdNW@edge@loopposition,out=\cmdNW@edge@loopshape/2+\cmdNW@edge@loopposition,loop,distance=\cmdNW@edge@loopsize,] \edge@Label (#3)}%
\@tempa;
}
\end{scope}
}
%=============================================================================
% Vertices and Edges creation
%=============================================================================
%<--------------------------------------------------------------------------->
% Init Vertices
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {vertices} {layer}{}
\define@cmdkey [NW] {vertices} {size}{}
\define@cmdkey [NW] {vertices} {color}{}
\define@cmdkey [NW] {vertices} {opacity}{}
\define@cmdkey [NW] {vertices} {style}{}
\define@cmdkey [NW] {vertices} {shape}{}
\define@boolkey [NW] {vertices} {RGB}[true]{}
\define@boolkey [NW] {vertices} {IdAsLabel}[true]{}
\define@boolkey [NW] {vertices} {NoLabel}[true]{}
\define@boolkey [NW] {vertices} {Math}[true]{}
\define@boolkey [NW] {vertices} {Pseudo}[true]{}
\presetkeys [NW] {vertices} {layer = {},
opacity = {},
size = {},
color = {},
style = {},
shape = {},
RGB = false,
IdAsLabel = false,
NoLabel = false,
Math = false,
Pseudo = false,}{}
\newcommand*{\setkeysexpanded}[2]{%
\expandafter\setkeysexpandedaux\expandafter{#2}{#1}}
\newcommand*{\setkeysexpandedaux}[2]{%
\setkeys[NW]{#2}{#1}}
% \newcommand*{\setkeysexpandedx}[2]{%
% \expandafter\setkeysexpandedauxx\expandafter{#2}{#1}}
% \newcommand*{\setkeysexpandedauxx}[2]{%
% \setkeys[NW]{#2}{#1}}
%<--------------------------------------------------------------------------->
% Vertices
%<--------------------------------------------------------------------------->
\newcommand*{\Vertices}[1][]{\@vertices[#1]}%
\def\@vertices[#1]#2{%
\setkeys[NW]{vertices}{#1}%
\@@vertices{#2}%
}
\def\@@vertices#1{%
% Check if data base already exist
\DTLifdbexists{#1}{}{
% create dummy data base to store name
\DTLnewdb{#1}
% delete existing vertices data base
\DTLifdbexists{vertices}{
\DTLgdeletedb{vertices}
}{}
% Load data file for vertices
\DTLloaddb[noheader=false]{vertices}{#1}
}
% Define variables to store option values
\def\vertex@Options{}%
\def\vertex@id{}%
\def\vertex@rgbValues{}%
% Go through each row and create vertices
\DTLforeach*{vertices}{}{%
% reset storage variable to default values
\edef\vertex@Options{x=0,y=0,label={},size={},color={},fontcolor={},fontsize={},fontscale={},
opacity={},layer={},style={},NoLabel=false,IdAsLabel=false,
Math=false,RGB=false,Pseudo=false,distance={0},position={center},shape={},}%
\edef\vertex@rgbValues{}%
% Go through each row element
\DTLforeachkeyinrow{\thisValue}{
\DTLifeq{\dtlkey}{id}{
% Assign vertex id to storage variable
\edef\vertex@id{\thisValue}%
}{
\DTLifeq{\dtlkey}{R}{
\edef\vertex@rgbValues{\vertex@rgbValues \thisValue,}
}{
\DTLifeq{\dtlkey}{G}{
\edef\vertex@rgbValues{\vertex@rgbValues \thisValue,}
}{
\DTLifeq{\dtlkey}{B}{
\edef\vertex@rgbValues{\vertex@rgbValues \thisValue,}
}{
% Assign option to storage variable
\edef\vertex@Options{\vertex@Options \dtlkey=\thisValue,}
}}}}
}
% Add general settings for the Vertex
% NoLabel
\ifNW@vertices@NoLabel
\edef\vertex@Options{\vertex@Options NoLabel=true,}
\fi
% Pseudo
\ifNW@vertices@Pseudo
\edef\vertex@Options{\vertex@Options Pseudo=true,}
\fi
% IdAsLabel
\ifNW@vertices@IdAsLabel
\edef\vertex@Options{\vertex@Options IdAsLabel=true,}
\fi
% Math
\ifNW@vertices@Math
\edef\vertex@Options{\vertex@Options Math=true,}
\fi
% RGB
\ifNW@vertices@RGB
\edef\vertex@Options{\vertex@Options RGB=true,color={\vertex@rgbValues},}
\fi
% opacity
\ifthenelse{\not\equal{\cmdNW@vertices@opacity}{}}
{
\edef\vertex@Options{\vertex@Options opacity=\cmdNW@vertices@opacity,}
}{}
% size
\ifthenelse{\not\equal{\cmdNW@vertices@size}{}}
{
\edef\vertex@Options{\vertex@Options size=\cmdNW@vertices@size,}
}{}
% shape
\ifthenelse{\not\equal{\cmdNW@vertices@shape}{}}
{
\edef\vertex@Options{\vertex@Options shape=\cmdNW@vertices@shape,}
}{}
% color
\ifthenelse{\not\equal{\cmdNW@vertices@color}{}}
{
\edef\vertex@Options{\vertex@Options color=\cmdNW@vertices@color,}
}{}
\ifthenelse{\not\equal{\cmdNW@vertices@style}{}}{
\edef\vertex@Options{\vertex@Options style={\cmdNW@vertices@style},}
}{}
% Apply settings for the Vertex
\setkeysexpanded{vertex}{\vertex@Options}%
\ifthenelse{\not\equal{\cmdNW@vertices@layer}{}}{
\ifthenelse{\equal{\cmdNW@vertices@layer}{\cmdNW@vertex@layer}}{
\Vertex[Network]{\vertex@id}
}{}
}{
\Vertex[Network]{\vertex@id}
}
% Create Vertex
}
% Delete data base
% \DTLgdeletedb{#1}
}
%<--------------------------------------------------------------------------->
% Init Edges
%<--------------------------------------------------------------------------->
\def\myvariable{\KeySettingCommand{false}}
\define@cmdkey [NW] {edges} {layer}{}
\define@cmdkey [NW] {edges} {vertices}{}
\define@cmdkey [NW] {edges} {style}{}
\define@cmdkey [NW] {edges} {lw}{}
\define@cmdkey [NW] {edges} {color}{}
\define@cmdkey [NW] {edges} {opacity}{}
\define@boolkey [NW] {edges} {RGB}[true]{}
\define@boolkey [NW] {edges} {Math}[true]{}
\define@boolkey [NW] {edges} {Direct}[true]{}
\define@boolkey [NW] {edges} {NoLabel}[true]{}
\define@boolkey [NW] {edges} {NotInBG}[true]{}
\presetkeys [NW] {edges} {layer = {},
vertices = {},
style = {},
lw = {},
color = {},
opacity = {},
RGB = false,
Math = false,
Direct = false,
NoLabel = false,
NotInBG = false,}{}
\newcommand{\shortcut}[1]{%
\@tempswafalse
\@for\next:=#1\do
{\if@tempswa+\else\@tempswatrue\fi\textbf{\next}}%
}
\newcounter{LayerCounter}
\newcommand\myfunc[1]{\setcounter{LayerCounter}{0}\@for\tmp:=#1\do{
\stepcounter{LayerCounter}
\arabic{LayerCounter}-a-\textbf{\tmp}}
}
%<--------------------------------------------------------------------------->
% Edges
%<--------------------------------------------------------------------------->
\newcommand*{\Edges}[1][]{\@edges[#1]}%
\def\@edges[#1]#2{%
\setkeys[NW]{edges}{#1}%
\@@edges{#2}%
}
\def\@@edges#1{%
\begin{scope}
% Check if data base already exist
\DTLifdbexists{#1}{}{
% create dummy data base to store name
\DTLnewdb{#1}
% delete existing vertices data base
\DTLifdbexists{edges}{
\DTLgdeletedb{edges}
}{}
% Load data file for vertices
\DTLloaddb[noheader=false]{edges}{#1}
}
% % Load data file for vertices
% \DTLloaddb[noheader=false]{#1}{#1}
% Define variables to store option values
\def\edge@Options{}%
\def\edge@u{}%
\def\edge@v{}%
\def\edge@u@layer{}%
\def\edge@v@layer{}%
\def\edge@rgbValues{}%
\def\u@layer{}%
\def\v@layer{}%
%
% Assign where the edges are drawn from to
\ifthenelse{\not\equal{\cmdNW@edges@layer}{}}{
% set layer count back to 0
\setcounter{LayerCounter}{0}
\@for\tmp:=\cmdNW@edges@layer\do{
\stepcounter{LayerCounter}
\ifthenelse{\value{LayerCounter}=1}{
\edef\u@layer{\tmp}%
}{
\edef\v@layer{\tmp}%
}
}
}{}
% Go through each row and create edges
\DTLforeach*{edges}{}{%
% reset storage variable to default values
\edef\edge@Options{label = {}, lw = {}, color = {}, opacity = {}, style =
{}, RGB = false, Math = false, Direct = false, NotInBG = false, bend = {0}, loopsize =
{1\DefaultUnit}, position = {}, loopposition = {0}, loopshape = {90},
distance = {.5}, path = {}, fontcolor = {}, fontsize = {}, fontscale ={},}
\edef\edge@rgbValues{}%
% Go through each row element
\DTLforeachkeyinrow{\thisValue}{
\DTLifeq{\dtlkey}{u}{
% Assign edge id to storage variable
\edef\edge@u{\thisValue}%
}{
\DTLifeq{\dtlkey}{v}{
\edef\edge@v{\thisValue}%
}{
\DTLifeq{\dtlkey}{R}{
\edef\edge@rgbValues{\edge@rgbValues \thisValue,}
}{
\DTLifeq{\dtlkey}{G}{
\edef\edge@rgbValues{\edge@rgbValues \thisValue,}
}{
\DTLifeq{\dtlkey}{B}{
\edef\edge@rgbValues{\edge@rgbValues \thisValue,}
}{
% Assign option to storage variable
\edef\edge@Options{\edge@Options \dtlkey=\thisValue,}
}}}}}
}
% Add general settings for the Edges
% NoLabel
\ifNW@edges@NoLabel
\edef\edge@Options{\edge@Options label={},}
\fi
% Direct
\ifNW@edges@Direct
\edef\edge@Options{\edge@Options Direct=true,}
\fi
% Math
\ifNW@edges@Math
\edef\edge@Options{\edge@Options Math=true,}
\fi
% RGB
\ifNW@edges@RGB
\edef\edge@Options{\edge@Options RGB=true,color={\edge@rgbValues},}
\fi
\ifthenelse{\not\equal{\cmdNW@edges@style}{}}{
\edef\edge@Options{\edge@Options style={\cmdNW@edges@style},}
}{}
% lw
\ifthenelse{\not\equal{\cmdNW@edges@lw}{}}
{
\edef\edge@Options{\edge@Options lw=\cmdNW@edges@lw,}
}{}
% color
\ifthenelse{\not\equal{\cmdNW@edges@color}{}}
{
\edef\edge@Options{\edge@Options color=\cmdNW@edges@color,}
}{}
% opacity
\ifthenelse{\not\equal{\cmdNW@edges@opacity}{}}
{
\edef\edge@Options{\edge@Options opacity=\cmdNW@edges@opacity,}
}{}
% NoLabel
\ifNW@edges@NotInBG
\edef\edge@Options{\edge@Options NotInBG=true,}
\fi
% Apply settings for the Edge
\setkeysexpanded{edge}{\edge@Options}%
% Create Edge
\ifthenelse{\equal{\cmdNW@edges@layer}{}}{
\Edge[Network](\edge@u)(\edge@v)
}{
\ifthenelse{\not\equal{\cmdNW@edges@vertices}{}}{
\DTLifdbexists{vertices}{
\DTLgdeletedb{vertices}
}{}
% Load data file for vertices
\DTLloaddb[noheader=false]{vertices}{\cmdNW@edges@vertices}
}{}
% find assigned layer to the used vertices
\DTLforeach*{vertices}{\id=id,\layer=layer}{%
\ifthenelse{\equal{\id}{\edge@u}}{
\edef\edge@u@layer{\layer}%
\dtlbreak
}{}
}
\DTLforeach*{vertices}{\id=id,\layer=layer}{%
\ifthenelse{\equal{\id}{\edge@v}}{
\edef\edge@v@layer{\layer}%
\dtlbreak
}{}
}
% if the edge is an intra layer edge
\ifthenelse{\equal{\u@layer}{\v@layer}}{
\ifthenelse{\equal{\u@layer}{\edge@u@layer}}{
\ifthenelse{\equal{\v@layer}{\edge@v@layer}}{
\Edge[Network](\edge@u)(\edge@v)
}{}
}{}
}{
\ifthenelse{\equal{\u@layer}{\edge@u@layer}}{
\ifthenelse{\equal{\v@layer}{\edge@v@layer}}{
\Edge[Network](\edge@u)(\edge@v)
}{}
}{}
\ifthenelse{\equal{\v@layer}{\edge@u@layer}}{
\ifthenelse{\equal{\u@layer}{\edge@v@layer}}{
\Edge[Network](\edge@u)(\edge@v)
}{}
}{}
}
}
}
\end{scope}
% Delete data base
% \DTLgdeletedb{#1}
}
%<--------------------------------------------------------------------------->
% Init Layer
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {layer} {layer}{}
\define@cmdkey [NW] {layer} {z}{}
\define@cmdkey [NW] {layer} {opacity}{}
\presetkeys [NW] {layer} {layer = {1},
opacity = {},
z = {},}{}
%<--------------------------------------------------------------------------->
% Layer
%<--------------------------------------------------------------------------->
%\def\@layer{canvas is yx plane at z=-3,}
\def\@layer[#1]#2{
\setkeys[NW]{layer}{#1}
\ifthenelse{\not\equal{\cmdNW@layer@z}{}}{
\tikzset{LocalLayerZ/.style={canvas is yx plane at z=\cmdNW@layer@z}}
}{
\tikzset{LocalLayerZ/.style={canvas is yx plane at z=(\cmdNW@layer@layer-1)*\NetworkLayerDistance}}
}
\ifthenelse{\not\equal{\cmdNW@layer@opacity}{}}{
\tikzset{LocalLayerOpacity/.style={fill opacity = \cmdNW@layer@opacity}}
}{
\tikzset{LocalLayerOpacity/.style={}}
}
\begin{scope}[LocalLayerZ,LocalLayerOpacity]
}
%\newcommand*{\Layer}[1][]{\@layer[#1]}%
\newenvironment{Layer}[1][]{\@layer[#1]1}{\end{scope}}
%\def\@layer[#1]#2{}
% \newcommand*{\Edges}[1][]{\@edges[#1]}%
% \def\@edges[#1]#2{%
% \setkeys[NW]{edges}{#1}%
% \@@edges{#2}%
% }
% \def\@@edges#1{%
%<--------------------------------------------------------------------------->
% Init Plane
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {plane} {x}{}
\define@cmdkey [NW] {plane} {y}{}
\define@cmdkey [NW] {plane} {width}{}
\define@cmdkey [NW] {plane} {height}{}
\define@cmdkey [NW] {plane} {color}{}
\define@cmdkey [NW] {plane} {opacity}{}
\define@cmdkey [NW] {plane} {style}{}
\define@cmdkey [NW] {plane} {layer}{}
\define@cmdkey [NW] {plane} {grid}{}
\define@cmdkey [NW] {plane} {image}{}
\define@boolkey [NW] {plane} {RGB}[true]{}
\define@boolkey [NW] {plane} {InBG}[true]{}
\define@boolkey [NW] {plane} {NoFill}[true]{}
\define@boolkey [NW] {plane} {NoBorder}[true]{}
\define@boolkey [NW] {plane} {ImageAndFill}[true]{}
\presetkeys [NW] {plane} {x = {0},
y = {0},
width = {\PlaneWidth},
height = {\PlaneHeight},
color = {},
opacity = {},
style = {},
layer = {1},
grid = {},
image = {},
RGB = false,
InBG = false,
NoFill = false,
NoBorder= false,
ImageAndFill= false,}{}
%<--------------------------------------------------------------------------->
% Plane
%<--------------------------------------------------------------------------->
\newcommand*{\Plane}[1][]{\@plane[#1]}%
\def\@plane[#1]{%
\setkeys[NW]{plane}{#1}%
\ifNW@plane@ImageAndFill
\setkeys[NW]{plane}{#1}%
\else
\ifthenelse{\not\equal{\cmdNW@plane@image}{}}{
\setkeys[NW]{plane}{#1,NoFill}
}{}
\fi
\@@plane%
}
\def\@@plane{%
% Draw Plane on the Background layer
\ifNW@plane@InBG
\tikzset{InBGStyle/.style={on background layer}}
\else
\tikzset{InBGStyle/.style={}}
\fi
\begin{scope}[InBGStyle]
% Check if the color of the plane is redefined, if so the new style is
% used. If the option RGB is true, RGB values can be used to define the
% color of the plane entered in the form {R,G,B}. If RGB is not true the
% default colors of tikz can be used (e.g. blue!50!green)
\ifNW@plane@RGB
\ifthenelse{\not\equal{\cmdNW@plane@color}{}}{
\pgfutil@definecolor{LocalColor}{RGB}{\cmdNW@plane@color}
\tikzset{LocalPlaneFill/.style={fill = LocalColor}}
}{
\tikzset{LocalPlaneFill/.style={}}
}
\else
\ifthenelse{\not\equal{\cmdNW@plane@color}{}}{
\tikzset{LocalPlaneFill/.style={fill = \cmdNW@plane@color}}
}{
\tikzset{LocalPlaneFill/.style={}}
}
\fi
% Check if the opacity of the plane is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@plane@opacity}{}}{
\tikzset{LocalPlaneOpacity/.style={fill opacity = \cmdNW@plane@opacity}}
}{
\tikzset{LocalPlaneOpacity/.style={}}
}
\begin{scope}[canvas is yx plane at z=(\cmdNW@plane@layer-1)*\NetworkLayerDistance]
% Draw the fill of the Plane
\ifNW@plane@NoFill
\else
\protected@edef\@tempa{%
\noexpand\fill[PlaneFillStyle,LocalPlaneFill,LocalPlaneOpacity](\cmdNW@plane@x*\DistanceScale,\cmdNW@plane@y*\DistanceScale)
rectangle ++ (\cmdNW@plane@width*\DistanceScale,\cmdNW@plane@height*\DistanceScale)}%
\@tempa;
\fi
% Draw image on the Plane
\ifthenelse{\not\equal{\cmdNW@plane@image}{}}{
%\protected@edef\@tempa{%
%\noexpand
\node[inner sep=0pt,LocalPlaneOpacity] at
($(\cmdNW@plane@width/2,\cmdNW@plane@height/2)+(\cmdNW@plane@x,\cmdNW@plane@y)$)
{\includegraphics[width=\cmdNW@plane@width\DefaultUnit,height=\cmdNW@plane@height\DefaultUnit]{\cmdNW@plane@image}};
%}%
%\@tempa;
}{}
% Draw grid on the Plane
\ifthenelse{\not\equal{\cmdNW@plane@grid}{}}{
\protected@edef\@tempa{%
\noexpand\draw[PlaneGridStyle,step=\cmdNW@plane@grid*\DistanceScale](\cmdNW@plane@x*\DistanceScale,\cmdNW@plane@y*\DistanceScale)
grid ++ (\cmdNW@plane@width*\DistanceScale,\cmdNW@plane@height*\DistanceScale)}%
\@tempa;
}{}
% Draw the border of the Plane
\ifNW@plane@NoBorder
\else
\protected@edef\@tempa{%
\noexpand\draw[PlaneBorderStyle,\cmdNW@plane@style](\cmdNW@plane@x*\DistanceScale,\cmdNW@plane@y*\DistanceScale)
rectangle ++ (\cmdNW@plane@width*\DistanceScale,\cmdNW@plane@height*\DistanceScale)}%
\@tempa;
\fi
\end{scope}
\end{scope}
}
%<--------------------------------------------------------------------------->
% Init Text
%<--------------------------------------------------------------------------->
\define@cmdkey [NW] {text} {x}{}
\define@cmdkey [NW] {text} {y}{}
\define@cmdkey [NW] {text} {layer}{}
\define@cmdkey [NW] {text} {color}{}
\define@cmdkey [NW] {text} {opacity}{}
\define@cmdkey [NW] {text} {rotation}{}
\define@cmdkey [NW] {text} {fontsize}{}
\define@cmdkey [NW] {text} {anchor}{}
\define@cmdkey [NW] {text} {position}{}
\define@cmdkey [NW] {text} {distance}{}
\define@cmdkey [NW] {text} {style}{}
\define@cmdkey [NW] {text} {width}{}
\define@boolkey [NW] {text} {RGB}[true]{}
\presetkeys [NW] {text} {x = {0},
y = {0},
layer = {},
color = {},
opacity = {},
fontsize = {},
anchor = {},
position = {},
rotation = {},
distance = {0\DefaultUnit},
style = {},
width = {},
RGB = false,}{}
%<--------------------------------------------------------------------------->
% Text
%<--------------------------------------------------------------------------->
\newcommand*{\Text}[1][]{\@text[#1]}%
\def\@text[#1]#2{%
\setkeys[NW]{text}{#1}%
\@@text{#2}%
}
\def\@@text#1{%
% Check if the color of the text is redefined, if so the new style is
% used. If the option RGB is true, RGB values can be used to define the
% color of the text entered in the form {R,G,B}. If RGB is not true the
% default colors of tikz can be used (e.g. blue!50!green)
\ifNW@text@RGB
\ifthenelse{\not\equal{\cmdNW@text@color}{}}{
\pgfutil@definecolor{LocalColor}{RGB}{\cmdNW@text@color}
\tikzset{LocalTextColor/.style={color = LocalColor}}
}{
\tikzset{LocalTextColor/.style={}}
}
\else
\ifthenelse{\not\equal{\cmdNW@text@color}{}}{
\tikzset{LocalTextColor/.style={color = \cmdNW@text@color}}
}{
\tikzset{LocalTextColor/.style={}}
}
\fi
% Check if the opacity of the text is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@text@opacity}{}}{
\tikzset{LocalTextOpacity/.style={text opacity = \cmdNW@text@opacity}}
}{
\tikzset{LocalTextOpacity/.style={}}
}
% Check if the rotation of the text is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@text@rotation}{}}{
\tikzset{LocalTextRotation/.style={rotate = \cmdNW@text@rotation}}
}{
\tikzset{LocalTextRotation/.style={}}
}
% Check if the font size of the text is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@text@fontsize}{}}{
\tikzset{LocalTextFontSize/.style={font = \cmdNW@text@fontsize}}
}{
\tikzset{LocalTextFontSize/.style={}}
}
% Check if the position of the text is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@text@position}{}}{
\tikzset{LocalTextPosition/.style={\cmdNW@text@position = \cmdNW@text@distance}}
}{
\tikzset{LocalTextPosition/.style={}}
}
% Check if the anchor of the text is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@text@anchor}{}}{
\tikzset{LocalTextAnchor/.style={anchor = \cmdNW@text@anchor}}
}{
\tikzset{LocalTextAnchor/.style={}}
}
% Check if the text width of the text is redefined, if so the new style is used
\ifthenelse{\not\equal{\cmdNW@text@width}{}}{
\tikzset{LocalTextWidth/.style={text width = \cmdNW@text@width}}
}{
\tikzset{LocalTextWidth/.style={}}
}
\ifthenelse{\equal{\cmdNW@text@layer}{}}{
\protected@edef\@tempa{%
\noexpand\node[TextStyle, LocalTextColor, LocalTextOpacity,
LocalTextFontSize, LocalTextRotation, LocalTextPosition,
LocalTextAnchor, LocalTextWidth, \cmdNW@text@style] at
(\cmdNW@text@x*\DistanceScale,\cmdNW@text@y*\DistanceScale){#1}
}\@tempa;%
}{
\begin{scope}[canvas is yx plane at z=(\cmdNW@text@layer-1)*\NetworkLayerDistance]
\protected@edef\@tempa{%
\noexpand\node[TextStyle, LocalTextColor, LocalTextOpacity,
LocalTextFontSize, LocalTextRotation, LocalTextPosition,
LocalTextAnchor, LocalTextWidth, \cmdNW@text@style] at
(\cmdNW@text@x*\DistanceScale,\cmdNW@text@y*\DistanceScale){#1}
}\@tempa;%
\end{scope}
}
}
\endinput
%=============================================================================
% eof
%
% Local Variables:
% mode: latex
% mode: flyspell
% mode: auto-fill
% fill-column: 80
% TeX-master: t
% End: