% Copyright 2022 by Tom Hirschowitz
%
% 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{yade}[2022/06/07 v0.1 tikz categorical diagrams library]
\RequirePackage{tikz}
\RequirePackage{ifthen}
\RequirePackage{xparse}


\usetikzlibrary{shapes.geometric}
\usetikzlibrary{shapes.symbols}
\usetikzlibrary{shapes.arrows}
\usetikzlibrary{positioning}
\usetikzlibrary{matrix}
\usetikzlibrary{fit}
\usetikzlibrary{calc}
\usetikzlibrary{decorations}
\usetikzlibrary{decorations.markings}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{decorations.pathmorphing}
\usetikzlibrary{arrows}
\usetikzlibrary{backgrounds}
\usetikzlibrary{quotes}
\pgfkeys{/pgf/.cd,
    arity/.initial=4,
}



\def\twocell{%
  \@ifnextchar[{\twocell@i}{\twocell@i[.4]}%
}
\def\twocell@i[#1]{%
  \@ifnextchar[{\twocell@ii[#1]}{\twocell@ii[#1][#1]}%
}
\def\twocell@ii[#1][#2]{%
  \deuxcellule{#1}{#2}%
}

% A TikZ style for curved arrows, inspired by AndréC's.
\tikzset{curve/.style={settings={#1},to path={
      let \p1 = ($(\tikztostart) - (\tikztotarget)$) in
      (\tikztostart)
.. controls
($(\tikztostart)!\pv{pos}!(\tikztotarget)!{veclen(\x1,\y1)*\pv{ratio}*1pt}!270:(\tikztotarget)$)
and ($(\tikztostart)!1-\pv{pos}!(\tikztotarget)!{veclen(\x1,\y1)*\pv{ratio}*1pt}!270:(\tikztotarget)$)
.. (\tikztotarget)\tikztonodes}},
settings/.code={\tikzset{yade/.cd,#1}
\def\pv##1{\pgfkeysvalueof{/tikz/yade/##1}}},
yade/.cd,pos/.initial=0.35,ratio/.initial=0}

\newcommand{\deuxcellule}[8]{%
  \node[coordinate] (a) at (#3) {} ; %
  \node[coordinate] (b) at (#4) {} ; %
  \node[coordinate] (c) at (#5) {} ; %
  \node[coordinate] (d) at (#6) {} ; %
  \path let 
  \p1= ($(b) - (a)$) , %
  \p2= ($(d) - (c)$), %
  \n1={veclen(\x1,\y1)}, %
  \n2={veclen(\x2,\y2)}, %
  \p3=($(\x1/\n1,\y1/\n1)$),%
  \p4=($(\x2/\n2,\y2/\n2)$),%
  \n3={#1 * \n1},%
  \p5=($(\n3 * \x3, \n3 * \y3)$),%
  \n3={#2 * \n2},%
  \p6=($(\n3 * \x4, \n3 * \y4)$) in%
   (a) ++ (\p5)  node[coordinate] (x) {} %%
   (c) ++ (\p6)  node[coordinate] (y) {} %%
   ;
 \draw[#7] (x) -| (y) ; %
}

% Old macros, for compatibility
\newcommand{\twocellleft}[5][.4]{\twocell[#1]{#2}{#3}{#4}{#5}{}{cell=0,bend left}}
\newcommand{\twocellright}[5][.4]{\twocell[#1]{#2}{#3}{#4}{#5}{}{cell=0,bend right}}

\DeclareDocumentCommand{\twocelll}{O{.4} o D(){0} > { \SplitArgument { 1 } { , } } D<>{0.5,0.5}  m m o m m}{%
\deuxcellule{#1}{\IfNoValueTF{#2}{#1}{#2}}{#5}{#6}{\IfNoValueTF{#7}{#5}{#7}}{#8}{}{bend right={#3},celllr=#4,label={[left]{$\scriptstyle #9$}}}}
\DeclareDocumentCommand{\twocellbr}{O{.4} o D(){30} > { \SplitArgument { 1 } { , } } D<>{0.5,0.5}  m m o m m}{%
\deuxcellule{#1}{\IfNoValueTF{#2}{#1}{#2}}{#5}{#6}{\IfNoValueTF{#7}{#5}{#7}}{#8}{}{bend right={#3},celllr=#4,label={[below right]{$\scriptstyle #9$}}}}
\DeclareDocumentCommand{\twocellr}{O{.4} o D(){0} > { \SplitArgument { 1 } { , } } D<>{0.5,0.5}  m m o m m}{%
\deuxcellule{#1}{\IfNoValueTF{#2}{#1}{#2}}{#5}{#6}{\IfNoValueTF{#7}{#5}{#7}}{#8}{}{bend right={#3},celllr=#4,label={[right]{$\scriptstyle #9$}}}}
\DeclareDocumentCommand{\twocellb}{O{.4} o D(){0} > { \SplitArgument { 1 } { , } } D<>{0.5,0.5}  m m o m m}{%
\deuxcellule{#1}{\IfNoValueTF{#2}{#1}{#2}}{#5}{#6}{\IfNoValueTF{#7}{#5}{#7}}{#8}{}{bend right={#3},celllr=#4,label={[below]{$\scriptstyle #9$}}}}
\DeclareDocumentCommand{\twocella}{O{.4} o D(){0} > { \SplitArgument { 1 } { , } } D<>{0.5,0.5}  m m o m m}{%
\deuxcellule{#1}{\IfNoValueTF{#2}{#1}{#2}}{#5}{#6}{\IfNoValueTF{#7}{#5}{#7}}{#8}{}{bend right={#3},celllr=#4,label={[above]{$\scriptstyle #9$}}}}
\DeclareDocumentCommand{\twocellal}{O{.4} o D(){30} > { \SplitArgument { 1 } { , } } D<>{0.5,0.5}  m m o m m}{%
\deuxcellule{#1}{\IfNoValueTF{#2}{#1}{#2}}{#5}{#6}{\IfNoValueTF{#7}{#5}{#7}}{#8}{}{bend right={#3},celllr=#4,label={[above left]{$\scriptstyle #9$}}}}
\DeclareDocumentCommand{\twocellar}{O{.4} o D(){30} > { \SplitArgument { 1 } { , } } D<>{0.5,0.5}  m m o m m}{%
\deuxcellule{#1}{\IfNoValueTF{#2}{#1}{#2}}{#5}{#6}{\IfNoValueTF{#7}{#5}{#7}}{#8}{}{bend left={#3},celllr=#4,label={[above right]{$\scriptstyle #9$}}}}
\DeclareDocumentCommand{\twocellbl}{O{.4} o D(){30} > { \SplitArgument { 1 } { , } } D<>{0.5,0.5}  m m o m m}{%
\deuxcellule{#1}{\IfNoValueTF{#2}{#1}{#2}}{#5}{#6}{\IfNoValueTF{#7}{#5}{#7}}{#8}{}{bend right={#3},celllr=#4,label={[below left]{$\scriptstyle #9$}}}}

% Two cell bent right

\def\twocellrb{%
  \@ifnextchar[{\twocellrb@i}{\twocellrb@i[.4]}%
}
\def\twocellrb@i[#1]{%
  \@ifnextchar[{\twocellrb@ii[#1]}{\twocellrb@ii[#1][#1]}%
}
\def\twocellrb@ii[#1][#2]{%
  \deuxcellulerb{#1}{#2}%
}
\newcommand{\deuxcellulerb}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend right,labeld={#6}}}

\def\twocellra{%
  \@ifnextchar[{\twocellra@i}{\twocellra@i[.4]}%
}
\def\twocellra@i[#1]{%
  \@ifnextchar[{\twocellra@ii[#1]}{\twocellra@ii[#1][#1]}%
}
\def\twocellra@ii[#1][#2]{%
  \deuxcellulera{#1}{#2}%
}
\newcommand{\deuxcellulera}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend right,labelu={#6}}}

\def\twocellral{%
  \@ifnextchar[{\twocellral@i}{\twocellral@i[.4]}%
}
\def\twocellral@i[#1]{%
  \@ifnextchar[{\twocellral@ii[#1]}{\twocellral@ii[#1][#1]}%
}
\def\twocellral@ii[#1][#2]{%
  \deuxcelluleral{#1}{#2}%
}
\newcommand{\deuxcelluleral}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend right,labelal={#6}}}

\def\twocellro{%
  \@ifnextchar[{\twocellro@i}{\twocellro@i[.4]}%
}
\def\twocellro@i[#1]{%
  \@ifnextchar[{\twocellro@ii[#1]}{\twocellro@ii[#1][#1]}%
}
\def\twocellro@ii[#1][#2]{%
  \deuxcellulero{#1}{#2}%
}
\newcommand{\deuxcellulero}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend right,labelo={#6}}}

\def\twocellrl{%
  \@ifnextchar[{\twocellrl@i}{\twocellrl@i[.4]}%
}
\def\twocellrl@i[#1]{%
  \@ifnextchar[{\twocellrl@ii[#1]}{\twocellrl@ii[#1][#1]}%
}
\def\twocellrl@ii[#1][#2]{%
  \deuxcellulerl{#1}{#2}%
}
\newcommand{\deuxcellulerl}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend right,labell={#6}}}

\def\twocellrr{%
  \@ifnextchar[{\twocellrr@i}{\twocellrr@i[.4]}%
}
\def\twocellrr@i[#1]{%
  \@ifnextchar[{\twocellrr@ii[#1]}{\twocellrr@ii[#1][#1]}%
}
\def\twocellrr@ii[#1][#2]{%
  \deuxcellulerr{#1}{#2}%
}
\newcommand{\deuxcellulerr}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend right,labelr={#6}}}

\def\twocellrbr{%
  \@ifnextchar[{\twocellrbr@i}{\twocellrbr@i[.4]}%
}
\def\twocellrbr@i[#1]{%
  \@ifnextchar[{\twocellrbr@ii[#1]}{\twocellrbr@ii[#1][#1]}%
}
\def\twocellrbr@ii[#1][#2]{%
  \deuxcellulerbr{#1}{#2}%
}
\newcommand{\deuxcellulerbr}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend right,labelbr={#6}}}

% Two cell bent left

\def\twocelllb{%
  \@ifnextchar[{\twocelllb@i}{\twocelllb@i[.4]}%
}
\def\twocelllb@i[#1]{%
  \@ifnextchar[{\twocelllb@ii[#1]}{\twocelllb@ii[#1][#1]}%
}
\def\twocelllb@ii[#1][#2]{%
  \deuxcellulelb{#1}{#2}%
}
\newcommand{\deuxcellulelb}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend left,labeld={#6}}}

\def\twocellla{%
  \@ifnextchar[{\twocellla@i}{\twocellla@i[.4]}%
}
\def\twocellla@i[#1]{%
  \@ifnextchar[{\twocellla@ii[#1]}{\twocellla@ii[#1][#1]}%
}
\def\twocellla@ii[#1][#2]{%
  \deuxcellulela{#1}{#2}%
}
\newcommand{\deuxcellulela}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend left,labelu={#6}}}

\def\twocelllal{%
  \@ifnextchar[{\twocelllal@i}{\twocelllal@i[.4]}%
}
\def\twocelllal@i[#1]{%
  \@ifnextchar[{\twocelllal@ii[#1]}{\twocelllal@ii[#1][#1]}%
}
\def\twocelllal@ii[#1][#2]{%
  \deuxcellulelal{#1}{#2}%
}
\newcommand{\deuxcellulelal}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend left,labelal={#6}}}

\def\twocelllo{%
  \@ifnextchar[{\twocelllo@i}{\twocelllo@i[.4]}%
}
\def\twocelllo@i[#1]{%
  \@ifnextchar[{\twocelllo@ii[#1]}{\twocelllo@ii[#1][#1]}%
}
\def\twocelllo@ii[#1][#2]{%
  \deuxcellulelo{#1}{#2}%
}
\newcommand{\deuxcellulelo}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend left,labelo={#6}}}

\def\twocellll{%
  \@ifnextchar[{\twocellll@i}{\twocellll@i[.4]}%
}
\def\twocellll@i[#1]{%
  \@ifnextchar[{\twocellll@ii[#1]}{\twocellll@ii[#1][#1]}%
}
\def\twocellll@ii[#1][#2]{%
  \deuxcellulell{#1}{#2}%
}
\newcommand{\deuxcellulell}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend left,labell={#6}}}

\def\twocelllr{%
  \@ifnextchar[{\twocelllr@i}{\twocelllr@i[.4]}%
}
\def\twocelllr@i[#1]{%
  \@ifnextchar[{\twocelllr@ii[#1]}{\twocelllr@ii[#1][#1]}%
}
\def\twocelllr@ii[#1][#2]{%
  \deuxcellulelr{#1}{#2}%
}
\newcommand{\deuxcellulelr}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend left,labelr={#6}}}

\def\twocelllbr{%
  \@ifnextchar[{\twocelllbr@i}{\twocelllbr@i[.4]}%
}
\def\twocelllbr@i[#1]{%
  \@ifnextchar[{\twocelllbr@ii[#1]}{\twocelllbr@ii[#1][#1]}%
}
\def\twocelllbr@ii[#1][#2]{%
  \deuxcellulelbr{#1}{#2}%
}
\newcommand{\deuxcellulelbr}[6]{\twocell[#1][#2]{#3}{#4}{#5}{}{cell=0,bend left,labelbr={#6}}}


\newbox\xrat@below
\newbox\xrat@above
\newcommand{\Xarrow}[3][]{%
  \setbox\xrat@below=\hbox{\ensuremath{\scriptstyle #2}}%
  \setbox\xrat@above=\hbox{\ensuremath{\scriptstyle #3}}%
  \pgfmathsetlengthmacro{\xrat@len}{max(\wd\xrat@below,\wd\xrat@above)+.6em}%
  \mathrel{\tikz [#1,baseline=-.75ex]
                 \draw (0,0) -- node[below=-2pt] {\box\xrat@below}
                                node[above=-2pt] {\box\xrat@above}
                       (\xrat@len,0) ;}}

\newcommand{\xarrow}[2][]{%
  \setbox\xrat@above=\hbox{\ensuremath{\scriptstyle #2\ }}%
  \pgfmathsetlengthmacro{\xrat@len}{\wd\xrat@above+.8em}%
  \mathrel{\tikz [baseline=-.75ex]
                 \draw (0,0) edge[#1] node[above=-2pt] {\box\xrat@above}
                       (\xrat@len,0) ;}}




\makeatother
\newenvironment{net}{\begin{tikzpicture}[baseline=(current bounding box.center),text depth=.2em,text height=.8em,inner sep=1pt]}{\end{tikzpicture}}

\newcommand{\ssf}[2]{%
\inetatom(#1){#2}%
}

\newcommand{\gimpll}{\ssf{Rien}{\impll}}
\newcommand{\gtens}{\ssf{Rien}{\tens}}
\newcommand{\gimpllof}[1]{\ssf{#1}{\impll}}
\newcommand{\gtensof}[1]{\ssf{#1}{\tens}}
\newcommand{\gun}[1]{\ssf{#1}{\un}}
\newcommand{\rpare}[1]{\node[text depth=.2em,text height=.8em,inner sep=0pt] (#1) {\ensuremath{)}};}
\newcommand{\lpare}[1]{\node[text depth=.2em,text height=.8em,inner sep=0pt] (#1) {\ensuremath{(}};}
\newcommand{\point}[1]{\node[right=0cm of #1] {.} ; }
\newcommand{\virgule}[1]{\node[right=0cm of #1] {,} ; }
\newcommand{\poing}{\ssf{}{.}}
\newcommand{\rieng}{\ssf{}{\,}}



\pgfdeclaredecoration{single line}{initial}{
                             \state{initial}[width=\pgfdecoratedpathlength-1sp]{\pgfpathmoveto{\pgfpointorigin}}
                             \state{final}{\pgfpathlineto{\pgfpointorigin}}
}

\pgfdeclaredecoration{single line backwards}{initial}{
                             \state{initial}[width=\pgfdecoratedpathlength-1sp]{\pgfpathmoveto{\pgfpointorigin}}
                             \state{final}{\pgfpathlineto{\pgfpointorigin}}
}

\tikzset{
        raise line/.style={
              decoration={single line, raise=#1}, decorate
              }
}

\tikzset{
mod/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with { 
\path[draw,-] (0,-3pt) -- (0,3pt); 
}}}}}

\tikzset{
label/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with {\node[inner sep=2pt,outer sep=0] #1 ;}
}}}}

\tikzset{
labelo/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with {\node[circle,inner sep=0pt,fill=white] {$\scriptstyle #1$} ;}
}}}}

\tikzset{
labelon/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with {\node[inner sep=1pt,fill=white] {$\scriptstyle #1$} ;}
}}}}

\tikzset{
labelonb/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with {\node[inner sep=0pt,fill={bg}] {$\scriptstyle #1$} ;}
}}}}

\tikzset{
labelat/.style 2 args={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position #2 with {\node[inner sep=2pt] #1 ;}
}}}}

\tikzset{
labeloat/.style 2 args={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position #2 with {\node[inner sep=0.1pt,fill=white] {$\scriptstyle #1$} ;}
}}}}

\tikzset{
labelonat/.style 2 args={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position #2 with {\node[inner sep=0.1pt,fill=white] {$\scriptstyle #1$} ;}
}}}}




\tikzset{diagnode/.style={anchor=base,inner sep=5pt,outer sep=0pt}}
\tikzset{diag/.style 2 args=%
  {
matrix of math nodes,ampersand replacement=\&, %
text height=1.2ex, text depth=0.25ex, %
row sep={#1 cm,between borders}, %
column sep={#2 cm,between borders}}  
}%
\tikzset{diagorigins/.style 2 args=%
{matrix of math nodes,ampersand replacement=\&, %
row sep={#1 cm,between origins}, %
column sep={#2 cm,between origins}}  
}%
\tikzset{stringdiag/.style 2 args=%
{nodes={inner sep=1pt,outer sep=0pt},%
  ampersand replacement=\&,%
    row sep={#1 cm,between origins}, %
    column sep={#2 cm,between origins}%
}}%
\newcommand{\diaggrandhauteur}{1}
\newcommand{\diaggrandlargeur}{2}
\newcommand{\diagpetithauteur}{.5}
\newcommand{\diagpetitlargeur}{1.5}

\tikzset{organigram/.style 2 args={matrix of nodes,ampersand replacement=\&, %
text height=1.7ex, text depth=0.25ex, %
row sep={#1 cm,between origins}, %
column sep={#2 cm,between origins}  }}

\tikzset{graphe/.style 2 args={matrix of math nodes,ampersand replacement=\&, %
      row sep={#1 cm,between origins}, %
      column sep={#2 cm,between origins}, %
      inner sep=-.1ex}} %

\tikzset{
two/.style 2 args={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with \node (#1) [#2] {} ;
}}}}

\tikzset{
twocenter/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with \node (#1) {} ;
}}}}

\tikzset{
twoon/.style 2 args={twocenter={#1},label={{$\scriptstyle #2$}}}
}
\tikzset{
twoo/.style={two={on},label={{$\scriptstyle #1$}}}
}
\tikzset{
twol/.style={two={l}{right},label={[left]{$\scriptstyle #1$}}}
}
\tikzset{
twoleft/.style 2 args={two={#1}{right},label={[left]{$\scriptstyle #2$}}}
}
\tikzset{
twor/.style={two={r}{left},label={[right]{$\scriptstyle #1$}}}
}
\tikzset{
tworight/.style 2 args={two={#1}{left},label={[right]{$\scriptstyle #2$}}}
}
\tikzset{
twou/.style={two={u}{below},label={[above]{$\scriptstyle #1$}}}
}
\tikzset{
twoa/.style={two={a}{below},label={[above]{$\scriptstyle #1$}}}
}
\tikzset{
twoup/.style 2 args={two={#1}{below},label={[above]{$\scriptstyle #2$}}}
}
\tikzset{
twoabove/.style 2 args={two={#1}{below},label={[above]{$\scriptstyle #2$}}}
}
\tikzset{
twod/.style={two={d}{above},label={[below]{$\scriptstyle #1$}}}
}
\tikzset{
twob/.style={two={b}{above},label={[below]{$\scriptstyle #1$}}}
}
\tikzset{
twodown/.style 2 args={two={#1}{above},label={[below]{$\scriptstyle #2$}}}
}
\tikzset{
twobelow/.style 2 args={two={#1}{above},label={[below]{$\scriptstyle #2$}}}
}
\tikzset{
twoal/.style={two={al}{right},label={[above left]{$\scriptstyle #1$}}}
}
\tikzset{
twoaboveleft/.style 2 args={two={#1}{above},label={[above left]{$\scriptstyle #2$}}}
}
\tikzset{
twoar/.style={two={ar}{left},label={[above right]{$\scriptstyle #1$}}}
}
\tikzset{
twoaboveright/.style 2 args={two={#1}{above},label={[above right]{$\scriptstyle #2$}}}
}
\tikzset{
twobr/.style={two={br}{left},label={[below right]{$\scriptstyle #1$}}}
}
\tikzset{
twobelowright/.style 2 args={two={#1}{left},label={[below right]{$\scriptstyle #2$}}}
}
\tikzset{
twobl/.style={two={bl}{right},label={[below left]{$\scriptstyle #1$}}}
}
\tikzset{
twobelowleft/.style 2 args={two={#1}{right},label={[below left]{$\scriptstyle #2$}}}
}
\tikzset{
twol/.style={two={l}{right},label={[left]{$\scriptstyle #1$}}}
}

\tikzset{
labell/.style={label={[left]{$\scriptstyle #1$}}}
}
\tikzset{
labellat/.style 2 args={labelat={[left]{$\scriptstyle #1$}}{#2}}
}
\tikzset{
labelr/.style={label={[right]{$\scriptstyle #1$}}}
}
\tikzset{
labelrat/.style 2 args={labelat={[right]{$\scriptstyle #1$}}{#2}}
}
\tikzset{
labelar/.style={label={[above right]{$\scriptstyle #1$}}}
}
\tikzset{
labelarat/.style 2 args={labelat={[above right]{$\scriptstyle #1$}}{#2}}
}
\tikzset{
labelbr/.style={label={[below right]{$\scriptstyle #1$}}}
}
\tikzset{
labelbrat/.style 2 args={labelat={[below right]{$\scriptstyle #1$}}{#2}}
}
\tikzset{
labelu/.style={label={[above]{$\scriptstyle #1$}}}
}
\tikzset{
labeluat/.style 2 args={labelat={[above]{$\scriptstyle #1$}}{#2}}
}
\tikzset{
  labela/.style={label={[above]{$\scriptstyle #1$}}}
}
\tikzset{
labelaat/.style 2 args={labelat={[above]{$\scriptstyle #1$}}{#2}}
}
\tikzset{
  loina/.style={label={[above=.5em]{$\scriptstyle #1$}}}
}
\tikzset{
labeld/.style={label={[below]{$\scriptstyle #1$}}}
}
\tikzset{
labelb/.style={label={[below]{$\scriptstyle #1$}}}
}
\tikzset{
labelbat/.style 2 args={labelat={[below]{$\scriptstyle #1$}}{#2}}
}
\tikzset{
loinb/.style={label={[below=.5em]{$\scriptstyle #1$}}}
}
\tikzset{
labelal/.style={label={[above left]{$\scriptstyle #1$}}}
}
\tikzset{
labelalat/.style 2 args={labelat={[above left]{$\scriptstyle #1$}}{#2}}
}
\tikzset{
labelbl/.style={label={[below left]{$\scriptstyle #1$}}}
}
\tikzset{
labelblat/.style 2 args={labelat={[below left]{$\scriptstyle #1$}}{#2}}
}
\tikzset{
labellat/.style 2 args={labelat={[left]{$\scriptstyle #1$}}{#2}}
}

\newcommand{\cs}[2][draw,->]{ %
  \path[#1] (#2-1-1) -- (#2-1-2) ; %
  \path[#1] (#2-1-3) -- (#2-1-2) ; %
}

\newcommand{\cospan}{\cs{m}}

\newcommand{\vdoublecs}[2][draw,->]{
    \foreach \i in {1,2,3} %
    {%
    \path[#1] (#2-1-\i)  -- (#2-2-\i) ;%
    \path[#1] (#2-3-\i) -- (#2-2-\i) ; %
  }    ; %
}

\newcommand{\hdoublecs}[2][draw,->]{
    \foreach \i in {1,2,3} %
    {%
    \path[#1] (#2-\i-1)  -- (#2-\i-2) ;%
    \path[#1] (#2-\i-3) -- (#2-\i-2) ; %
  }    ; %
}

\newcommand{\vdoubleisos}[1]{
    \foreach \i in {1,2,3} %
    {%
    \isopath{#1-1-\i}{#1-2-\i} %
    \isopath{#1-2-\i}{#1-3-\i} %
  }    ; %
}

\newcommand{\hdoubleisos}[1]{
    \foreach \i in {1,2,3} %
    {%
    \isopath{#1-\i-1}{#1-\i-2} %
    \isopath{#1-\i-2}{#1-\i-3} %
  }    ; %
}

\newcommand{\doublecs}[2][draw,->]{%
  \vdoublecs[#1]{#2} %
  \hdoublecs[#1]{#2} %
}

\newcommand{\doublecospan}{\doublecs{m}}

\newcommand{\sq}[4]{%
  (m-1-1) edge[twou={#1}] (m-1-2) %
  (m-1-1) edge[twol={#2}] (m-2-1) %
  (m-1-2) edge[twor={#3}] (m-2-2) %
  (m-2-1) edge[twod={#4}] (m-2-2) %
}      

\newcommand{\sqpath}[6]{
        \draw[->,#6,rounded corners]
        (#1) -- +(#2:#3ex) --  node(#4) {} ($(#5) + (#2:#3ex)$) -- (#5) %
        ; %
      }

\newcommand{\celltoangle}[5]{      
  \path[draw] ($(#1)+(#2:#3ex)$) edge[celllr={0}{0},#5] ($(#1)+(#2:#4ex)$) ; %
}

\newcommand{\pbkdefault}{1.4em}
\newcommand{\pbkmargin}{1pt}
\DeclareDocumentCommand{\pullbackk}{O{\pbkdefault} O{\pbkdefault} D(){2pt} m m m m}{%
  \node[coordinate] (a) at (#4) {} ; %
  \node[coordinate] (b) at (#5) {} ; %
  \node[coordinate] (c) at (#6) {} ; %
  \node[coordinate] (a') at ($(b)!#1!(a)$) {} ; %
  \node[coordinate] (c') at ($(b)!#2!(c)$) {} ; %
  \node[coordinate] (d) at (barycentric cs:a'=1,c'=1,b=-1) {} ; %
  \node[coordinate] (aup) at ($(a')!#3!(d)$) {};
  \node[coordinate] (cup) at ($(c')!#3!(d)$) {};
 \path[#7] (aup) -- (d) -- (cup) ; %
}
\newcommand{\pullback}[5][\pbkdefault]{\pullbackk[#1][#1]{#2}{#3}{#4}{#5}}

\newcommand{\pbk}[4][\pbkdefault]{%
  \pullbackk[#1][#1]{#2}{#3}{#4}{draw,-} }
\newcommand{\stdpbk}{\pbk{m-2-1}{m-1-1}{m-1-2}}
\newcommand{\stdpo}{\pbk{m-2-1}{m-2-2}{m-1-2}}

\newcommand{\onepbk}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,densely dotted} }
\newcommand{\ptwpbk}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,densely dotted} }

\newcommand{\wpbk}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,dashed} }

\newcommand{\pbkk}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{cell=0} }

\newcommand{\laxpbk}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,->,cell=0} }
\newcommand{\oplaxpbk}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,<-,cell=0} }

\newcommand{\poleftg}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,open triangle 45-} }
\newcommand{\porightg}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,open triangle 45 reversed-} }

\newcommand{\dpbk}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,-open triangle 45} }
\newcommand{\dpbkrev}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,-open triangle 45 reversed} }
\newcommand{\dpbkblack}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,-triangle 45} }
\newcommand{\dpbkblackrev}[4][\pbkdefault]{%
  \pullback[#1]{#2}{#3}{#4}{draw,triangle 45-open triangle 45} }




\tikzset{shortenlr/.style 2 args={shorten <={#1 ex},shorten >={#2 ex}}}
\tikzset{
back/.style={densely dotted}
}
\tikzset{
fore/.style 2 args={preaction={draw={white},-,line width=4pt,shorten <=#1cm,shorten >=#2cm}},
fore/.default={0.2}{0.2}
}
\tikzset{
foretwo/.style={preaction={draw=white,-,line width=6pt}}
}

\tikzset{twocell/.style = {double equal sign distance,double,-implies,shorten <= .15cm,shorten >=.15cm,draw}}
\tikzset{
cell/.style = {double equal sign distance,double,-implies,shorten <= #1 cm,shorten >=#1 cm,draw}
}
\tikzset{celllr/.style 2 args = {double equal sign distance,double,-implies,shorten <= #1 ex,shorten >=#2 ex,draw}}
\tikzset{identity/.style = {double equal sign distance,double,-,draw}}
\tikzset{iso/.style = {label={[below=0em,sloped]{$\scriptstyle -$}},label={[above=-.2em,sloped]{$\scriptstyle \sim$}}}}
\tikzset{equi/.style = {label={[above=-.2em,sloped]{$\scriptstyle \sim$}}}}
\tikzset{isotwo/.style = postaction={ 
    decorate, 
    decoration={ 
      markings, 
      mark=at position .5 with {\node[inner sep=2pt,outer sep=0,above=-.2em,sloped] {$\scriptstyle \sim$} ;}
    }}}
\tikzset{isor/.style = {labelr={\iso}}}
\tikzset{isol/.style = {labell={\iso}}}
\tikzset{isod/.style = {labeld={\iso}}}
\tikzset{isobr/.style = {labelbr={\iso}}}
\tikzset{baseline= (current bounding box.center)}
\tikzset{foreground/.style = {draw=white,very thick,double=black}}
\tikzset{background/.style = {draw=white,-,line width=3pt}}
\tikzset{diagram/.style = {column sep=1.5cm,row sep=1cm,nodes={minimum width=1cm}}}
\tikzset{nuage/.style = {cloud,draw,minimum width=2cm,minimum height=.6cm,cloud puffs=30,anchor=center}}
\tikzset{into/.style = {right hook->}}
\tikzset{otni/.style = {<-left hook}}
\tikzset{linto/.style = {left hook->}}
\tikzset{leadsto/.style = {->,decorate,decoration={snake,amplitude={#1 pt}}}}
\tikzset{leadsto/.default = {1.5}}
\tikzset{otsdael/.style = {<-,decorate,decoration={snake,amplitude=1.5pt}}}
\tikzset{onto/.style = {->>}}
\tikzset{mono/.style = {>->}}
\tikzset{fib/.style = {-latex}}
\tikzset{dfib/.style = {-Latex[open]}}
\tikzset{generic/.style = {-Triangle[]}}
\tikzset{free/.style = {-Triangle[open]}}
\tikzset{final/.style = {-]}}
\tikzset{epi/.style = {->>}}
\tikzset{adj/.style 2 args={text height={#1},text depth={#2}}}
\tikzset{adj/.default={.1cm}{0cm}}
\tikzset{iff/.style = {double equal sign distance,double,-implies,draw,shorten <= #1cm}}
\tikzset{
mod/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with {\draw[-] (0pt,-2pt) -- (0pt,2pt);}
}}},
negate/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with {\node[transform shape] (tempnode) {$/$};}
}}},
mapsto/.style={|->},
otspam/.style={<-|},
pro/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position #1 with {\draw[-,fill] (0pt,0pt) circle (1.5pt);}
}}},
pro/.default={.5},
glob/.style={postaction={ 
decorate, 
decoration={ 
markings, 
mark=at position .5 with {\draw[-,fill=white] (0pt,0pt) circle (1.5pt);}
}}}
}

\newcommand{\idto}{\mathbin{\tikz[baseline] \draw[identity] (0pt,.5ex) -- (3ex,.5ex);}}
\newcommand{\idot}{\mathbin{\tikz[baseline] \draw[identity] (3ex,.5ex) -- (0pt,.5ex);}}
\newcommand{\fibto}[1]{\mathbin{\tikz[baseline] \draw (0pt,.5ex) edge[fib,labelu={\scriptstyle #1}] (3ex,.5ex);}}
\newcommand{\fibot}[1]{\mathbin{\tikz[baseline] \draw (3ex,.5ex) edge[fib,labelu={\scriptstyle #1}] (0pt,.5ex);}}
\newcommand{\dfibto}{
  \mathbin{\tikz[baseline] \draw (0pt,.5ex) edge[dfib] (3ex,.5ex);}}
\newcommand{\xdfibto}[1]{
  \mathbin{\tikz[baseline] \draw (0pt,.5ex) edge[dfib,labelu={\scriptstyle #1}] (3ex,.5ex);}}
\newcommand{\shortdfibto}{
  \mathbin{\tikz[baseline] \draw (0pt,.5ex) edge[dfib] (1.5ex,.5ex);}}
\newcommand{\shortdfibot}{
  \mathbin{\tikz[baseline] \draw (1.5ex,.5ex) edge[dfib] (0,.5ex);}}
\newcommand{\xxto}[2]{\mathbin{\tikz[baseline] \draw (0pt,.5ex) edge[->,labelu={\scriptstyle #1},labelb={\scriptstyle #2}] (3ex,.5ex);}}

\newcommand{\dfibot}[1][]{
  \mathbin{\tikz[baseline] \draw (3ex,.5ex) edge[dfib,labelu={\scriptstyle #1}] (0pt,.5ex);}}
\newcommand{\modto}{\mathbin{\tikz[baseline] \draw[->,mod] (0pt,.5ex) -- (3ex,.5ex);}}
\newcommand{\proto}{\mathbin{\tikz[baseline] \draw[->,pro] (0pt,.5ex) -- (3ex,.5ex);}}
\newcommand{\shortproto}{\mathbin{\tikz[baseline] \draw[->,pro] (0pt,.5ex) -- (1.5ex,.5ex);}}
\newcommand{\finalto}{\mathbin{\tikz[baseline] \draw (0pt,.5ex) edge[final] (3ex,.5ex);}}
\newcommand{\xfinalto}[1]{\mathbin{\tikz[baseline] \draw (0pt,.5ex) edge[final,labelu={\scriptstyle #1}] (3ex,.5ex);}}
\newcommand{\finalot}{\mathbin{\tikz[baseline] \draw (3ex,.5ex) edge[final] (0pt,.5ex);}}
\newcommand{\xfinalot}[1]{\mathbin{\tikz[baseline] \draw (3ex,.5ex) edge[final,labelu={\scriptstyle #1}] (0pt,.5ex);}}
\newcommand{\shortinto}{\mathbin{\tikz[baseline] \draw[->,into] (0pt,.5ex) -- (2ex,.5ex);}}



\newcommand{\cellule}[3][]{ %
  \path (#3) +(#2:-.4cm) [twocell,#1] -- +(#2:.4cm) ; %
}

\newcommand{\celluled}[2]{ %
  \cellule[labell={#2}]{-90}{#1} %
}
\newcommand{\celluler}[2]{ %
  \cellule[labelu={#2}]{0}{#1} %
}

\newcommand{\isopath}[2]{%
            \path %
            (#1) -- node[sloped] {$\iso$} (#2) ; %
}

\newcommand{\adjtemplate}[6][1]{%
          \begin{tikzpicture}[baseline=(m-1-1.base)] %
            \matrix (m) [diag={1}{#1},
            column sep={#1 cm,between borders}]{ %
              |[adj]| #2 %
              \& #6 %
              \& |[adj]| #3 \\
              } ; %
              \path[->] %
              (m-1-1.north east) edge[labelu={#4},bend left=15] (m-1-3.north west) %
              (m-1-3.base west) edge[labeld={#5},bend left=15] (m-1-1.base east) %
              ; %
          \end{tikzpicture} %
}

\newcommand{\adj}[5][1]{\adjtemplate[#1]{#2}{#3}{#4}{#5}{\bot}}
\newcommand{\coadj}[5][1]{\adjtemplate[#1]{#2}{#3}{#4}{#5}{\top}}
\newcommand{\catequi}[5][1]{\adjtemplate[#1]{#2}{#3}{#4}{#5}{\simeq}}
\newcommand{\catiso}[5][1]{\adjtemplate[#1]{#2}{#3}{#4}{#5}{\cong}}

\newcommand{\adjunction}[4]{%
  \path[->] %
  (#1) edge[twou={#3},bend left=15] (#2) %
  (#2) edge[twod={#4},bend left=15] (#1) %
  ; %
  \path (u) -- node[pos=.5,sloped] {$\dashv$} (d) ; %
  }

\newcommand{\ladjunction}[4]{%
  \path[->] %
  (#1) edge[twou={#3},bend left=15] (#2) %
  (#2) edge[twod={#4},bend left=15] (#1) %
  ; %
  \path (u) -- node[pos=.5,sloped] {$\vdash$} (d) ; %
  }

\newcommand{\adjs}[8][1]{%
          \begin{tikzpicture} %
            \matrix (m) [diag={1}{#1},column sep={#1 cm,between borders}]{ %
              |[adj]| #2 %
              \& \bot %
              \& |[adj]| #3 
              \& \bot %
              \& |[adj]| #6 \\
              } ; %
              \path[->] %
              (m-1-1.north east) edge[labelu={#4},bend left=15] (m-1-3.north west) %
              (m-1-3.south west) edge[labeld={#5},bend left=15] (m-1-1.south east) %
              (m-1-3.north east) edge[labelu={#7},bend left=15] (m-1-5.north west) %
              (m-1-5.south west) edge[labeld={#8},bend left=15] (m-1-3.south east) %
              ; %
          \end{tikzpicture} %
}
\newcommand{\coadjs}[8][1]{%
          \begin{tikzpicture} %
            \matrix (m) [diag={1}{#1},column sep={#1 cm,between borders}]{ %
              |[adj]| #2 %
              \& \top %
              \& |[adj]| #3 
              \& \top %
              \& |[adj]| #6 \\
              } ; %
              \path[->] %
              (m-1-1.north east) edge[labelu={#4},bend left=15] (m-1-3.north west) %
              (m-1-3.south west) edge[labeld={#5},bend left=15] (m-1-1.south east) %
              (m-1-3.north east) edge[labelu={#7},bend left=15] (m-1-5.north west) %
              (m-1-5.south west) edge[labeld={#8},bend left=15] (m-1-3.south east) %
              ; %
          \end{tikzpicture} %
}

\newcommand{\retr}[5][1]{%
          \begin{tikzpicture} %
            \matrix (m) [diag={1}{#1},column sep={#1 cm,between borders}]{ %
              |[anchor=east,text height=.1cm,text depth=-.1cm]| #2 %
              \& |[anchor=center]| \triangleleft %
              \& |[anchor=west,text height=.1cm,text depth=-.1cm]| #3 \\
              } ; %
              \path[->] %
              (m-1-1.north east) edge[labelu={#4},bend left=15] (m-1-3.north west) %
              (m-1-3.south west) edge[labeld={#5},bend left=15] (m-1-1.south east) %
              ; %
          \end{tikzpicture} %
}

\newcommand{\doublecell}[9]{
    \diag{%
      |(X)| {#1} \& |(Y)| {#2} \\ %
      |(U)| {#3} \& |(V)| {#4} %
    }{%
      (X) edge[labelu={#5}] (Y) %
      edge[pro,twol={#6}] (U) %
      (Y) edge[pro,twor={#7}] (V) %
      (U) edge[labeld={#8}] (V) %
      (l) edge[cell=.4,labelu={\scriptstyle #9}] (r) %
    }
}

\newcommand{\doublecellpro}[9]{
    \diag{%
      |(X)| {#1} \& |(Y)| {#2} \\ %
      |(U)| {#3} \& |(V)| {#4} %
    }{%
      (X) edge[labelu={#5}] (Y) %
      edge[pro,twol={#6}] (U) %
      (Y) edge[pro,twor={#7}] (V) %
      (U) edge[labeld={#8}] (V) %
      (l) edge[cell=.4,labelu={\scriptstyle #9}] (r) %
    }
}

\newcommand{\vdoublecell}[9]{
    \diag{%
      |(X)| {#1} \& |(Y)| {#2} \\ %
      |(U)| {#3} \& |(V)| {#4} %
    }{%
      (X) edge[twou={#5}] (Y) %
      edge[labell={#6}] (U) %
      (Y) edge[labelr={#7}] (V) %
      (U) edge[twod={#8}] (V) %
      (u) edge[cell=.4,labelr={\scriptstyle #9}] (d) %
    }
}

\newcommand{\Vdots}{|[anchor=center,text height=.1cm]| \vdots}

\newcommand{\relate}[3]{\path (#1) -- node[anchor=mid] {$#2$} (#3) ;}
\newcommand{\justify}[4][0.5]{\path (#2) -- node[anchor=mid,pos=#1] {\tiny (#3)} (#4) ;}



\newcommand{\mkdots}[2]{    \path
    (#1) --
    node[pos=.4] {.}
    node[pos=.5] {.}
    node[pos=.6] {.}
    (#2)
    ;}

\newcommand{\mkdotsshrink}[2]{    \path
    (#1) --
    node[pos=.3] {.}
    node[pos=.5] {.}
    node[pos=.7] {.}
    (#2)
    ;}

\endinput
