% 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.
%
\documentclass[10pt,a4paper]{article}
\usepackage[fancy,color=orange]{tikz-inet}
\usetikzlibrary{calc}
\usepackage{ifthen}

\usepackage{fancyvrb}
\usepackage{a4wide}
\usepackage{pgffor}

\newenvironment{outputverbat}{%
    \VerbatimEnvironment\begin{VerbatimOut}{\jobname.tmp}}
    {\end{VerbatimOut}}
\newcommand{\code}[1][0.5]{
    \fbox{
    \begin{minipage}{#1\textwidth}
      \VerbatimInput[gobble=4,fontsize=\footnotesize]{\jobname.tmp}
    \end{minipage}
    }
}
\newcommand{\picturefancy}
    {\begin{tikzpicture}\input{\jobname.tmp}\end{tikzpicture}}
\newcommand{\picturenofancy}
    {\begin{tikzpicture}\inetnofancy\input{\jobname.tmp}%
    \inetfancy\end{tikzpicture}}
\newenvironment{exampleH}{\VerbatimEnvironment\begin{outputverbat}}
    {\end{outputverbat} 
    \begin{center}
    \begin{tabular}{c|cc}\picturefancy & \picturenofancy & \code\end{tabular}
    \end{center}}
\newenvironment{exampleHv}{\VerbatimEnvironment\begin{outputverbat}}
    {\end{outputverbat} 
    \begin{center}
    \begin{tabular}{c}
        \begin{tabular}{r|l}
            \picturefancy & \picturenofancy 
        \end{tabular}
        \\ \hline \\ \code[1]\end{tabular}
    \end{center}}
\newenvironment{exampleVv}{\VerbatimEnvironment\begin{outputverbat}}
    {\end{outputverbat} 
    \begin{center}
    \begin{tabular}{rl}
        \begin{tabular}{c}
        \picturefancy \\ \hline \\  \picturenofancy
        \end{tabular}
        & \code
    \end{tabular}
    \end{center}}

\begin{document}

\title{The package \textsf{tikz-inet}}
\author{Marc de Falco}
\maketitle

\begin{abstract}
    The purpose of this package is to extend tikz
    with some simple macros in order to draw interaction
    nets.
\end{abstract}

\section*{Changelog}
\newcommand{\changeitem}[2]{\item \textbf{#1} \textit{#2}}
\begin{itemize}
    \changeitem{0.1}{initial release}
\end{itemize}

\section*{TODO}
\begin{itemize}
    \item add support for proofnets
\end{itemize}

\section{Installation}
Install this package in your ressource directory or the root of your 
document directory.

This package obviously needs tikz and pgf, but \textbf{this package needs
the version, at least, 2.0 of them}.

\section{Usage}
\subsection{Loading the package}
The command to load the package is the usual 

\verb+\usepackage[<+\emph{options}\verb+>]{tikz-inet}+

where \emph{options} are a comma separated list of keys ranging in

\begin{description}
    \item[fancy] Select a fancier style suitable for talks but
        likely to frighten referees
    \item[color=] The global color used by the fancy style, must
        be xcolor compliant color
    \item[angle=] The default orientation of cells, in degrees (default to $0$, that is a cell pointing downward)
\end{description}

\subsection{Cell nodes}
The cells are displayed using the internal node system of tikz.
A special shape \emph{cellule} is inherited from the tikz shape 
isosceles triangle, thus sharing the original anchors.

A macro is defined to encapsulate the node creation.

\verb+\inetcell[+\emph{tikz display keys}\verb+](+\emph{node name}%
\verb+){+\emph{symbol}\verb+}[+\emph{angle}\verb+]+

Every parameter is optional but the symbol.

\begin{description}
    \item[symbol] The symbol of the cell, that is the text displayed
        in the center of the cell. This text is not assumed to be
        in math mode.
    \item[node name] This is the name of the node that will be
        used for referencing it or connecting wires. This name
        default to the symbol, which is a convenient way to make simple
        drawings, this can lead to some error as soon as the symbol
        is not simple, like a math text.
    \item[angle] The angle of the principal port of the cell,
        defaults to $0$ which means that the cell has a downward
        orientation with the principal port on the right.

        Special values $U,D,L$ and $R$ are defined for up, down, left and right
        orientation of the cell.
    \item[tikz display keys] This additional display keys are 
        appended to the one used by the package and given to the
        node construction. As it is appended after, it can be used to 
        redefine all display options.

        A special key \verb+arity+ allows to define arity based anchors
        for ports. This is not really useful in most cases as the
        three predefined anchors are more likely to suit your need.
\end{description}

When using this macro a lot of parameters are given to tikz, one of
them is the current cell display style. More on this can be found later.

\subsubsection{Ports}
Some anchors are named in order to reflect ports of the cell:
\begin{description}
    \item[pal] the apex of the triangle, where lies the principal port
    \item[middle pax] an auxiliary port aligned with the principal port
    \item[left pax, right pax] auxiliaries ports on each side of the opposite
        edge of the apex
    \item[pax $n$, $1 \le n \le arity$] numbered auxiliary ports associated
        with the arity key.
\end{description}

Each anchor has a sibling a bit off the cell, it allows nice curving when
branching wires. To get this special anchor, just add \verb+above+ to the 
other ones: e.g. \verb+above middle pax+

\begin{center}
\begin{tikzpicture}
    \LARGE
    \inetcell(c){Cell symbol}[90]
    \fill (c.pal) circle (2pt) 
        node[above]{\footnotesize pal};
    \fill (c.above pal) circle (2pt) 
        node[right]{\footnotesize above pal};
    \fill (c.left pax) circle (2pt) 
        node[above left]{\footnotesize left pax};
    \fill (c.above left pax) circle (2pt) 
        node[below left]{\footnotesize above left pax};
    \fill (c.middle pax) circle (2pt) 
        node[above left]{\footnotesize middle pax};
    \fill (c.above middle pax) circle (2pt) 
        node[below left]{\footnotesize above middle pax};
    \fill (c.right pax) circle (2pt) 
        node[below left]{\footnotesize right pax};
    \fill (c.above right pax) circle (2pt) 
        node[above left]{\footnotesize above right pax};
    \foreach \x in {1,...,4} {
        \fill (c.pax \x) circle (2pt)
            node[right]{\footnotesize pax \x};
    }
\end{tikzpicture}
\end{center}

\subsection{Wires}
Wires macros help connecting ports by taking into account the current
wire display style and dealing implicitly with the \emph{above} anchors.
The wires are displayed on a layer below the main one, so cells are always
on top of layers. To change this you have to use \verb+\pgfsetlayers+.

\verb+\inetwire[+\emph{tikz extra display keys}\verb+](cell1.port1)(cell2.port2)+

The arguments are self-explanatory: this wire will connect the port \verb+port1+
of \verb+cell1+ with the port \verb+port2+ of \verb+cell2+. It uses the current
wire style.

\verb+\inetloop[+\emph{tikz extra display keys}\verb+]+ 

draws a loop, that is a circle with the current wire style

\verb+\inetwirecoords[+\emph{tikz extra display keys}\verb+](A)(B)+ 

draws a wire from node A to node B with the current wire style. It's useful
to add extra wires non linking cell ports while using the current wire style.

\verb+\inetwirefree[+\emph{tikz extra display keys}\verb+](cell.port)+

draws a wire from \verb+port+ of \verb+cell+ to \verb+above port+
of the same cell, with
the current wire style. It allows fast declaration of free ports.

\subsection{Boxes}
Boxes uses the current box style when being displayed, they lie on a 
layer below the wire layer.

\verb+\inetbox[+\emph{tikz extra display keys}\verb+]{+\emph{space 
separated list of cells in the box}\verb+}(+\emph{box node name}+\verb+)+
display a box containing the given cells

\verb+\inetprombox[+\emph{tikz extra display keys}\verb+]{+\emph{space 
separated list of cells in the box}\verb+}(+\emph{promotion cell 
node name}+\verb+)+: display a box and add a promotion cell below it, 
the name of the box is \verb+bname+ where \verb+name+ is the name
of the promotion cell.



\subsection{Other macros}
\verb+\inetnofancy+, \verb+inetfancy+: hotswap the current display style

\verb+\inetcellstyle+,\verb+\inetwirestyle+,\verb+\inetboxstyle+: get
the currently used style for each type of drawing. \textbf{Don't renew this
command to define your own style!}

\verb+\inetcolor+: the current color for the fancy style, also passed
as an argument of the non fancy style.

If you want to call a style you have to give an argument, unless you have
redefined the fancy styles to not use it. For a cell like element you have
to give the key \verb+\inetcellstyle=\inetcolor+.

\subsubsection{Tikz styles}
This package define six styles :
\begin{itemize}
    \item \emph{cellstyle} and \emph{fancycellstyle}
    \item \emph{wirestyle} and \emph{fancywirestyle}
    \item \emph{boxstyle} and \emph{fancyboxstyle}
\end{itemize}
You can redefine this styles as for any other tikz styles with the
command:

\verb+\tikzset{+\emph{the style name}\verb+/.style={+\emph{tikz display keys}\verb+}}+

\section{Examples}
\subsection{Basic}
    All examples are shown with the \textsf{fancy} key on the left.

    \begin{exampleH}
    \inetcell{A}
    \end{exampleH}

    \begin{exampleVv}
    \matrix[row sep=0.5cm]{
        \inetcell{A} & & \inetcell{B} \\
        & \inetcell{C} & \\
    };
    \inetwirefree(A.middle pax)
    \inetwirefree(B.middle pax)
    \inetwirefree(C.pal)
    \inetwire(A.pal)(C.right pax)
    \inetwire(B.pal)(C.left pax)
    \inetbox{(A) (B)}(b)
    \end{exampleVv}

\subsection{Style variations}

    \begin{exampleVv}
    \matrix{
    \inetcell{A} & 
    \inetcell[fancycellstyle=green]{B} \\
    \inetcell[bottom color=green]{C} &
    \inetcell[draw=black]{D} \\
    \inetcell[very thick]{E} &
    \inetnofancy \inetcell{F} \inetfancy \\
    };
    \end{exampleVv}

\subsection{Special cases}
    \begin{exampleVv}
    \inetcell{A}
    \inetprombox{(A)}(pa)
    \inetcell[at=(bpa.east),right=5pt]{B} 
    \inetwire(B.middle pax)(A.middle pax)
    \inetprombox{(bpa)(pa)(B)}(p)
    \inetwire(A.pal)(pa.middle pax)
    \inetwirefree(pa.pal)
    \inetwirefree(p.pal)
    \inetwire(B.pal)(p.middle pax)
    \end{exampleVv}

    \begin{exampleVv}
    \newcount\angle
    \foreach \x in {1,...,12} {
        \pgfmathsetcount{\angle}{360*\x/12+90}
        \inetcell[\inetcellstyle=green!\x0,
            at=(\the\angle-90:1.5cm)]
            (c\x){A}[\angle]
    }
    \end{exampleVv}

    \begin{exampleHv}
    \newcount\angle
    \newcount\order
    \order=10
    \newcount\arity
    \pgfmathsetcount{\arity}{\order-1}
    \foreach \x in {1,...,\order} {
        \foreach \y/\symbol in {0/!,1/?} {
            \pgfmathsetcount{\angle}
                {(180*(2*\x+\y))/\order+90}
            \inetcell[at=(\the\angle-90:\the\order*1.8ex),
                arity=\order-1](c\y\x){\symbol}[\angle]
            \inetwirefree(c\y\x.pal)
        }
    }
    
    \newcount\nextcell
    \newcount\nextport
    \newcount\depth
    \foreach \x in {1,...,\order} {
        \foreach \y in {1,...,\arity} {
            \pgfmathsetcount{\nextcell}
                {mod(\x+\y-1,\order)+1}
            \pgfmathsetcount{\nextport}
                {\arity-\y+1}
            \pgfmathsetcount{\depth}{(\x-1)*100/\order}
            \inetwire[\inetwirestyle=\inetcolor!\the\depth!black]%
                (c0\x.pax \y)(c1\the\nextcell.pax \the\nextport)
        }
    }
    \end{exampleHv}

\end{document}
