%% %% This is file `tqft.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% tqft_code.dtx (with options: `package') %% ---------------------------------------------------------------- %% tqft --- a TikZ library for drawing TQFT diagrams %% E-mail: loopspace@mathforge.org %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% ---------------------------------------------------------------- %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tqft}[2017/06/01 v2.1 Tikz/PGF commands for drawing TQFT diagrams] \RequirePackage{pgfkeys} \RequirePackage{pgf} \def\pgf@tqft@minus{-} \let\pgf@tqft@upper\@empty \let\pgf@tqft@lower\pgf@tqft@minus \def\tqftset#1{\pgfkeys{/pgf/tqft/.cd,#1}} \def\tqft@process#1#2{% \edef\tqft@px{#1} \edef\tqft@py{#2} \pgf@process{ \pgftransformreset \let\tikz@transform=\pgfutil@empty \expandafter\tikzset\expandafter{\tqft@transformation} \tikz@transform \pgfpointtransformed{\pgfqpoint{\tqft@px}{\tqft@py}} } } \newdimen\tqft@xa \newdimen\tqft@xb \newdimen\tqft@c \newdimen\tqft@ch \newdimen\tqft@h \newdimen\tqft@s \newdimen\tqft@w \newif\iftqft@within@node \pgfkeys{ /tikz/tqft/use nodes/.is choice, /tikz/tqft/use nodes/true/.code={% \tikzset{ tqft/.style={% /tikz/shape=tqft cobordism, /pgf/tqft, /tikz/every tqft/.try }, tqft/.unknown/.code={% \let\tqft@searchname=\pgfkeyscurrentname% \pgfkeys{% /pgf/tqft/\tqft@searchname={##1} } }, }% }, /tikz/tqft/use nodes/false/.code={% \tikzset{ tqft/.style={% pic type=cobordism, tqft/.cd, every tqft/.try, }, tqft/.unknown/.code={% \let\tqft@searchname=\pgfkeyscurrentname% \pgfkeys{% /tikz/\tqft@searchname={##1} } }, }% }, /tikz/tqft/use nodes=true, /pgf/tqft/.unknown/.code={% \let\tqft@searchname=\pgfkeyscurrentname% \pgfkeysalso{% /tikz/\tqft@searchname={#1} } }, /pgf/tqft/.is family, /pgf/tqft, boundary circle/.style={ /tikz/shape=tqft boundary circle }, incoming boundary components/.initial=5, outgoing boundary components/.initial=4, offset/.initial=0, cobordism height/.initial=2cm, boundary separation/.initial=2cm, circle width/.initial=10pt, circle depth/.initial=5pt, outer xsep/.initial=0pt, outer ysep/.initial=0pt, outer sep/.style={ outer xsep=#1, outer ysep=#1 }, flow/.code={% \pgfkeys{/pgf/tqft/flow transformation/.expand twice/.expand once=\pgfkeysvalueof{/pgf/tqft/flow transformation #1}} }, flow transformation south/.initial={}, flow transformation north/.initial={% xscale=-1,rotate=180 }, flow transformation east/.initial={% rotate=90,xscale=-1 }, flow transformation west/.initial={% rotate=270 }, flow transformation/.initial={}, view from/.is choice, view from/incoming/.code={% \let\pgf@tqft@upper\pgf@tqft@minus \let\pgf@tqft@lower\@empty }, view from/outgoing/.code={% \let\pgf@tqft@lower\pgf@tqft@minus \let\pgf@tqft@upper\@empty }, boundary lower style contents/.initial={}, boundary lower style/.code={% \pgfkeys{/pgf/tqft/boundary lower style contents/.style={% /tikz/.cd,#1 } } }, boundary style contents/.initial={}, boundary style/.code={% \pgfkeys{/pgf/tqft/boundary style contents/.style={% /tikz/.cd,#1 } } }, boundary upper style contents/.initial={}, boundary upper style/.code={% \pgfkeys{/pgf/tqft/boundary upper style contents/.style={% /tikz/.cd,#1 } } }, cobordism style contents/.initial={}, cobordism style/.code={% \pgfkeys{/pgf/tqft/cobordism style contents/.style={% /tikz/.cd,#1% } } }, pair of pants/.style={ /tikz/tqft, incoming boundary components=1, outgoing boundary components=2, offset=-.5 }, /tikz/tqft pair of pants/.style={ /pgf/tqft/pair of pants, }, reverse pair of pants/.style={ /tikz/tqft, incoming boundary components=2, outgoing boundary components=1, offset=.5 }, /tikz/tqft reverse pair of pants/.style={ /pgf/tqft/reverse pair of pants, }, cylinder to prior/.style={ /tikz/tqft, incoming boundary components=1, outgoing boundary components=1, offset=-.5 }, /tikz/tqft cylinder to prior/.style={ /pgf/tqft/cylinder to prior, }, cylinder to next/.style={ /tikz/tqft, incoming boundary components=1, outgoing boundary components=1, offset=.5 }, /tikz/tqft cylinder to next/.style={ /pgf/tqft/cylinder to next, }, cylinder/.style={ /tikz/tqft, incoming boundary components=1, outgoing boundary components=1 }, /tikz/tqft cylinder/.style={ /pgf/tqft/cylinder, }, cup/.style={ /tikz/tqft, incoming boundary components=1, outgoing boundary components=0 }, /tikz/tqft cup/.style={ /pgf/tqft/cup, }, cap/.style={ /tikz/tqft, incoming boundary components=0, outgoing boundary components=1 }, /tikz/tqft cap/.style={ /pgf/tqft/cap, }, } \pgfdeclareshape{tqft cobordism}{ \savedmacro{\tqft@incoming}{\edef\tqft@incoming{\pgfkeysvalueof{/pgf/tqft/incoming boundary components}}} \savedmacro{\tqft@outgoing}{\edef\tqft@outgoing{\pgfkeysvalueof{/pgf/tqft/outgoing boundary components}}} \savedmacro{\tqft@offset}{\edef\tqft@offset{\pgfkeysvalueof{/pgf/tqft/offset}}} \saveddimen{\tqft@height}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/cobordism height}} \saveddimen{\tqft@separation}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/boundary separation}} \saveddimen{\tqft@width}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/circle width}} \saveddimen{\tqft@depth}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/circle depth}} \saveddimen{\tqft@outerxsep}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/outer xsep}} \saveddimen{\tqft@outerysep}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/outer ysep}} \saveddimen{\tqft@control}{ \pgfkeysgetvalue{/pgf/tqft/cobordism height}{\tqft@tempa} \pgfkeysgetvalue{/pgf/tqft/circle depth}{\tqft@tempb} \pgfmathsetlength{\pgf@x}{.5 * \tqft@tempa - 4 * \tqft@tempb} } \savedmacro{\tqft@transformation}{% \pgfkeysgetvalue{/pgf/tqft/flow transformation}{\tqft@transformation} } \savedanchor{\tqft@start@incoming}{% \pgfmathsetlength{\pgf@x}{-(max(\pgfkeysvalueof{/pgf/tqft/incoming boundary components} - 1,\pgfkeysvalueof{/pgf/tqft/outgoing boundary components} - 1 + \pgfkeysvalueof{/pgf/tqft/offset}) + min(0,\pgfkeysvalueof{/pgf/tqft/offset}) )*\pgfkeysvalueof{/pgf/tqft/boundary separation}/2} \pgfmathsetlength{\pgf@y}{.5 * \pgfkeysvalueof{/pgf/tqft/cobordism height}} } \savedanchor{\tqft@start@outgoing}{% \pgfmathsetlength{\pgf@x}{-(max(\pgfkeysvalueof{/pgf/tqft/incoming boundary components} - 1,\pgfkeysvalueof{/pgf/tqft/outgoing boundary components} - 1 + \pgfkeysvalueof{/pgf/tqft/offset}) + min(0,\pgfkeysvalueof{/pgf/tqft/offset})- 2*\pgfkeysvalueof{/pgf/tqft/offset})*\pgfkeysvalueof{/pgf/tqft/boundary separation}/2} \pgfmathsetlength{\pgf@y}{-.5 * \pgfkeysvalueof{/pgf/tqft/cobordism height}} } \savedanchor{\tqft@textsize}{% \pgf@y=-.5\ht\pgfnodeparttextbox% \pgf@x=-.5\wd\pgfnodeparttextbox% } \anchor{centre}{\pgfpointorigin} \anchor{center}{\pgfpointorigin} \anchor{text}{ \tqft@textsize } \anchor{north}{% \pgf@ya=\tqft@height\relax \pgf@yb=.5\pgf@ya \advance\pgf@yb by \tqft@outerysep\relax \tqft@process{0pt}{\the\pgf@yb} } \anchor{south}{% \pgf@yb=\tqft@height\relax \pgf@ya=.5\pgf@yb \advance\pgf@ya by \tqft@outerysep\relax \pgf@yb=-\pgf@ya \tqft@process{0pt}{\the\pgf@yb} } \anchor{west}{% \tqft@start@incoming \pgf@xa=\pgf@x \advance\pgf@xa by -\tqft@width \pgf@ya=\pgf@y \tqft@start@outgoing \pgf@xb=\pgf@x \advance\pgf@xb by -\tqft@width \pgf@yb=\pgf@y \pgf@xc=.5\pgf@xa \advance\pgf@xc by .5\pgf@xb \pgf@yc=.5\pgf@ya \advance\pgf@yc by .5\pgf@yb \advance\pgf@xc by -\tqft@outerxsep\relax \tqft@process{\the\pgf@xc}{\the\pgf@yc} } \anchor{east}{% \tqft@start@incoming \pgf@xa=\pgf@x \pgfmathsetlength{\pgf@xa}{\pgf@xa + (\tqft@incoming - 1) * \tqft@separation} \advance\pgf@xa by \tqft@width\relax \pgf@ya=\pgf@y \tqft@start@outgoing \pgf@xb=\pgf@x \pgfmathsetlength{\pgf@xb}{\pgf@xb + (\tqft@outgoing - 1) * \tqft@separation} \advance\pgf@xb by \tqft@width\relax \pgf@yb=\pgf@y \pgf@xc=.5\pgf@xa \advance\pgf@xc by .5\pgf@xb \pgf@yc=.5\pgf@ya \advance\pgf@yc by .5\pgf@yb \advance\pgf@xc by \tqft@outerxsep\relax \tqft@process{\the\pgf@xc}{\the\pgf@yc} } \anchor{north west}{ \tqft@start@incoming \pgf@xc=\pgf@x \pgf@yc=\pgf@y \advance\pgf@xc by -\tqft@width\relax \advance\pgf@yc by \tqft@outerysep\relax \advance\pgf@xc by -\tqft@outerxsep\relax \tqft@process{\the\pgf@xc}{\the\pgf@yc} } \anchor{south west}{ \tqft@start@outgoing \pgf@xc=\pgf@x \pgf@yc=\pgf@y \advance\pgf@xc by -\tqft@width\relax \advance\pgf@yc by -\tqft@outerysep\relax \advance\pgf@xc by -\tqft@outerxsep\relax \tqft@process{\the\pgf@xc}{\the\pgf@yc} } \anchor{north east}{ \tqft@start@incoming \pgf@xc=\pgf@x \pgfmathsetlength{\pgf@xc}{\pgf@xc + (\tqft@incoming - 1)*\tqft@separation} \pgf@yc=\pgf@y \advance\pgf@xc by \tqft@width\relax \advance\pgf@yc by \tqft@outerysep\relax \advance\pgf@xc by \tqft@outerxsep\relax \tqft@process{\the\pgf@xc}{\the\pgf@yc} } \anchor{south east}{ \tqft@start@outgoing \pgf@xc=\pgf@x \pgfmathsetlength{\pgf@xc}{\pgf@xc + (\tqft@outgoing - 1)*\tqft@separation} \pgf@yc=\pgf@y \advance\pgf@xc by \tqft@width\relax \advance\pgf@yc by -\tqft@outerysep\relax \advance\pgf@xc by \tqft@outerxsep\relax \tqft@process{\the\pgf@xc}{\the\pgf@yc} } \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@tqft cobordism\endcsname{% \c@pgf@counta\tqft@incoming\relax% \pgfmathloop% \ifnum\c@pgf@counta>0\relax% \pgfutil@ifundefined{pgf@anchor@tqft cobordism@incoming boundary\space\the\c@pgf@counta}{% \expandafter\xdef\csname pgf@anchor@tqft cobordism@incoming boundary\space\the\c@pgf@counta\endcsname{% \noexpand\tqft@start@incoming \noexpand\pgfmathsetlength{\noexpand\pgf@y}{\noexpand\pgf@y + \noexpand\tqft@outerysep} \noexpand\pgfmathsetlength{\noexpand\pgf@x}{\noexpand\pgf@x + (\the\c@pgf@counta - 1) * \noexpand\tqft@separation} \noexpand\tqft@process{\noexpand\the\noexpand\pgf@x}{\noexpand\the\noexpand\pgf@y} } }{\c@pgf@counta0\relax}% \advance\c@pgf@counta-1\relax% \repeatpgfmathloop% } \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@tqft cobordism\endcsname{% \c@pgf@counta\tqft@outgoing\relax% \pgfmathloop% \ifnum\c@pgf@counta>0\relax% \pgfutil@ifundefined{pgf@anchor@tqft cobordism@outgoing boundary\space\the\c@pgf@counta}{% \expandafter\xdef\csname pgf@anchor@tqft cobordism@outgoing boundary\space\the\c@pgf@counta\endcsname{% \noexpand\tqft@start@outgoing \noexpand\pgfmathsetlength{\noexpand\pgf@y}{\noexpand\pgf@y - \noexpand\tqft@outerysep} \noexpand\pgfmathsetlength{\noexpand\pgf@x}{\noexpand\pgf@x + (\the\c@pgf@counta - 1) * \noexpand\tqft@separation} \noexpand\tqft@process{\noexpand\the\noexpand\pgf@x}{\noexpand\the\noexpand\pgf@y} } }{\c@pgf@counta0\relax}% \advance\c@pgf@counta-1\relax% \repeatpgfmathloop% } \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@tqft cobordism\endcsname{% \c@pgf@counta\tqft@incoming\relax% \advance\c@pgf@counta-1\relax \pgfmathloop% \ifnum\c@pgf@counta>0\relax% \pgfutil@ifundefined{pgf@anchor@tqft cobordism@after incoming boundary\space\the\c@pgf@counta}{% \expandafter\xdef\csname pgf@anchor@tqft cobordism@after incoming boundary\space\the\c@pgf@counta\endcsname{% \noexpand\tqft@start@incoming \noexpand\pgfmathsetlength{\noexpand\pgf@y}{.25 * \noexpand\pgf@y +.75 * \noexpand\tqft@control + \noexpand\tqft@outerysep} \noexpand\pgfmathsetlength{\noexpand\pgf@x}{\noexpand\pgf@x + (\the\c@pgf@counta - .5) * \noexpand\tqft@separation} \noexpand\tqft@process{\noexpand\the\noexpand\pgf@x}{\noexpand\the\noexpand\pgf@y} } }{\c@pgf@counta0\relax}% \advance\c@pgf@counta-1\relax% \repeatpgfmathloop% } \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@tqft cobordism\endcsname{% \c@pgf@counta\tqft@outgoing\relax% \advance\c@pgf@counta-1\relax \pgfmathloop% \ifnum\c@pgf@counta>0\relax% \pgfutil@ifundefined{pgf@anchor@tqft cobordism@after outgoing boundary\space\the\c@pgf@counta}{% \expandafter\xdef\csname pgf@anchor@tqft cobordism@after outgoing boundary\space\the\c@pgf@counta\endcsname{% \noexpand\tqft@start@outgoing \noexpand\pgfmathsetlength{\noexpand\pgf@y}{.25 * \noexpand\pgf@y -.75 * \noexpand\tqft@control - \noexpand\tqft@outerysep} \noexpand\pgfmathsetlength{\noexpand\pgf@x}{\noexpand\pgf@x + (\the\c@pgf@counta - .5) * \noexpand\tqft@separation} \noexpand\tqft@process{\noexpand\the\noexpand\pgf@x}{\noexpand\the\noexpand\pgf@y} } }{\c@pgf@counta0\relax}% \advance\c@pgf@counta-1\relax% \repeatpgfmathloop% } \backgroundpath{ \let\tikz@transform=\pgfutil@empty \expandafter\tikzset\expandafter{\tqft@transformation} \tikz@transform \pgfmathsetlength{\tqft@s}{\tqft@separation} \pgfmathsetlength{\tqft@w}{2*\tqft@width} \tqft@start@incoming \tqft@xa=\pgf@x \advance\tqft@xa by -.5\tqft@w\relax \tqft@h=\pgf@y \tqft@xb=\tqft@xa \advance\tqft@xb by \tqft@w\relax \tqft@c=\tqft@control\relax \ifnum\tqft@incoming>0 \pgfpathmoveto{\pgfqpoint{\tqft@xa}{\tqft@h}} \pgfpatharc{\pgf@tqft@upper180}{0}{\tqft@width and \tqft@depth} \ifnum\tqft@incoming>1 \foreach \tqft@k in {2,...,\tqft@incoming} { \advance\tqft@xa by \tqft@k\tqft@s \advance\tqft@xb by \tqft@k\tqft@s \advance\tqft@xb by -2\tqft@s \advance\tqft@xa by -\tqft@s \pgfpathcurveto{\pgfqpoint{\tqft@xb}{\tqft@c}}{\pgfqpoint{\tqft@xa}{\tqft@c}}{\pgfqpoint{\tqft@xa}{\tqft@h}} \pgfpatharc{\pgf@tqft@upper180}{0}{\tqft@width and \tqft@depth} } \fi \ifnum\tqft@outgoing=0 \advance\tqft@xb by \tqft@incoming\tqft@s \advance\tqft@xb by -\tqft@s \pgfmathsetlength{\tqft@ch}{min(0,max(-\tqft@h,\tqft@h - (\tqft@h - \tqft@c) * ((abs(\tqft@xb - \tqft@xa) - \tqft@w)/\tqft@s + 1)))} \pgfpathcurveto{\pgfqpoint{\tqft@xb}{\tqft@ch}}{\pgfqpoint{\tqft@xa}{\tqft@ch}}{\pgfqpoint{\tqft@xa}{\tqft@h}} \fi \fi \ifnum\tqft@outgoing>0 \advance\tqft@xb by \tqft@incoming\tqft@s \advance\tqft@xb by -\tqft@s \pgfmathsetlength{\tqft@xa}{\tqft@xa + (\tqft@outgoing - 1 + \tqft@offset) * \tqft@separation + 2*\tqft@width} \ifnum\tqft@incoming>0 \pgfmathsetlength{\tqft@ch}{min(0,max(-\tqft@h,\tqft@h - (\tqft@h - \tqft@c) * ((abs(\tqft@xb - \tqft@xa) - \tqft@w)/\tqft@s + 1)))} \pgfpathcurveto{\pgfqpoint{\tqft@xb}{\tqft@ch}}{\pgfqpoint{\tqft@xa}{-\tqft@ch}}{\pgfqpoint{\tqft@xa}{-\tqft@h}} \else \pgfpathmoveto{\pgfqpoint{\tqft@xa}{-\tqft@h}} \fi \tqft@xb=\tqft@xa \advance\tqft@xb by -\tqft@w \pgfpatharc{0}{\pgf@tqft@upper180}{\tqft@width and \tqft@depth} \ifnum\tqft@outgoing>1 \foreach \tqft@k in {2,...,\tqft@outgoing} { \advance\tqft@xa by -\tqft@k\tqft@s \advance\tqft@xb by -\tqft@k\tqft@s \advance\tqft@xb by 2\tqft@s \advance\tqft@xa by \tqft@s \pgfpathcurveto{\pgfqpoint{\tqft@xb}{-\tqft@c}}{\pgfqpoint{\tqft@xa}{-\tqft@c}}{\pgfqpoint{\tqft@xa}{-\tqft@h}} \pgfpatharc{0}{\pgf@tqft@upper180}{\tqft@width and \tqft@depth} } \fi \advance\tqft@xb by -\tqft@outgoing\tqft@s \advance\tqft@xb by \tqft@s \ifnum\tqft@incoming>0 \pgfmathsetlength{\tqft@xa}{\tqft@xa - (\tqft@outgoing -1 + \tqft@offset) * \tqft@separation - 2*\tqft@width} \pgfmathsetlength{\tqft@ch}{min(0,max(-\tqft@h,\tqft@h - (\tqft@h - \tqft@c) * ((abs(\tqft@xb - \tqft@xa) - \tqft@w)/\tqft@s + 1)))} \pgfpathcurveto{\pgfqpoint{\tqft@xb}{-\tqft@ch}}{\pgfqpoint{\tqft@xa}{\tqft@ch}}{\pgfqpoint{\tqft@xa}{\tqft@h}} \else \pgfmathsetlength{\tqft@ch}{min(0,max(-\tqft@h,\tqft@h - (\tqft@h - \tqft@c) * ((abs(\tqft@xb - \tqft@xa) - \tqft@w)/\tqft@s + 1)))} \pgfpathcurveto{\pgfqpoint{\tqft@xb}{-\tqft@ch}}{\pgfqpoint{\tqft@xa}{-\tqft@ch}}{\pgfqpoint{\tqft@xa}{-\tqft@h}} \fi \fi \pgfpathclose } \behindbackgroundpath{ \let\tikz@transform=\pgfutil@empty \expandafter\tikzset\expandafter{\tqft@transformation} \tikz@transform \pgfmathsetlength{\tqft@s}{\tqft@separation} \pgfmathsetlength{\tqft@w}{2*\tqft@width} \pgfmathsetlength{\tqft@xa}{-(max(\tqft@incoming - 1,\tqft@outgoing - 1 + \tqft@offset) + min(0,\tqft@offset) + 2)*\tqft@separation/2} \pgfmathsetlength{\tqft@h}{.5 * \tqft@height} { \tikz@mode@fillfalse% \tikz@mode@drawfalse% \let\tikz@mode=\pgfutil@empty \let\tikz@options=\pgfutil@empty \tqftset{boundary style contents} \tikz@mode \tikz@options \ifnum\tqft@incoming>0 \foreach \tqft@k in {1,...,\tqft@incoming} { \advance\tqft@xa by \tqft@k\tqft@s \pgfpathellipse{\pgfqpoint{\tqft@xa}{\tqft@h}}{\pgfqpoint{\tqft@width}{0pt}}{\pgfqpoint{0pt}{\tqft@depth}} } \fi \ifnum\tqft@outgoing>0 \pgfmathsetlength{\tqft@xa}{\tqft@xa + (\tqft@outgoing + \tqft@offset + 1) * \tqft@separation} \foreach \tqft@k in {1,...,\tqft@outgoing} { \advance\tqft@xa by -\tqft@k\tqft@s \pgfpathellipse{\pgfqpoint{\tqft@xa}{-\tqft@h}}{\pgfqpoint{\tqft@width}{0pt}}{\pgfqpoint{0pt}{\tqft@depth}} } \fi \edef\tikz@temp{\noexpand\pgfusepath{% \iftikz@mode@fill fill,\fi% \iftikz@mode@draw draw\fi% }}% \tikz@temp } { \tikz@mode@fillfalse% \tikz@mode@drawfalse% \let\tikz@mode=\pgfutil@empty \let\tikz@options=\pgfutil@empty \tqftset{boundary lower style contents} \tikz@mode \tikz@options \advance\tqft@xa by .5\tqft@w \ifnum\tqft@incoming>0 \foreach \tqft@k in {1,...,\tqft@incoming} { \advance\tqft@xa by \tqft@k\tqft@s \pgfpathmoveto{\pgfqpoint{\tqft@xa}{\tqft@h}} \pgfpatharc{0}{\pgf@tqft@lower180}{\tqft@width and \tqft@depth} } \fi \ifnum\tqft@outgoing>0 \pgfmathsetlength{\tqft@xa}{\tqft@xa + (\tqft@outgoing + \tqft@offset + 1) * \tqft@separation} \foreach \tqft@k in {1,...,\tqft@outgoing} { \advance\tqft@xa by -\tqft@k\tqft@s \pgfpathmoveto{\pgfqpoint{\tqft@xa}{-\tqft@h}} \pgfpatharc{0}{\pgf@tqft@lower180}{\tqft@width and \tqft@depth} } \fi \edef\tikz@temp{\noexpand\pgfusepath{% \iftikz@mode@fill fill,\fi% \iftikz@mode@draw draw\fi% }}% \tikz@temp } } \beforebackgroundpath{ \pgfmathsetlength{\tqft@s}{\tqft@separation} \pgfmathsetlength{\tqft@w}{2*\tqft@width} \pgfmathsetlength{\tqft@xa}{-(max(\tqft@incoming - 1,\tqft@outgoing - 1 + \tqft@offset) + min(0,\tqft@offset))*\tqft@s/2 - \tqft@width} \tqft@xb=\tqft@xa \advance\tqft@xb by \tqft@w \tqft@c=\tqft@control\relax \pgfmathsetlength{\tqft@h}{.5 * \tqft@height} { \tikz@mode@fillfalse% \tikz@mode@drawfalse% \let\tikz@mode=\pgfutil@empty \let\tikz@options=\pgfutil@empty \tqftset{cobordism style contents} \tikz@mode \tikz@options \ifnum\tqft@incoming>0 \ifnum\tqft@incoming>1 \foreach \tqft@k in {2,...,\tqft@incoming} { \advance\tqft@xa by \tqft@k\tqft@s \advance\tqft@xb by \tqft@k\tqft@s \advance\tqft@xb by -2\tqft@s \advance\tqft@xa by -\tqft@s \pgfpathmoveto{\pgfqpoint{\tqft@xb}{\tqft@h}} \pgfpathcurveto{\pgfqpoint{\tqft@xb}{\tqft@c}}{\pgfqpoint{\tqft@xa}{\tqft@c}}{\pgfqpoint{\tqft@xa}{\tqft@h}} } \fi \ifnum\tqft@outgoing=0 \advance\tqft@xb by \tqft@incoming\tqft@s \advance\tqft@xb by -\tqft@s \pgfmathsetlength{\tqft@ch}{min(0,max(-\tqft@h,\tqft@h - (\tqft@h - \tqft@c) * ((abs(\tqft@xb - \tqft@xa) - \tqft@w)/\tqft@s + 1)))} \pgfpathmoveto{\pgfqpoint{\tqft@xb}{\tqft@h}} \pgfpathcurveto{\pgfqpoint{\tqft@xb}{\tqft@ch}}{\pgfqpoint{\tqft@xa}{\tqft@ch}}{\pgfqpoint{\tqft@xa}{\tqft@h}} \fi \fi \ifnum\tqft@outgoing>0 \advance\tqft@xb by \tqft@incoming\tqft@s \advance\tqft@xb by -\tqft@s \pgfmathsetlength{\tqft@xa}{\tqft@xa + (\tqft@outgoing - 1 + \tqft@offset) * \tqft@separation + 2*\tqft@width} \ifnum\tqft@incoming>0 \pgfmathsetlength{\tqft@ch}{min(0,max(-\tqft@h,\tqft@h - (\tqft@h - \tqft@c) * ((abs(\tqft@xb - \tqft@xa) - \tqft@w)/\tqft@s + 1)))} \pgfpathmoveto{\pgfqpoint{\tqft@xb}{\tqft@h}} \pgfpathcurveto{\pgfqpoint{\tqft@xb}{\tqft@ch}}{\pgfqpoint{\tqft@xa}{-\tqft@ch}}{\pgfqpoint{\tqft@xa}{-\tqft@h}} \else \pgfpathmoveto{\pgfqpoint{\tqft@xa}{-\tqft@h}} \fi \tqft@xb=\tqft@xa \advance\tqft@xb by -\tqft@w \pgfpathmoveto{\pgfqpoint{\tqft@xb}{-\tqft@h}} \ifnum\tqft@outgoing>1 \foreach \tqft@k in {2,...,\tqft@outgoing} { \advance\tqft@xa by -\tqft@k\tqft@s \advance\tqft@xb by -\tqft@k\tqft@s \advance\tqft@xb by 2\tqft@s \advance\tqft@xa by \tqft@s \pgfpathcurveto{\pgfqpoint{\tqft@xb}{-\tqft@c}}{\pgfqpoint{\tqft@xa}{-\tqft@c}}{\pgfqpoint{\tqft@xa}{-\tqft@h}} \advance\tqft@xa by -\tqft@w \pgfpathmoveto{\pgfqpoint{\tqft@xa}{-\tqft@h}} } \fi \advance\tqft@xb by -\tqft@outgoing\tqft@s \advance\tqft@xb by \tqft@s \ifnum\tqft@incoming>0 \pgfmathsetlength{\tqft@xa}{\tqft@xa - (\tqft@outgoing -1 + \tqft@offset) * \tqft@separation - 2*\tqft@width} \pgfmathsetlength{\tqft@ch}{min(0,max(-\tqft@h,\tqft@h - (\tqft@h - \tqft@c) * ((abs(\tqft@xb - \tqft@xa) - \tqft@w)/\tqft@s + 1)))} \pgfpathcurveto{\pgfqpoint{\tqft@xb}{-\tqft@ch}}{\pgfqpoint{\tqft@xa}{\tqft@ch}}{\pgfqpoint{\tqft@xa}{\tqft@h}} \else \pgfmathsetlength{\tqft@ch}{min(0,max(-\tqft@h,\tqft@h - (\tqft@h - \tqft@c) * ((abs(\tqft@xb - \tqft@xa) - \tqft@w)/\tqft@s + 1)))} \pgfpathcurveto{\pgfqpoint{\tqft@xb}{-\tqft@ch}}{\pgfqpoint{\tqft@xa}{-\tqft@ch}}{\pgfqpoint{\tqft@xa}{-\tqft@h}} \fi \fi \edef\tikz@temp{\noexpand\pgfusepath{% \iftikz@mode@fill fill,\fi% \iftikz@mode@draw draw\fi% }}% \tikz@temp } { \let\tqft@bdry@path=\pgfutil@empty \let\tqft@bdry@node@path=\pgfutil@empty \pgfsyssoftpath@setcurrentpath{\tqft@bdry@path} \tikz@mode@fillfalse% \tikz@mode@drawfalse% \let\tikz@mode=\pgfutil@empty \let\tikz@options=\pgfutil@empty \tqftset{boundary upper style contents} \tikz@mode \tikz@options \advance\tqft@xa by -\tqft@s \advance\tqft@xa by \tqft@w \ifnum\tqft@incoming>0 \foreach \tqft@k in {1,...,\tqft@incoming} { \advance\tqft@xa by \tqft@k\tqft@s \pgfpathmoveto{\pgfqpoint{\tqft@xa}{\tqft@h}} \pgfpatharc{0}{\pgf@tqft@upper180}{\tqft@width and \tqft@depth} \ifx\tikz@fig@name\pgfutil@empty \else { \advance\tqft@xa by -\tqft@width \pgftransformshift{\pgfqpoint{\tqft@xa}{\tqft@h}} \tqft@within@nodetrue \pgfsyssoftpath@getcurrentpath{\tqft@bdry@path} \pgfsyssoftpath@setcurrentpath{\tqft@bdry@node@path} \pgfnode{tqft boundary circle}{centre}{}{\tikz@fig@name\space incoming \tqft@k}{} \pgfsyssoftpath@getcurrentpath{\tqft@bdry@node@path} \pgfsyssoftpath@setcurrentpath{\tqft@bdry@path} } \fi } \fi \ifnum\tqft@outgoing>0 \pgfmathsetlength{\tqft@xa}{\tqft@xa + (\tqft@outgoing + \tqft@offset + 1) * \tqft@separation} \foreach \tqft@k in {1,...,\tqft@outgoing} { \advance\tqft@xa by -\tqft@k\tqft@s \pgfpathmoveto{\pgfqpoint{\tqft@xa}{-\tqft@h}} \pgfpatharc{0}{\pgf@tqft@upper180}{\tqft@width and \tqft@depth} \ifx\tikz@fig@name\pgfutil@empty \else { \pgfmathtruncatemacro{\tqft@l}{\tqft@outgoing + 1 - \tqft@k} \advance\tqft@xa by -\tqft@width \pgftransformshift{\pgfqpoint{\tqft@xa}{-\tqft@h}} \tqft@within@nodetrue \pgfsyssoftpath@getcurrentpath{\tqft@bdry@path} \pgfsyssoftpath@setcurrentpath{\tqft@bdry@node@path} \pgfnode{tqft boundary circle}{centre}{}{\tikz@fig@name\space outgoing \tqft@l}{} \pgfsyssoftpath@getcurrentpath{\tqft@bdry@node@path} \pgfsyssoftpath@setcurrentpath{\tqft@bdry@path} } \fi } \fi \edef\tikz@temp{\noexpand\pgfusepath{% \iftikz@mode@fill fill,\fi% \iftikz@mode@draw draw\fi% }}% \tikz@temp } } } \pgfdeclareshape{tqft boundary circle}{ \saveddimen{\tqft@height}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/cobordism height}} \saveddimen{\tqft@separation}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/boundary separation}} \saveddimen{\tqft@width}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/circle width}} \saveddimen{\tqft@depth}{\pgf@x=\pgfkeysvalueof{/pgf/tqft/circle depth}} \savedmacro{\tqft@transformation}{% \iftqft@within@node \let\tqft@transformation=\pgfutil@empty \else \pgfkeysgetvalue{/pgf/tqft/flow transformation}{\tqft@transformation} \fi } \savedanchor{\tqft@centre}{% \pgfpointorigin} \savedanchor{\tqft@textsize}{% \pgf@y=-.5\ht\pgfnodeparttextbox% \pgf@x=-.5\wd\pgfnodeparttextbox% } \anchor{centre}{\tqft@centre} \anchor{center}{\tqft@centre} \anchor{text}{ \tqft@textsize } \anchor{next}{% \tqft@process{\tqft@separation}{0pt}}% \anchor{prior}{% \tqft@process{-\tqft@separation}{0pt}}% \anchor{above}{% \tqft@process{0pt}{\tqft@height}}% \anchor{below}{% \tqft@process{0pt}{-\tqft@height}}% \anchorborder{ \tqft@process{\the\pgf@x}{\the\pgf@y} \edef\tqft@marshal{% \noexpand\pgfpointborderellipse {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}} {\noexpand\pgfqpoint{\tqft@width}{\tqft@depth}} }% \tqft@marshal \tqft@process{\the\pgf@x}{\the\pgf@y} } \backgroundpath{ \let\tikz@transform=\pgfutil@empty \expandafter\tikzset\expandafter{\tqft@transformation} \tikz@transform \pgfpathellipse{\pgfqpoint{0pt}{0pt}}{\pgfqpoint{\tqft@width}{0pt}}{\pgfqpoint{0pt}{\tqft@depth}} } \beforebackgroundpath{ \iftqft@within@node \else \tikz@mode@fillfalse% \tikz@mode@drawfalse% \let\tikz@mode=\pgfutil@empty \let\tikz@options=\pgfutil@empty { \pgfsys@beginscope \tqftset{boundary lower style contents} \tikz@mode \tikz@options \pgfpathmoveto{\pgfqpoint{\tqft@width}{0pt}} \pgfpatharc{0}{\pgf@tqft@lower180}{\tqft@width and \tqft@depth} \edef\tikz@temp{\noexpand\pgfusepath{% \iftikz@mode@fill fill,\fi% \iftikz@mode@draw draw\fi% }}% \tikz@temp \pgfsys@endscope } { \pgfsys@beginscope \tqftset{boundary upper style contents} \tikz@mode \tikz@options \pgfpathmoveto{\pgfqpoint{\tqft@width}{0pt}} \pgfpatharc{0}{\pgf@tqft@upper180}{\tqft@width and \tqft@depth} \edef\tikz@temp{\noexpand\pgfusepath{% \iftikz@mode@fill fill,\fi% \iftikz@mode@draw draw\fi% }}% \tikz@temp \pgfsys@endscope } \fi } } %% %% Copyright (C) 2011-2024 by Andrew Stacey %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either %% version 1.3c of this license or (at your option) any later %% version. The latest version of this license is in the file: %% %% http://www.latex-project.org/lppl.txt %% %% This work is "maintained" (as per LPPL maintenance status) by %% Andrew Stacey. %% %% This work consists of the files tqft_code.dtx, %% tqft.tex, %% and the derived files tqft_code.ins, %% tqft_code.pdf, %% tqft.pdf, %% tqft.sty, and %% tikzlibrarytqft.code.tex. %% %% %% End of file `tqft.sty'.