You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
6.7 KiB
214 lines
6.7 KiB
% Copyright 2006 by Till Tantau
|
|
%
|
|
% This file may be distributed and/or modified
|
|
%
|
|
% 1. under the LaTeX Project Public License and/or
|
|
% 2. under the GNU Public License.
|
|
%
|
|
% See the file doc/generic/pgf/licenses/LICENSE for more details.
|
|
|
|
\ProvidesFileRCS{tikzlibrarychains.code.tex}
|
|
|
|
\usetikzlibrary{positioning}%
|
|
|
|
\tikzset{start chain/.default=,
|
|
start chain/.code={%
|
|
\tikz@lib@chain@parse{#1}%
|
|
\ifx\tikz@lib@chain@name\pgfutil@empty%
|
|
\def\tikz@lib@chain@name{chain}%
|
|
\fi%
|
|
\ifx\tikz@lib@chain@direction\relax%
|
|
\let\tikz@lib@chain@direction=\tikz@lib@chain@default@direction%
|
|
\fi%
|
|
\expandafter\ifx\csname tikz@lib@chain@active@\tikz@lib@chain@name\endcsname\relax%
|
|
\expandafter\let\csname tikz@lib@chain@active@\tikz@lib@chain@name\endcsname=\pgfutil@empty% does not matter
|
|
\expandafter\global\expandafter\let\csname tikz@lib@chain@exists@\tikz@lib@chain@name\endcsname=\pgfutil@empty% does not matter
|
|
% Setup chain parameters
|
|
\expandafter\gdef\csname tikz@lib@chain@count@\tikz@lib@chain@name\endcsname{0}%
|
|
\expandafter\global\expandafter\let\csname tikz@lib@chain@dir@\tikz@lib@chain@name\endcsname\tikz@lib@chain@direction%
|
|
\let\tikz@lib@current@chain=\tikz@lib@chain@name%
|
|
\let\chainin=\tikz@lib@chainin%
|
|
\else%
|
|
\tikzerror{Chain ``\tikz@lib@chain@name'' is already active}%
|
|
\fi%
|
|
},
|
|
continue chain/.default=,
|
|
continue chain/.code={%
|
|
\tikz@lib@chain@parse{#1}%
|
|
\ifx\tikz@lib@chain@name\pgfutil@empty%
|
|
\let\tikz@lib@chain@name\tikz@lib@current@chain%
|
|
\fi%
|
|
\expandafter\ifx\csname tikz@lib@chain@exists@\tikz@lib@chain@name\endcsname\relax%
|
|
\tikzerror{Unknown chain ``#1''}%
|
|
\else%
|
|
\let\tikz@lib@current@chain=\tikz@lib@chain@name%
|
|
\expandafter\let\csname tikz@lib@chain@active@\tikz@lib@chain@name\endcsname=\pgfutil@empty% does not matter
|
|
\ifx\tikz@lib@chain@direction\relax%
|
|
% Just restart...
|
|
\else%
|
|
% Setup chain parameters
|
|
\expandafter\global\expandafter\let\csname tikz@lib@chain@dir@\tikz@lib@chain@name\endcsname\tikz@lib@chain@direction%
|
|
\fi%
|
|
\fi%
|
|
},
|
|
join/.code=\tikz@lib@parse@join{#1},
|
|
join/.default={}%
|
|
}%
|
|
|
|
\def\tikz@lib@chain@parse#1{%
|
|
\pgfutil@in@{going }{#1}%
|
|
\ifpgfutil@in@%
|
|
\tikz@lib@chain@going#1\pgf@stop%
|
|
\else%
|
|
\pgfutil@in@{placed }{#1}%
|
|
\ifpgfutil@in@%
|
|
\tikz@lib@chain@positioning#1\pgf@stop%
|
|
\else%
|
|
\def\tikz@lib@chain@name{#1}%
|
|
\let\tikz@lib@chain@direction\relax%
|
|
\fi%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@lib@chain@going#1going #2\pgf@stop{%
|
|
\def\tikz@lib@chain@name{#1}%
|
|
\ifx\tikz@lib@chain@name\pgfutil@empty%
|
|
\else%
|
|
\tikz@lib@chain@strip#1\pgf@stop%%
|
|
\fi%
|
|
\tikz@lib@chain@is@goingtrue%
|
|
\def\tikz@lib@chain@direction{%
|
|
\ifx\tikzchainprevious\pgfutil@empty%
|
|
\else%
|
|
\tikz@lib@chain@place{#2}%
|
|
\fi%
|
|
}%
|
|
}%
|
|
|
|
\def\tikz@lib@chain@positioning#1placed #2\pgf@stop{%
|
|
\def\tikz@lib@chain@name{#1}%
|
|
\ifx\tikz@lib@chain@name\pgfutil@empty%
|
|
\else%
|
|
\tikz@lib@chain@strip#1\pgf@stop%%
|
|
\fi%
|
|
\tikz@lib@chain@is@goingfalse%
|
|
\def\tikz@lib@chain@direction{\tikz@lib@chain@place{#2}}%
|
|
}%
|
|
\newif\iftikz@lib@chain@is@going
|
|
|
|
|
|
\tikzset{/tikz/chain default direction/.code=%
|
|
{%
|
|
\tikz@lib@chain@parse{#1}%
|
|
\let\tikz@lib@chain@default@direction=\tikz@lib@chain@direction%
|
|
},%
|
|
/tikz/chain default direction=going right
|
|
}%
|
|
|
|
\def\tikz@lib@current@chain{chain}%
|
|
|
|
\pgfutil@g@addto@macro\tikz@node@reset@hook{\let\tikz@lib@chain@caller=\relax}%
|
|
\pgfutil@g@addto@macro\tikz@node@begin@hook{\tikz@lib@chain@caller}%
|
|
|
|
\tikzset{
|
|
on chain/.default=,
|
|
on chain/.code=\tikz@lib@on@chain{#1}%
|
|
}%
|
|
\def\tikz@lib@on@chain#1{%
|
|
\tikz@lib@chain@parse{#1}%
|
|
\ifx\tikz@lib@chain@name\pgfutil@empty%
|
|
\let\tikz@lib@chain@name\tikz@lib@current@chain%
|
|
\fi%
|
|
\expandafter\ifx\csname tikz@lib@chain@exists@\tikz@lib@chain@name\endcsname\relax%
|
|
\tikzerror{Unknown chain ``\tikz@lib@chain@name''}%
|
|
\else%
|
|
\c@pgf@counta\csname tikz@lib@chain@count@\tikz@lib@chain@name\endcsname\relax%
|
|
\ifnum\c@pgf@counta=0\relax%
|
|
\global\let\tikzchainprevious=\pgfutil@empty%
|
|
\else
|
|
\xdef\tikzchainprevious{\tikz@lib@chain@name-\the\c@pgf@counta}%
|
|
\fi%
|
|
\advance\c@pgf@counta by1\relax%
|
|
\xdef\tikzchaincount{\the\c@pgf@counta}%
|
|
\ifx\tikz@lib@chain@direction\relax%
|
|
\csname tikz@lib@chain@dir@\tikz@lib@chain@name\endcsname% use default
|
|
\else%
|
|
\tikz@lib@chain@direction%
|
|
\fi%
|
|
\edef\tikz@lib@chain@caller{\noexpand\tikz@lib@chain@last@found{\tikz@lib@chain@name}}%
|
|
\fi%
|
|
}%
|
|
\def\tikz@lib@chain@last@found#1{%
|
|
% Increase the count and set name, if necessary.
|
|
\c@pgf@counta\csname tikz@lib@chain@count@#1\endcsname\relax%
|
|
\advance\c@pgf@counta by1\relax%
|
|
\xdef\tikzchaincurrent{#1-\the\c@pgf@counta}%
|
|
\expandafter\xdef\csname tikz@lib@chain@count@#1\endcsname{\the\c@pgf@counta}%
|
|
\ifnum\c@pgf@counta=1\relax%
|
|
\tikzset{alias/.expanded=#1-begin} % Define pseudostart
|
|
\fi%
|
|
\tikzset{alias/.expanded=#1-end} % Define pseudostart
|
|
\tikzset{alias/.expanded=#1-\the\c@pgf@counta} % Define pseudostart
|
|
\tikz@lib@chain@direction%
|
|
\tikzset{every on chain/.try}%
|
|
}%
|
|
|
|
|
|
\def\tikz@lib@chain@place#1{%
|
|
\pgfutil@in@{=}{#1}%
|
|
\ifpgfutil@in@%
|
|
\tikzset{#1}%
|
|
\else%
|
|
\tikzset{#1=of \tikzchainprevious}%
|
|
\fi%
|
|
}%
|
|
|
|
\def\tikz@lib@chain@strip#1 \pgf@stop{%
|
|
\def\tikz@lib@chain@name{#1}%
|
|
}%
|
|
|
|
\def\tikz@lib@parse@join#1{%
|
|
\def\tikz@temp{#1}%
|
|
\ifx\tikz@temp\pgfutil@empty%
|
|
\tikz@lib@parse@join@by by \pgf@stop%
|
|
\else%
|
|
\pgfutil@in@{with }{#1}%
|
|
\ifpgfutil@in@%
|
|
\pgfutil@in@{by }{#1}%
|
|
\ifpgfutil@in@%
|
|
\tikz@lib@parse@join@with@by#1\pgf@stop%
|
|
\else%
|
|
\tikz@lib@parse@join@with@by#1 by \pgf@stop%
|
|
\fi%
|
|
\else%
|
|
\tikz@lib@parse@join@by#1\pgf@stop%
|
|
\fi%
|
|
\fi%
|
|
}%
|
|
\def\tikz@lib@parse@join@with@by with #1 by #2\pgf@stop{%
|
|
\tikzset{after node path={(#1)edge[every join,#2](\tikzchaincurrent)}}%
|
|
}%
|
|
\def\tikz@lib@parse@join@by by #1\pgf@stop{%
|
|
\tikzset{after node path={\ifx\tikzchainprevious\pgfutil@empty\else (\tikzchainprevious)edge[every join,#1](\tikzchaincurrent)\fi}}%
|
|
}%
|
|
\tikzset{every join/.style=}%
|
|
|
|
|
|
\def\tikz@lib@chainin#1(#2){\pgfutil@ifnextchar[{\tikz@lib@chainin@{#2}}{\tikz@lib@chainin@{#2}[]}}%]%
|
|
\def\tikz@lib@chainin@#1[#2]{\path[late options={name=#1,on chain,every chain in/.try,#2}]}%
|
|
|
|
|
|
%
|
|
% Branches
|
|
%
|
|
|
|
\tikzset{start branch/.code={%
|
|
% save last node on current chain:
|
|
\let\tikz@lib@save@current\tikz@lib@current@chain%
|
|
\pgfkeysalso{/tikz/start chain/.expand once=\tikz@lib@current@chain/#1}%
|
|
\path[late options={name=\tikz@lib@save@current-end,on chain}];%
|
|
}%
|
|
}%
|
|
\tikzset{continue branch/.style={continue chain/.expand once=\tikz@lib@current@chain/#1}}%
|
|
|
|
\endinput
|
|
|