%% %% This is file `tikzlibrarytqft.code.tex', %% generated with the docstrip utility. %% %% The original source files were: %% %% tqft_code.dtx (with options: `library') %% ---------------------------------------------------------------- %% 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 %% ---------------------------------------------------------------- %% \ProvidesFile{tikzlibrarytqft.code.tex}[2024/05/31 v2.3 Tikz/PGF commands for drawing TQFT diagrams] \ifcsname pgfk@/handlers/.pic/.@cmd\endcsname \else \pgfwarning{This library only works with TikZ 3.0 or later; for earlier versions of TikZ use the TQFT package} \fi \usetikzlibrary{shapes.geometric} \def\pgf@tqft@minus{-} \let\pgf@tqft@upper\@empty \let\pgf@tqft@lower\pgf@tqft@minus \newif\iftqft@twisted \def\tqft@split(#1,#2){% \pgfmathsetmacro\tqft@y{#2 * (-\tqft@val{cobordism height})}% \pgfmathsetmacro\tqft@x{(#1 - 1 + max(min(#2,1),0)*\tqft@val{offset}) * \tqft@val{boundary separation}}% \def\tqft@shift{(\tqft@x pt, \tqft@y pt)}% }% \tikzset{ pic alias/.code={% \tikz@fig@mustbenamed \expandafter\def\expandafter\tikz@alias\expandafter{\tikz@alias\pgfnodealias{\tikz@pp@name{#1}}{\tikz@fig@name}}% }, tqft/.style={% pic type=cobordism, every tqft/.try, tqft/.cd, }, tqft/.unknown/.code={% \let\tqft@searchname=\pgfkeyscurrentname% \pgfkeysalso{% /tikz/\tqft@searchname={#1} } }, tqft/.cd, incoming boundary components/.initial=5, outgoing boundary components/.initial=4, skip incoming boundary components/.initial={}, skip outgoing boundary components/.initial={}, genus/.initial = 0, offset/.initial=0, cobordism height/.initial=2cm, boundary separation/.initial=2cm, circle x radius/.initial=10pt, circle y radius/.initial=5pt, 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 }, twisted/.is if=tqft@twisted, anchor/.initial = none, pair of pants/.style={ /tikz/tqft, incoming boundary components=1, outgoing boundary components=2, offset=-.5 }, /tikz/tqft pair of pants/.style={ /tikz/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={ /tikz/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={ /tikz/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={ /tikz/tqft/cylinder to next, }, cylinder/.style={ /tikz/tqft, incoming boundary components=1, outgoing boundary components=1 }, /tikz/tqft cylinder/.style={ /tikz/tqft/cylinder, }, cup/.style={ /tikz/tqft, incoming boundary components=1, outgoing boundary components=0 }, /tikz/tqft cup/.style={ /tikz/tqft/cup, }, cap/.style={ /tikz/tqft, incoming boundary components=0, outgoing boundary components=1 }, /tikz/tqft cap/.style={ /tikz/tqft/cap, }, } \def\tqft@val#1{\pgfkeysvalueof{/tikz/tqft/#1}} \tikzset{ cobordism/.pic={ \gdef\tqft@fullpath{}% \global\let\tqft@blist\pgfutil@gobble% \gdef\tqft@gclip{}% \global\let\tqft@glist\pgfutil@gobble% \global\let\tqft@clist\pgfutil@gobble% \global\let\tqft@alist\pgfutil@gobble \global\let\tqft@ibdrylist=\pgfutil@gobble \global\let\tqft@cibdrylist=\pgfutil@gobble \global\let\tqft@obdrylist=\pgfutil@gobble \global\let\tqft@cobdrylist=\pgfutil@gobble \global\let\tqft@robdrylist=\pgfutil@gobble \global\let\tqft@rcobdrylist=\pgfutil@gobble \iftqft@twisted \pgfmathsetmacro\tqft@outgoing@end{0}% \pgfmathsetmacro\tqft@outgoing@dir{-1}% \else \pgfmathsetmacro\tqft@outgoing@end{1}% \pgfmathsetmacro\tqft@outgoing@dir{1}% \fi \ifnum\tqft@val{incoming boundary components}>0\relax \xdef\tqft@fullpath{% \tqft@fullpath (-\tqft@val{circle x radius},0) arc[start angle=\pgf@tqft@upper180, end angle=0, x radius=\tqft@val{circle x radius}, y radius=\tqft@val{circle y radius}] }% \xdef\tqft@alist{% \tqft@alist,-incoming boundary 1/{(0,0)},-incoming boundary/{(0,0)}% }% \ifnum\tqft@val{incoming boundary components}>1\relax \foreach \k in {2,...,\tqft@val{incoming boundary components}} { \edef\tqft@temp{\noexpand\pgfutil@in@{,\k,}{,\tqft@val{skip incoming boundary components},}} \tqft@temp \ifpgfutil@in@ \xdef\tqft@cibdrylist{\tqft@cibdrylist,\k} \else \xdef\tqft@ibdrylist{\tqft@ibdrylist,\k} \fi } \ifx\tqft@ibdrylist\pgfutil@gobble \else \foreach \k [ remember=\k as \kmo (initially 1), evaluate=\k as \xpos using (\k-1)*\tqft@val{boundary separation} -\tqft@val{circle x radius}, ] in \tqft@ibdrylist { \pgfmathsetmacro\xppos{(\kmo - 1)*\tqft@val{boundary separation} + \tqft@val{circle x radius}} \pgfmathsetmacro\cpos{(\xpos + \xppos)/2} \xdef\tqft@fullpath{% \tqft@fullpath .. controls +(0,-\tqft@val{cobordism height}/3) and +(0,-\tqft@val{cobordism height}/3) .. (\xpos pt,0) arc[start angle=\pgf@tqft@upper180, end angle=0, x radius=\tqft@val{circle x radius}, y radius=\tqft@val{circle y radius}] }% \xdef\tqft@blist{% \tqft@blist,incoming boundary \k/incoming/{% (\xppos pt,0) .. controls +(0,-\tqft@val{cobordism height}/3) and +(0,-\tqft@val{cobordism height}/3) .. (\xpos pt,0)}% }% \xdef\tqft@clist{% \tqft@clist,-between incoming \kmo\space and \k/{(\cpos pt,-\tqft@val{cobordism height}/4)}% }% \xdef\tqft@alist{% \tqft@alist,-incoming boundary \k/{(\kmo * \tqft@val{boundary separation},0)}% }% }% \fi \fi \ifnum\tqft@val{outgoing boundary components}>0\relax \pgfmathsetmacro\xppos{% (\tqft@outgoing@end * (\tqft@val{outgoing boundary components} -1) + \tqft@val{offset}) * \tqft@val{boundary separation} + \tqft@outgoing@dir * \tqft@val{circle x radius}}% \pgfmathsetmacro\tqft@ht{abs(\tqft@val{incoming boundary components} - \tqft@val{outgoing boundary components} - \tqft@val{offset})}% \pgfmathsetmacro\tqft@ht{1/3 + 2/3*\tqft@ht/(\tqft@ht + 1)}% \xdef\tqft@fullpath{% \tqft@fullpath .. controls +(0,-\tqft@ht*\tqft@val{cobordism height}) and +(0,\tqft@ht*\tqft@val{cobordism height}) .. (\xppos pt, -\tqft@val{cobordism height}) }% \xdef\tqft@blist{% \tqft@blist,between last incoming and last outgoing/incoming and outgoing/{% (\tqft@val{incoming boundary components} * \tqft@val{boundary separation} + \tqft@val{circle x radius} - \tqft@val{boundary separation},0pt) .. controls +(0,-\tqft@ht*\tqft@val{cobordism height}) and +(0,\tqft@ht*\tqft@val{cobordism height}) .. (\xppos pt, -\tqft@val{cobordism height})}% }% \pgfmathsetmacro\xppos{(\xppos + (\tqft@val{incoming boundary components} -1) * \tqft@val{boundary separation} +\tqft@val{circle x radius})/2}% \xdef\tqft@clist{% \tqft@clist,-between last incoming and last outgoing/{(\xppos pt,-\tqft@val{cobordism height}/2)}% }% \else \pgfmathsetmacro\tqft@ht{1/3 + 2/3*(\tqft@val{incoming boundary components} - 1)/\tqft@val{incoming boundary components}} \xdef\tqft@fullpath{% \tqft@fullpath .. controls +(0,-\tqft@ht*\tqft@val{cobordism height}) and +(0,-\tqft@ht*\tqft@val{cobordism height}) .. (-\tqft@val{circle x radius},0) }% \xdef\tqft@blist{% \tqft@blist,between first and last incoming/incoming and outgoing/{% (\tqft@val{incoming boundary components} * \tqft@val{boundary separation} + \tqft@val{circle x radius} - \tqft@val{boundary separation},0pt) .. controls +(0,-\tqft@ht*\tqft@val{cobordism height}) and +(0,-\tqft@ht*\tqft@val{cobordism height}) .. (-\tqft@val{circle x radius},0)} }% \pgfmathsetmacro\xppos{(\tqft@val{incoming boundary components} -1) * \tqft@val{boundary separation}/2}% \xdef\tqft@clist{% \tqft@clist,-between first and last incoming/{(\xppos pt,-\tqft@ht*\tqft@val{cobordism height}*3/4)},-between first incoming and last incoming/{(\xppos pt,-\tqft@ht*\tqft@val{cobordism height}*3/4)}% }% \fi \else \ifnum\tqft@val{outgoing boundary components}>0\relax \pgfmathsetmacro\xppos{( \tqft@outgoing@end * (\tqft@val{outgoing boundary components} -1)+\tqft@val{offset}) * \tqft@val{boundary separation} + \tqft@outgoing@dir * \tqft@val{circle x radius}} \xdef\tqft@fullpath{% \tqft@fullpath (\xppos pt, -\tqft@val{cobordism height}) }% \fi \fi \ifnum\tqft@val{outgoing boundary components}>0\relax \pgfmathsetmacro\xppos{% ( \tqft@outgoing@end * (\tqft@val{outgoing boundary components} -1) + \tqft@val{offset}) * \tqft@val{boundary separation} - \tqft@outgoing@dir * \tqft@val{circle x radius}}% \xdef\tqft@fullpath{% \tqft@fullpath arc[end angle=\pgf@tqft@upper180, start angle=0, x radius=\tqft@outgoing@dir * \tqft@val{circle x radius}, y radius=\tqft@val{circle y radius}] }% \xdef\tqft@alist{% \tqft@alist,-outgoing boundary \tqft@val{outgoing boundary components}/{(\xppos pt + \tqft@outgoing@dir * \tqft@val{circle x radius},-\tqft@val{cobordism height})},-outgoing boundary/{(\tqft@val{offset}*\tqft@val{boundary separation},-\tqft@val{cobordism height})}% }% \ifnum\tqft@val{outgoing boundary components}>1\relax \foreach \k [evaluate=\k as \ok using int(\tqft@outgoing@end * (\tqft@val{outgoing boundary components} + 1) - \tqft@outgoing@dir * \k)] in {2,...,\tqft@val{outgoing boundary components}} { \edef\tqft@temp{\noexpand\pgfutil@in@{,\ok,}{,\tqft@val{skip outgoing boundary components},}} \tqft@temp \ifpgfutil@in@ \xdef\tqft@cobdrylist{\tqft@cobdrylist,\k} \else \xdef\tqft@obdrylist{\tqft@obdrylist,\k} \fi } \ifx\tqft@obdrylist\pgfutil@gobble \else \foreach \k [ remember=\k as \kmo (initially 1), evaluate=\k as \xpos using ( \tqft@outgoing@end * (\tqft@val{outgoing boundary components} + 1) - 1 - \tqft@outgoing@dir * \k + \tqft@val{offset})*\tqft@val{boundary separation} + \tqft@outgoing@dir * \tqft@val{circle x radius}, ] in \tqft@obdrylist { \pgfmathsetmacro\xppos{(\tqft@outgoing@end * (\tqft@val{outgoing boundary components} + 1) - 1 - \tqft@outgoing@dir * \kmo + \tqft@val{offset})*\tqft@val{boundary separation} - \tqft@outgoing@dir * \tqft@val{circle x radius}} \pgfmathsetmacro\cpos{(\xpos + \xppos)/2} \pgfmathsetmacro\nk{int(\tqft@val{outgoing boundary components} - \k + 1)} \pgfmathsetmacro\nkpo{int(\tqft@val{outgoing boundary components} - \kmo + 1)} \xdef\tqft@fullpath{% \tqft@fullpath .. controls +(0,\tqft@val{cobordism height}/3) and +(0,\tqft@val{cobordism height}/3) .. (\xpos pt,-\tqft@val{cobordism height}) arc[end angle=\pgf@tqft@upper180, start angle=0, x radius=\tqft@outgoing@dir * \tqft@val{circle x radius}, y radius=\tqft@val{circle y radius}] }% \xdef\tqft@blist{% \tqft@blist,between outgoing \nk\space and \nkpo/outgoing/{% (\xppos pt,-\tqft@val{cobordism height}) .. controls +(0,\tqft@val{cobordism height}/3) and +(0,\tqft@val{cobordism height}/3) .. (\xpos pt,-\tqft@val{cobordism height}) ++(-2*\tqft@val{circle x radius},0)}% }% \xdef\tqft@clist{% \tqft@clist,-between outgoing \nk\space and \nkpo/{(\cpos pt,-3*\tqft@val{cobordism height}/4)}% }% \xdef\tqft@alist{% \tqft@alist,-outgoing boundary \nk/{(\xpos pt - \tqft@val{circle x radius},-\tqft@val{cobordism height})}% }% }% \fi \fi \ifnum\tqft@val{incoming boundary components}>0\relax \pgfmathsetmacro\tqft@ht{1/3 + 2/3*abs(\tqft@val{offset})/(abs(\tqft@val{offset}) + 1)}% \xdef\tqft@fullpath{% \tqft@fullpath .. controls +(0,\tqft@ht*\tqft@val{cobordism height}) and +(0,-\tqft@ht*\tqft@val{cobordism height}) .. (-\tqft@val{circle x radius},0) }% \xdef\tqft@blist{% \tqft@blist,between first incoming and first outgoing/incoming and outgoing/{% ({ ( (1 - \tqft@outgoing@end) * (\tqft@val{outgoing boundary components} - 1) + \tqft@val{offset}) * \tqft@val{boundary separation} - \tqft@outgoing@dir * \tqft@val{circle x radius}},-\tqft@val{cobordism height}) .. controls +(0,\tqft@ht*\tqft@val{cobordism height}) and +(0,-\tqft@ht*\tqft@val{cobordism height}) .. (-\tqft@val{circle x radius},0)}% }% \xdef\tqft@clist{% \tqft@clist,-between first incoming and first outgoing/{({ ( (1 - \tqft@outgoing@end) * (\tqft@val{outgoing boundary components} - 1) +\tqft@val{offset})*\tqft@val{boundary separation}/2- \tqft@outgoing@end * \tqft@val{circle x radius}},-\tqft@val{cobordism height}/2)}% }% \else \pgfmathsetmacro\xppos{(\tqft@val{outgoing boundary components} -1+\tqft@val{offset}) * \tqft@val{boundary separation} +\tqft@val{circle x radius}}% \pgfmathsetmacro\tqft@ht{1/3 + 2/3*(\tqft@val{outgoing boundary components} - 1)/\tqft@val{outgoing boundary components}} \xdef\tqft@fullpath{% \tqft@fullpath .. controls +(0,\tqft@ht*\tqft@val{cobordism height}) and +(0,\tqft@ht*\tqft@val{cobordism height}) .. (\xppos pt,-\tqft@val{cobordism height}) }% \xdef\tqft@blist{% \tqft@blist,between first and last outgoing/incoming and outgoing/{% (\tqft@val{offset} * \tqft@val{boundary separation} - \tqft@val{circle x radius},-\tqft@val{cobordism height}) .. controls +(0,\tqft@ht*\tqft@val{cobordism height}) and +(0,\tqft@ht*\tqft@val{cobordism height}) .. (\xppos pt,-\tqft@val{cobordism height})}% }% \pgfmathsetmacro\xppos{(\tqft@val{outgoing boundary components}/2 + \tqft@val{offset} -1/2) * \tqft@val{boundary separation}}% \pgfmathsetmacro\tqft@ht{1 -\tqft@ht*3/4}% \xdef\tqft@clist{% \tqft@clist,-between first and last outgoing/{(\xppos pt,-\tqft@ht*\tqft@val{cobordism height})},-between first outgoing and last outgoing/{(\xppos pt,-\tqft@ht*\tqft@val{cobordism height})}% }% \fi \fi \pgfmathsetmacro\xpos{% ( \tqft@val{outgoing boundary components} > 0 ? ( \tqft@val{incoming boundary components} > 0 ? min(0,\tqft@val{offset}) : \tqft@val{offset} ) : 0 ) *\tqft@val{boundary separation} - 2*\tqft@val{circle x radius}}% \xdef\tqft@gclip{(\xpos pt,2*\tqft@val{circle y radius}) rectangle }% \pgfmathsetmacro\xpos{% (( \tqft@val{outgoing boundary components} > 0 ? ( \tqft@val{incoming boundary components} > 0 ? max(\tqft@val{incoming boundary components},\tqft@val{outgoing boundary components} + \tqft@val{offset}) : \tqft@val{outgoing boundary components} + \tqft@val{offset} ) : \tqft@val{incoming boundary components} )-1) *\tqft@val{boundary separation} + 2*\tqft@val{circle x radius}}% \xdef\tqft@gclip{\tqft@gclip (\xpos pt,-\tqft@val{cobordism height} - 2*\tqft@val{circle y radius})}% \ifnum\tqft@val{genus}>0\relax \pgfmathsetmacro\xpos{% ( \tqft@val{outgoing boundary components} > 0 ? ( \tqft@val{incoming boundary components} > 0 ? \tqft@val{offset}/2 : \tqft@val{offset} ) : 0 ) *\tqft@val{boundary separation} - \tqft@val{circle x radius}}% \pgfmathsetmacro\ypos{% ( \tqft@val{outgoing boundary components} > 0 ? ( \tqft@val{incoming boundary components} > 0 ? -\tqft@val{cobordism height}/2 : -1 + \tqft@val{cobordism height}/3 ) : - \tqft@val{cobordism height}/3 )}% \xdef\tqft@gclip{% \tqft@gclip (\xpos pt,\ypos pt) }% \pgfmathsetmacro\gsize{% (( \tqft@val{outgoing boundary components} > 0 ? ( \tqft@val{incoming boundary components} > 0 ? (\tqft@val{incoming boundary components} + \tqft@val{outgoing boundary components})/2 : \tqft@val{outgoing boundary components} ) : \tqft@val{incoming boundary components} )-1) *\tqft@val{boundary separation}/\tqft@val{circle x radius} + 2}% \pgfmathsetmacro\gscale{min(1,\gsize/(3*\tqft@val{genus}+1))}% \pgfmathsetmacro\gyscale{\tqft@val{circle y radius}*\gscale*.707}% \pgfmathsetmacro\gxscale{\tqft@val{circle x radius}*\gscale}% \pgfmathsetmacro\gsep{((\gsize - 2*\tqft@val{genus}*\gscale)/(\tqft@val{genus} + 1)*\tqft@val{circle x radius}}% \xdef\tqft@gclip{% \tqft@gclip ++(\gsep/2 pt,0) }% \pgfmathsetmacro\omrstwo{1 - 1/sqrt(2)}% \pgfmathsetmacro\sqrtwo{sqrt(2)}% \foreach[ evaluate=\k as \kmo using int(2 * \k-1) ] \k in {1,...,\tqft@val{genus}} { \xdef\tqft@gclip{% \tqft@gclip ++(\gsep/2 pt + \omrstwo*\gxscale pt,0) .. controls +(\gxscale*\sqrtwo/3 pt,4/3*\gyscale pt) and +(-\gxscale*\sqrtwo/3 pt,4/3*\gyscale pt) .. ++(\sqrtwo*\gxscale pt,0) .. controls +(-\gxscale*\sqrtwo/3 pt,-4/3*\gyscale pt) and +(\gxscale*\sqrtwo/3 pt,-4/3*\gyscale pt) .. ++(-\sqrtwo*\gxscale pt,0) ++(2*\gxscale pt -\omrstwo*\gxscale pt + \gsep/2 pt,0) } \xdef\tqft@glist{% \tqft@glist,% hole \k/lower/{% (\xpos pt + \k * \gsep pt + \kmo * \gxscale pt + \gxscale pt -\omrstwo*\gxscale pt,\ypos pt) .. controls +(-\gxscale pt*\sqrtwo/3,\pgf@tqft@upper4/3*\gyscale pt) and +(\gxscale pt*\sqrtwo/3,\pgf@tqft@upper4/3*\gyscale pt) .. ++(-\sqrtwo*\gxscale pt,0)},% hole \k/upper/{(\xpos pt + \k * \gsep pt + \kmo * \gxscale pt - \gxscale pt,\ypos pt + \pgf@tqft@upper\gyscale pt)% .. controls +(\gxscale pt*2/3,\pgf@tqft@lower8/3*\gyscale pt) and +(-\gxscale pt*2/3,\pgf@tqft@lower8/3*\gyscale pt) .. ++(2*\gxscale pt,0)}% }% \xdef\tqft@clist{% \tqft@clist,-hole \k/{(\xpos pt + \k * \gsep pt + \kmo * \gxscale pt,\ypos pt)}% }% }% \fi \gdef\tqft@shift{(0,0)}% \edef\tqft@anchor{\tqft@val{anchor}}% \expandafter\pgfutil@in@\expandafter{\expandafter,\expandafter}\expandafter{\tqft@anchor}% \ifpgfutil@in@ \expandafter\tqft@split\tqft@anchor\relax \else \edef\tqft@anchor{-\tqft@val{anchor}}% \xdef\tqft@alist{\tqft@clist,\tqft@alist}% \foreach \anchor/\coord in \tqft@alist { \ifx\anchor\tqft@anchor\relax \global\let\tqft@shift\coord \fi }% \fi \tikz@scan@one@point\pgfutil@firstofone\tqft@shift\relax \begin{scope}[shift={(-\pgf@x,-\pgf@y)}] \ifnum\tqft@val{incoming boundary components}>0\relax \ifx\tqft@ibdrylist\pgfutil@gobble \xdef\tqft@ibdrylist{1} \else \xdef\tqft@ibdrylist{1,\tqft@ibdrylist} \fi \foreach[evaluate=\k as \xpos using (\k-1)*\tqft@val{boundary separation}] \k in \tqft@ibdrylist { \node[ transform shape, node contents={}, ellipse, inner sep=0pt, outer sep=0pt, minimum width=2*\tqft@val{circle x radius}, minimum height=2*\tqft@val{circle y radius}, at={(\xpos pt,0)}, name=-incoming boundary \k, /tikz/tqft/every boundary component/.try, /tikz/tqft/every incoming boundary component/.try, /tikz/tqft/incoming boundary component \k/.try ]; }% \ifx\tqft@cibdrylist\pgfutil@gobble \else \foreach[evaluate=\k as \xpos using (\k-1)*\tqft@val{boundary separation}] \k in \tqft@cibdrylist { \node[ transform shape, node contents={}, ellipse, inner sep=0pt, outer sep=0pt, minimum width=2*\tqft@val{circle x radius}, minimum height=2*\tqft@val{circle y radius}, at={(\xpos pt,0)}, name=-incoming boundary \k, /tikz/tqft/every skipped boundary component/.try, /tikz/tqft/every skipped incoming boundary component/.try, /tikz/tqft/skipped incoming boundary component \k/.try, ]; }% \fi \path node also[pic alias=-incoming boundary] (-incoming boundary 1); \fi \ifnum\tqft@val{outgoing boundary components}>0\relax \ifx\tqft@obdrylist\pgfutil@gobble \xdef\tqft@obdrylist{1} \else \xdef\tqft@obdrylist{1,\tqft@obdrylist} \fi \foreach \k [evaluate=\k as \ok using int(\tqft@outgoing@end * (\tqft@val{outgoing boundary components} + 1) - \tqft@outgoing@dir * \k)] in \tqft@obdrylist { \xdef\tqft@robdrylist{\tqft@robdrylist,\ok} } \foreach[ evaluate=\k as \xpos using (\k-1+\tqft@val{offset})*\tqft@val{boundary separation} ] \k in \tqft@robdrylist { \node[ transform shape, node contents={}, ellipse, inner sep=0pt, outer sep=0pt, minimum width=2*\tqft@val{circle x radius}, minimum height=2*\tqft@val{circle y radius}, at={(\xpos pt,-\tqft@val{cobordism height})}, name=-outgoing boundary \k, /tikz/tqft/every boundary component/.try, /tikz/tqft/every outgoing boundary component/.try, /tikz/tqft/outgoing boundary component \k/.try ]; }% \ifx\tqft@cobdrylist\pgfutil@gobble \else \foreach \k[evaluate=\k as \ok using int(\tqft@outgoing@end * (\tqft@val{outgoing boundary components} + 1) - \tqft@outgoing@dir * \k)] in \tqft@cobdrylist { \xdef\tqft@rcobdrylist{\tqft@rcobdrylist,\ok} } \foreach[ evaluate=\k as \xpos using (\k-1+\tqft@val{offset})*\tqft@val{boundary separation} ] \k in \tqft@rcobdrylist { \node[ transform shape, node contents={}, ellipse, inner sep=0pt, outer sep=0pt, minimum width=2*\tqft@val{circle x radius}, minimum height=2*\tqft@val{circle y radius}, at={(\xpos pt,-\tqft@val{cobordism height})}, name=-outgoing boundary \k, /tikz/tqft/every skipped boundary component/.try, /tikz/tqft/every skipped outgoing boundary component/.try, /tikz/tqft/skipped outgoing boundary component \k/.try ]; }% \fi \path node also[pic alias=-outgoing boundary] (-outgoing boundary 1); \fi \ifnum\tqft@val{incoming boundary components}>0\relax \foreach[evaluate=\k as \xpos using (\k-1)*\tqft@val{boundary separation}] \k in \tqft@ibdrylist { \path[ /tikz/tqft/every lower boundary component/.try, /tikz/tqft/every incoming lower boundary component/.try, /tikz/tqft/incoming lower boundary component \k/.try ] (\xpos pt - \tqft@val{circle x radius},0) arc[start angle=\pgf@tqft@lower180,end angle=0, x radius=\tqft@val{circle x radius}, y radius =\tqft@val{circle y radius}]; }% \fi \ifnum\tqft@val{outgoing boundary components}>0\relax \foreach[ evaluate=\k as \xpos using (\k-1+\tqft@val{offset})*\tqft@val{boundary separation} ] \k in \tqft@robdrylist { \path[ /tikz/tqft/every lower boundary component/.try, /tikz/tqft/every outgoing lower boundary component/.try, /tikz/tqft/outgoing lower boundary component \k/.try ] (\xpos pt - \tqft@val{circle x radius},-\tqft@val{cobordism height}) arc[start angle=\pgf@tqft@lower180,end angle=0, x radius=\tqft@val{circle x radius}, y radius =\tqft@val{circle y radius}]; }% \fi \begin{scope} \path[overlay,clip] \tqft@gclip; \path[ /tikz/tqft/cobordism/.try, pic actions, /tikz/tqft/cobordism outer path/.try, ] \tqft@fullpath; \end{scope} \ifx\tqft@glist\pgfutil@gobble \else \foreach \tqft@gstyle/\tqft@gside/\tqft@gpath in \tqft@glist { \path[ /tikz/tqft/cobordism/.try, pic actions, fill=none, shade=none, /tikz/tqft/cobordism edge/.try, /tikz/tqft/genus style/.try, /tikz/tqft/genus \tqft@gside/.try, /tikz/tqft/\tqft@gstyle/.try, /tikz/tqft/\tqft@gstyle\space\tqft@gside/.try, ] \tqft@gpath; } \fi \ifx\tqft@blist\pgfutil@gobble \else \foreach \tqft@bstyle/\tqft@btype/\tqft@bpath in \tqft@blist { \path[ /tikz/tqft/cobordism edge/.try, /tikz/tqft/cobordism outer edge/.try, /tikz/tqft/between \tqft@btype/.try, /tikz/tqft/\tqft@bstyle/.try, ] \tqft@bpath; } \fi \ifx\tqft@clist\pgfutil@gobble \else \foreach \name/\coord in \tqft@clist { \path \coord node[coordinate,node contents={},name=\name]; } \fi \ifnum\tqft@val{incoming boundary components}>0\relax \foreach[evaluate=\k as \xpos using (\k-1)*\tqft@val{boundary separation}] \k in \tqft@ibdrylist { \path[ /tikz/tqft/every upper boundary component/.try, /tikz/tqft/every incoming upper boundary component/.try, /tikz/tqft/incoming upper boundary component \k/.try ] (\xpos pt - \tqft@val{circle x radius},0) arc[start angle=\pgf@tqft@upper180,end angle=0, x radius=\tqft@val{circle x radius}, y radius =\tqft@val{circle y radius}]; } \fi \ifnum\tqft@val{outgoing boundary components}>0\relax \foreach[ evaluate=\k as \xpos using (\k-1+\tqft@val{offset})*\tqft@val{boundary separation} ] \k in \tqft@robdrylist { \path[ /tikz/tqft/every upper boundary component/.try, /tikz/tqft/every outgoing upper boundary component/.try, /tikz/tqft/outgoing upper boundary component \k/.try ] (\xpos pt - \tqft@val{circle x radius},-\tqft@val{cobordism height}) arc[start angle=\pgf@tqft@upper180,end angle=0, x radius=\tqft@val{circle x radius}, y radius =\tqft@val{circle y radius}]; } \fi \end{scope} } } %% %% 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 `tikzlibrarytqft.code.tex'.