% Copyright 2008 by Marc de Falco
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{tikz-inet}[2008/06/02 v0.1 tikz interaction nets library]
\RequirePackage{tikz}
\RequirePackage{ifthen}
% We need this to load the \emph{isosceles triangle} shape
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{shadows}
\usetikzlibrary{positioning}
\usetikzlibrary{matrix}
\usetikzlibrary{fit}
\pgfkeys{/pgf/.cd,
arity/.initial=4,
}
% The definition of the shape of a cell
\pgfdeclareshape{cellule}{
\savedmacro\arity{%
\pgfmathtruncatemacro\arity{\pgfkeysvalueof{/pgf/arity}}%
}
\inheritsavedanchors[from=isosceles triangle]
\inheritanchorborder[from=isosceles triangle]
\inheritanchor[from=isosceles triangle]{center}
\inheritanchor[from=isosceles triangle]{left corner}
\inheritanchor[from=isosceles triangle]{right corner}
\inheritanchor[from=isosceles triangle]{south}
\inheritanchor[from=isosceles triangle]{west}
\inheritanchor[from=isosceles triangle]{north east}
\inheritanchor[from=isosceles triangle]{north west}
\inheritanchor[from=isosceles triangle]{south east}
\inheritanchor[from=isosceles triangle]{south west}
\inheritanchor[from=isosceles triangle]{east}
\inheritanchor[from=isosceles triangle]{north}
\inheritanchor[from=isosceles triangle]{lower left}
\inheritanchor[from=isosceles triangle]{apex}
\anchor{above pax}{
\trianglepoints
\pgfmathrotatepointaround{
\pgfpointadd{
\pgfpointadd{\pgfpoint{-2ex}{0cm}}{
\pgfpointlineattime{0.5}
{\lowerleftanchor}{\lowerrightanchor}
}
}
{\centerpoint}
}{\centerpoint}{\rotate}
}
\anchor{above middle pax}{
\trianglepoints
\pgfmathrotatepointaround{
\pgfpointadd{
\pgfpointadd{\pgfpoint{-2ex}{0cm}}{
\pgfpointlineattime{0.5}
{\lowerleftanchor}{\lowerrightanchor}
}
}
{\centerpoint}
}{\centerpoint}{\rotate}
}
\anchor{pax}{
\trianglepoints
\pgfmathrotatepointaround{
\pgfpointadd{\pgfpointlineattime{0.5}
{\lowerleftanchor}{\lowerrightanchor}}{\centerpoint}}
{\centerpoint}{\rotate}
}
\anchor{middle pax}{
\trianglepoints
\pgfmathrotatepointaround{
\pgfpointadd{\pgfpointlineattime{0.5}
{\lowerleftanchor}{\lowerrightanchor}}{\centerpoint}}
{\centerpoint}{\rotate}
}
\anchor{above left pax}{
\trianglepoints
\pgfmathrotatepointaround{
\pgfpointadd{
\pgfpointadd{\pgfpoint{-2ex}{0cm}}{
\pgfpointlineattime{0.25}
{\lowerleftanchor}{\lowerrightanchor}
}
}
{\centerpoint}
}{\centerpoint}{\rotate}
}
\anchor{left pax}{
\trianglepoints
\pgfmathrotatepointaround{
\pgfpointadd{\pgfpointlineattime{0.25}
{\lowerleftanchor}{\lowerrightanchor}}{\centerpoint}}
{\centerpoint}{\rotate}
}
\anchor{above right pax}{
\trianglepoints
\pgfmathrotatepointaround{
\pgfpointadd{
\pgfpointadd{\pgfpoint{-2ex}{0cm}}{
\pgfpointlineattime{0.75}
{\lowerleftanchor}{\lowerrightanchor}
}
}
{\centerpoint}
}{\centerpoint}{\rotate}
}
\anchor{right pax}{
\trianglepoints
\pgfmathrotatepointaround{
\pgfpointadd{\pgfpointlineattime{0.75}
{\lowerleftanchor}{\lowerrightanchor}}{\centerpoint}}
{\centerpoint}{\rotate}
}
\anchor{above pal}{
\trianglepoints
\pgfpointadd{\centerpoint}{
\pgfmathrotatepointaround{
\pgfpointadd{\pgfpoint{2ex}{0cm}}{\apexanchor}}
{\pgfpointorigin}{\rotate}
}
}
\anchor{pal}{
\trianglepoints
\pgfpointadd{\centerpoint}{
\pgfmathrotatepointaround{
\pgfpointadd{\pgfpoint{-0.07cm}{0cm}}{\apexanchor}
}{\pgfpointorigin}{\rotate}
}
}
\backgroundpath{
\trianglepoints{
\pgftransformshift{\centerpoint}
\pgftransformrotate{\rotate}
\pgfpathmoveto{\apex}
\pgfpathlineto{
\pgfpointlineattime{0.8}{\apex}{\lowerleft}
}
\pgfpathcurveto{
\pgfpointlineattime{0.9}{\apex}{\lowerleft}
}{
\pgfpointlineattime{0.1}{\lowerleft}{\lowerleft\pgf@y-\pgf@y}
}{
\pgfpointlineattime{0.2}{\lowerleft}{\lowerleft\pgf@y-\pgf@y}
}
\pgfpathlineto{
\pgfpointlineattime{0.8}{\lowerleft}{\lowerleft\pgf@y-\pgf@y}
}
\pgfpathcurveto{
\pgfpointlineattime{0.9}{\lowerleft}{\lowerleft\pgf@y-\pgf@y}
}{
\pgfpointlineattime{0.1}{\lowerleft\pgf@y-\pgf@y}{\apex}
}{
\pgfpointlineattime{0.2}{\lowerleft\pgf@y-\pgf@y}{\apex}
}
\pgfpathclose
}
}
\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@cellule\endcsname{%
\c@pgf@counta\arity\relax%
\pgfmathloop%
\ifnum\c@pgf@counta>0\relax%
\pgfutil@ifundefined{pgf@anchor@cellule@pax\space\the\c@pgf@counta}{%
% I HATE TeX
\expandafter\xdef\csname pgf@anchor@cellule@pax\space\the\c@pgf@counta\endcsname{%
\noexpand\pgfmathadd@{\noexpand\arity}{-1}%
\noexpand\c@pgf@countb=\noexpand\pgfmathresult%
\noexpand\pgfmathadd@{\the\c@pgf@counta}{-1}%
\noexpand\pgfmathdivide@{\noexpand\pgfmathresult}%
{\noexpand\the\c@pgf@countb}%
\noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{0.5}%
\noexpand\pgfmathadd@{\noexpand\pgfmathresult}{0.25}%
\noexpand\let\noexpand\time\noexpand\pgfmathresult%
\noexpand\trianglepoints%
\noexpand\pgfmathrotatepointaround{%
\noexpand\pgfpointadd{%
\noexpand\pgfpointlineattime%
{\noexpand\time}%
{\noexpand\lowerleftanchor}%
{\noexpand\lowerrightanchor}%
}{\noexpand\centerpoint}%
}{\noexpand\centerpoint}{\noexpand\rotate}%
}%
\expandafter\xdef\csname pgf@anchor@cellule@above pax\space\the\c@pgf@counta\endcsname{%
\noexpand\pgfmathadd@{\noexpand\arity}{-1}%
\noexpand\c@pgf@countb=\noexpand\pgfmathresult%
\noexpand\pgfmathadd@{\the\c@pgf@counta}{-1}%
\noexpand\pgfmathdivide@{\noexpand\pgfmathresult}%
{\noexpand\the\c@pgf@countb}%
\noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{0.5}%
\noexpand\pgfmathadd@{\noexpand\pgfmathresult}{0.25}%
\noexpand\let\noexpand\time\noexpand\pgfmathresult%
\noexpand\trianglepoints
\noexpand\pgfmathrotatepointaround{%
\noexpand\pgfpointadd{%
\noexpand\pgfpointadd{
\noexpand\pgfpoint{-2ex}{0cm}}{%
\noexpand\pgfpointlineattime%
{\noexpand\time}%
{\noexpand\lowerleftanchor}%
{\noexpand\lowerrightanchor}%
}%
}{\noexpand\centerpoint}%
}%
{\noexpand\centerpoint}%
{\noexpand\rotate}%
}%
}{\c@pgf@counta0\relax}%
\advance\c@pgf@counta-1\relax%
\repeatpgfmathloop%
}%
}
\newcommand\inetoptions{\setkeys{inet}}
\newcommand{\inetcolor}{red}
\define@key{inet}{color}{\renewcommand{\inetcolor}{#1}}
\newcommand{\inet@defaultangle}{0}
\define@key{inet}{defaultangle}{\renewcommand{\inet@defaultangle}{#1}}
\newcount\inet@angle
\inet@angle=0
\tikzset{wirestyle/.style = {draw, line width=0.15ex, line cap=rect}}
\tikzset{cellstyle/.style = {
draw, line width=0.2ex, fill=white,
inner sep=0.2ex,
}}
\tikzset{boxstyle/.style = {draw,line width=0.1ex}}
\tikzfading[name=inet fading,
left color=transparent!0,
right color=transparent!100]
\tikzset{fancywirestyle/.style = {draw, line width=0.15ex,
draw=black!50!#1,
double=white!50!#1,double distance=0.2ex,
}}
\tikzset{fancycellstyle/.style={%
general shadow={fill, shadow scale=1.0,%
shadow xshift=0.3ex,shadow yshift=-0.3ex,opacity=0.2},
line width=0.15ex,%
inner sep=0.2ex,%
draw=black!50!#1,%
top color=#1,%
bottom color=white,%!80!#1,%
shading angle=\inet@angle,%
}}
\tikzset{fancyboxstyle/.style = {line width=0.2ex,fill opacity=0.5,
fill=white!20!#1,draw=black!30!#1}}
\newif\ifinet@fancy\inet@fancyfalse
\DeclareOption{fancy}{\inet@fancytrue}
\DeclareOption{nofancy}{\inet@fancyfalse}
\newcommand{\inetfancy}{\inet@fancytrue}
\newcommand{\inetnofancy}{\inet@fancyfalse}
\newcommand{\inetsetfancycellstyle}[1]{
\tikzset{fancycellstyle/.style = {#1}}%
}
\newcommand{\inetsetfancywirestyle}[1]{
\tikzset{fancycellstyle/.style = {#1}}%
}
\DeclareOption*{\expandafter\inetoptions\expandafter{\CurrentOption}}
\ProcessOptions\relax
\pgfdeclarelayer{wire layer}
\pgfdeclarelayer{box layer}
\pgfsetlayers{box layer,wire layer,main}
\makeatletter
\newcommand{\inetcellstyle}{%
\ifinet@fancy fancycellstyle\else cellstyle\fi%
}
\newcommand{\inetwirestyle}{%
\ifinet@fancy fancywirestyle\else wirestyle\fi%
}
\newcommand{\inetboxstyle}{%
\ifinet@fancy fancyboxstyle\else boxstyle\fi%
}
\newcommand{\inetcell}[1][]{%
\@ifnextchar({%
\inetcell@ii[#1]%
}{%
\inetcell@iib[#1]%
}%
}
\def\inetcell@iib[#1]#2{%
\inetcell@ii[#1](#2){#2}%
}
\def\inetcell@ii[#1](#2)#3{%
\@ifnextchar[{\inetcell@iii[#1](#2){#3}%
}{\inetcell@iii[#1](#2){#3}[\inet@defaultangle]}%
}
\def\inetcell@iii[#1](#2)#3[#4]{%
\ifthenelse{\equal{#4}{U}}{\inet@angle=180}{%
\ifthenelse{\equal{#4}{D}}{\inet@angle=0}{%
\ifthenelse{\equal{#4}{L}}{\inet@angle=270}{%
\ifthenelse{\equal{#4}{R}}{\inet@angle=90}{\inet@angle=#4}%
}%
}%
}%
\node[%
\inetcellstyle=\inetcolor%
,shape border rotate=\inet@angle-90%
,cellule, isosceles triangle apex angle=60,%
shape border uses incircle, #1] (#2) {#3};%
}
\def\inetwirecoords(#1)(#2){%
\begin{pgfonlayer}{wire layer}%
\draw[\ifinet@fancy fancywirestyle\else wirestyle\fi=\inetcolor]%
(#1) -- (#2);%
\end{pgfonlayer}
}
\def\inetwire{%
\@ifnextchar[{\inetwire@i}{\inetwire@i[]}%
}
\def\inetwire@i[#1](#2.#3)(#4.#5){%
\begin{pgfonlayer}{wire layer}%
\draw[\inetwirestyle=\inetcolor,#1]%
(#2.#3) .. controls (#2.above #3) and (#4.above #5) .. (#4.#5);%
\end{pgfonlayer}%
}
\def\inetwirefree{%
\@ifnextchar[{\inetwirefree@i}{\inetwirefree@i[]}%
}
\def\inetwirefree@i[#1](#2.#3){%
\begin{pgfonlayer}{wire layer}%
\draw[\ifinet@fancy fancywirestyle\else wirestyle\fi=\inetcolor,#1]%
(#2.#3) -- (#2.above #3);%
\end{pgfonlayer}%
}
\newcommand{\inetloop}[1][]{%
\begin{pgfonlayer}{wire layer}%
\node[\ifinet@fancy fancywirestyle\else wirestyle\fi=\inetcolor,%
#1,circle,inner sep=6pt] {};
\end{pgfonlayer}%
}
\newcommand{\inetbox}[1][]{%
\inetbox@i[#1]%
}
\def\inetbox@i[#1]#2(#3){%
\begin{pgfonlayer}{box layer}%
\node[\ifinet@fancy fancyboxstyle\else boxstyle\fi=\inetcolor,
fit=#2,inner sep=10pt,#1] (#3) {};%
\end{pgfonlayer}%
}
\newcommand{\inetprombox}[1][]{%
\inetprombox@i[#1]%
}
\def\inetprombox@i[#1]#2(#3){%
\inetbox@i[#1]{#2}(b#3)%
\inetcell[above=-4ex of b#3.south](#3){$!$}%
%\inetcell[above=-4ex of $(b#3.south west)!.75!(b#3.south)$](#3){$!$}%
}
\makeatother
\endinput