%% %% This is file `braids.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% braids_code.dtx (with options: `package') %% ---------------------------------------------------------------- %% braids --- a TikZ library for drawing braid diagrams %% bundle version: v2.3 2024/01/09 %% E-mail: Andrew Stacey %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% ---------------------------------------------------------------- %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{braids}[2011/10/18 v1.1 Tikz/PGF commands for drawing braid diagrams (depreciated package)] \newif\if@braids@warning@ \@braids@warning@true \DeclareOption{nowarning}{% \@braids@warning@false } \ProcessOptions \if@braids@warning@ \PackageWarning{braids}{% This package is frozen at v1.1 from 2011/10/18 and has been reimplemented as a TikZ library; if starting with a fresh document, please consider using that instead.% }% \fi \long\def\ge@addto@macro#1#2{% \begingroup \toks@\expandafter\expandafter\expandafter{\expandafter#1#2}% \xdef#1{\the\toks@}% \endgroup} \newcommand{\braid}[1][]{% \begingroup \braid@start{#1}} \def\braid@process{% \afterassignment\braid@handle\let\braid@token=% } \def\braid@process@start{% \afterassignment\braid@handle@start\let\braid@token=% } \def\braid@handle@start{% \let\braid@next=\braid@handle \ifx\braid@token a \let\braid@next=\braid@maybe@locate \else \ifx\braid@token(%) \iffalse)\fi %Indentation hack! \let\braid@next=\braid@assign@name \else \ifx\braid@token\@sptoken \let\braid@next=\braid@process@start \fi \fi \fi \braid@next% } \let\braid@semicolon=; \let\braid@bar=| \def\braid@handle{% \let\braid@next=\braid@process \ifnum\the\catcode`\;=\active \expandafter\let\expandafter\braid@semicolon\tikz@activesemicolon \fi \ifnum\the\catcode`\|=\active \expandafter\let\expandafter\braid@bar\tikz@activebar \fi \ifx\braid@token\braid@semicolon \let\braid@next=\braid@render \else \ifx\braid@token^ \let\braid@next=\braid@sup \else \ifx\braid@token_ \let\braid@next=\braid@sub \else \ifx\braid@token- \braid@increase@levelfalse \else \ifx\braid@token1% \ifbraid@increase@level \stepcounter{braid@level} \fi \braid@increase@leveltrue \ge@addto@macro\braid@label{\braid@token}% \else \ifx\braid@token[% \let\braid@next=\braid@process@options \else \ifx\braid@token\braid@bar \edef\braid@tmp{,\expandafter\the\value{braid@level}}% \ge@addto@macro\braid@floors\braid@tmp% \else \ifx\braid@token\bgroup \braid@beginscope \else \ifx\braid@token\egroup \braid@endscope \else \ifx\braid@token\braid@olabel@strand \let\braid@next=\braid@olabel@strand \else \ifx\braid@token\braid@clabel@strand \let\braid@next=\braid@clabel@strand \else \ge@addto@macro\braid@label{\braid@token}% \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \braid@next% } \def\braid@maybe@locate{% \afterassignment\braid@@maybe@locate\let\braid@token=% } \def\braid@@maybe@locate{% \let\braid@next=\braid@handle \ifx\braid@token t \let\braid@next=\braid@find@location \fi \braid@next% } \def\braid@find@location{% \afterassignment\braid@@find@location\let\braid@token=% } \def\braid@@find@location{% \let\braid@next=\braid@location@error \ifx\braid@token(%) \let\braid@next=\braid@locate \else \ifx\braid@token\@sptoken \let\braid@next=\braid@find@location \fi \fi \braid@next% } \def\braid@location@error{% \PackageWarning{braids}{Could not figure out location for braid}% \braid@process@start% } \def\braid@locate#1){% \tikz@scan@one@point\braid@relocate(#1)% } \def\braid@relocate#1{% #1\relax \advance\pgf@x by -\braid@width \pgftransformshift{\pgfqpoint{\pgf@x}{\pgf@y}} \braid@process@start% } \def\braid@assign@name#1){% \def\braid@name{#1}% \braid@process@start% } \def\braid@process@options#1]{% \tikzset{#1}% \braid@process% } \def\braid@sup#1_#2{% \g@addto@macro\braid@label{_{#2}^{#1}}% \braid@add@crossing{#2}{#1}% } \def\braid@sub#1{% \@ifnextchar^{\braid@@sub{#1}}% {\g@addto@macro\braid@label{_{#1}}\braid@add@crossing{#1}{1}}% } \def\braid@@sub#1^#2{% \g@addto@macro\braid@label{_{#1}^{#2}}% \braid@add@crossing{#1}{#2}% } \def\braid@ne{1} \def\braid@add@crossing#1#2{% \edef\braid@crossing@type{#2}% \edef\braid@this@strand{#1}% \pgfmathtruncatemacro{\braid@next@strand}{#1+1} \ifbraid@increase@level \stepcounter{braid@level} \fi \braid@increase@leveltrue \braid@tx=\braid@this@strand\braid@width \braid@ty=\value{braid@level}\braid@height \advance\braid@ty by \braid@eh \braid@nx=\braid@tx \braid@ny=\braid@ty \advance\braid@nx by \braid@width \advance\braid@ny by \braid@height \advance\braid@ty by \braid@nf\braid@height \advance\braid@ny by -\braid@nf\braid@height \braid@cy=\braid@ty \braid@dy=\braid@ny \advance\braid@cy by \braid@cf\braid@height \advance\braid@dy by -\braid@cf\braid@height \expandafter\let\expandafter\braid@this@path@origin% \csname braid@strand@\braid@this@strand @origin\endcsname \ifx\braid@this@path@origin\relax \let\braid@this@path@origin\braid@this@strand \pgfsyssoftpath@setcurrentpath{\@empty} \pgfpathmoveto{\pgfpoint{\braid@tx}{0pt}} \pgfsyssoftpath@getcurrentpath{\braid@this@path} \else \expandafter\let\expandafter\braid@this@path% \csname braid@strand@\braid@this@path@origin\endcsname \fi \expandafter\let\expandafter\braid@next@path@origin% \csname braid@strand@\braid@next@strand @origin\endcsname \ifx\braid@next@path@origin\relax \let\braid@next@path@origin\braid@next@strand \pgfsyssoftpath@setcurrentpath{\@empty} \pgfpathmoveto{\pgfpoint{\braid@nx}{0pt}} \pgfsyssoftpath@getcurrentpath{\braid@next@path} \else \expandafter\let\expandafter\braid@next@path% \csname braid@strand@\braid@next@path@origin\endcsname \fi \pgfsyssoftpath@setcurrentpath{\braid@this@path} \pgfpathlineto{\pgfqpoint{\braid@tx}{\braid@ty}} \pgfmathsetmacro{\braid@gst}{0.5 - \pgfkeysvalueof{/pgf/braid/gap}}% \pgfmathsetmacro{\braid@gend}{0.5 + \pgfkeysvalueof{/pgf/braid/gap}}% \ifx\braid@crossing@type\braid@over@cross \pgfpathcurveto{\pgfqpoint{\braid@tx}{\braid@cy}}% {\pgfqpoint{\braid@nx}{\braid@dy}}% {\pgfqpoint{\braid@nx}{\braid@ny}} \else \pgfpathcurvebetweentimecontinue{0}{\braid@gst}% {\pgfqpoint{\braid@tx}{\braid@ty}}% {\pgfqpoint{\braid@tx}{\braid@cy}}% {\pgfqpoint{\braid@nx}{\braid@dy}}% {\pgfqpoint{\braid@nx}{\braid@ny}}% \pgfpathcurvebetweentime{\braid@gend}{1}% {\pgfqpoint{\braid@tx}{\braid@ty}}% {\pgfqpoint{\braid@tx}{\braid@cy}}% {\pgfqpoint{\braid@nx}{\braid@dy}}% {\pgfqpoint{\braid@nx}{\braid@ny}} \fi \pgfsyssoftpath@getcurrentpath{\braid@this@path} \pgfsyssoftpath@setcurrentpath{\braid@next@path} \pgfpathlineto{\pgfqpoint{\braid@nx}{\braid@ty}} \ifx\braid@crossing@type\braid@over@cross \pgfpathcurvebetweentimecontinue{0}{\braid@gst}% {\pgfqpoint{\braid@nx}{\braid@ty}}% {\pgfqpoint{\braid@nx}{\braid@cy}}% {\pgfqpoint{\braid@tx}{\braid@dy}}% {\pgfqpoint{\braid@tx}{\braid@ny}} \pgfpathcurvebetweentime{\braid@gend}{1}% {\pgfqpoint{\braid@nx}{\braid@ty}}% {\pgfqpoint{\braid@nx}{\braid@cy}}% {\pgfqpoint{\braid@tx}{\braid@dy}}% {\pgfqpoint{\braid@tx}{\braid@ny}} \else \pgfpathcurveto{\pgfqpoint{\braid@nx}{\braid@cy}}% {\pgfqpoint{\braid@tx}{\braid@dy}}% {\pgfqpoint{\braid@tx}{\braid@ny}} \fi \pgfsyssoftpath@getcurrentpath{\braid@next@path} \expandafter\let% \csname braid@strand@\braid@this@path@origin \endcsname% \braid@this@path \expandafter\let% \csname braid@strand@\braid@next@path@origin \endcsname% \braid@next@path \expandafter\let% \csname braid@strand@\braid@this@strand @origin\endcsname% \braid@next@path@origin \expandafter\let% \csname braid@strand@\braid@next@strand @origin\endcsname% \braid@this@path@origin \pgfmathparse{\value{braid@strands} < \braid@next@strand ? "\noexpand\setcounter{braid@strands}{\braid@next@strand}" : ""} \pgfmathresult \braid@process% } \newcommand{\braid@olabel@strand}[3][]{% \edef\braid@tmp{{\the\value{braid@level}}}% \expandafter\ifx\csname braid@strand@#2@origin\endcsname\relax \g@addto@macro\braid@tmp{{#2}}% \else \edef\braid@tmpa{{\csname braid@strand@#2@origin\endcsname}}% \ge@addto@macro\braid@tmp{\braid@tmpa}% \fi \g@addto@macro\braid@tmp{{#3}{#1}}% \ge@addto@macro{\braid@strand@labels}{\braid@tmp}% \braid@process% } \newcommand{\braid@clabel@strand}[3][]{% \edef\braid@tmp{{\the\value{braid@level}}}% \g@addto@macro\braid@tmp{{#2}{#3}{#1}}% \ge@addto@macro{\braid@strand@labels}{\braid@tmp}% \braid@process% } \def\braid@floors@trim,{} \def\braid@render@floor{% \draw (\floorsx,\floorsy) rectangle (\floorex,\floorey); } \def\braid@render@strand@labels#1{% \def\braid@tmp{#1}% \ifx\braid@tmp\pgfutil@empty \let\braid@next=\pgfutil@gobble \else \let\braid@next=\braid@@render@strand@labels \fi \braid@next{#1}% } \def\braid@@render@strand@labels#1#2#3#4{% \begingroup \pgfscope \let\tikz@options=\pgfutil@empty \let\tikz@mode=\pgfutil@empty \let\tik@transform=\pgfutil@empty \let\tikz@fig@name=\pgfutil@empty \tikzset{/pgf/braid/strand label,#4}% \braid@nx=#2\braid@width \braid@ny=#1\braid@height \advance\braid@ny by \braid@eh \advance\braid@ny by \braid@height \pgftransformshift{\pgfqpoint{\braid@nx}{\braid@ny}}% \tikz@options \setbox\pgfnodeparttextbox=\hbox% \bgroup% \tikzset{every text node part/.try}% \ifx\tikz@textopacity\pgfutil@empty% \else% \pgfsetfillopacity{\tikz@textopacity}% \pgfsetstrokeopacity{\tikz@textopacity}% \fi% \pgfinterruptpicture% \tikz@textfont% \ifx\tikz@text@width\pgfutil@empty% \else% \begingroup% \pgfmathsetlength{\pgf@x}{\tikz@text@width}% \pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}% \tikz@text@action% \fi% \tikz@atbegin@node% \bgroup% \aftergroup\unskip% \ifx\tikz@textcolor\pgfutil@empty% \else% \pgfutil@colorlet{.}{\tikz@textcolor}% \fi% \pgfsetcolor{.}% \setbox\tikz@figbox=\box\pgfutil@voidb@x% \tikz@uninstallcommands% \tikz@halign@check% \ignorespaces% #3 \egroup \tikz@atend@node% \ifx\tikz@text@width\pgfutil@empty% \else% \pgfutil@endminipage% \endgroup% \fi% \endpgfinterruptpicture% \egroup% \ifx\tikz@text@width\pgfutil@empty% \else% \pgfmathsetlength{\pgf@x}{\tikz@text@width}% \wd\pgfnodeparttextbox=\pgf@x% \fi% \ifx\tikz@text@height\pgfutil@empty% \else% \pgfmathsetlength{\pgf@x}{\tikz@text@height}% \ht\pgfnodeparttextbox=\pgf@x% \fi% \ifx\tikz@text@depth\pgfutil@empty% \else% \pgfmathsetlength{\pgf@x}{\tikz@text@depth}% \dp\pgfnodeparttextbox=\pgf@x% \fi% \pgfmultipartnode{\tikz@shape}{\tikz@anchor}{\tikz@fig@name}{% {\begingroup\tikz@finish}% }% \endpgfscope \endgroup \braid@render@strand@labels% } \def\braid@render{ \ifx\braid@floors\@empty \else \pgfsys@beginscope \pgfsyssoftpath@setcurrentpath{\empty} \edef\braid@floors{\expandafter\braid@floors@trim\braid@floors} \braid@tx=\braid@width \advance\braid@tx by \braid@eh \braid@nx=\value{braid@strands}\braid@width \advance\braid@nx by -\braid@eh \foreach \braid@f in \braid@floors { \pgfsys@beginscope \braid@ty=\braid@f\braid@height \advance\braid@ty by \braid@eh \advance\braid@ty by \braid@height \braid@ny=\braid@ty \advance\braid@ny by \braid@height \edef\floorsx{\the\braid@tx} \edef\floorsy{\the\braid@ty} \edef\floorex{\the\braid@nx} \edef\floorey{\the\braid@ny} \let\tikz@options=\pgfutil@empty \expandafter\tikzset\expandafter{\braid@floors@style} \pgfmathtruncatemacro{\braid@ff}{\braid@f+2} \expandafter\let\expandafter\braid@floor@style% \csname braid@options@floor@\braid@ff\endcsname \ifx\braid@floor@style\relax \else \expandafter\tikzset\expandafter{\braid@floor@style}% \fi \tikz@options \braid@render@floor \pgfsys@endscope } \pgfsys@endscope \fi \stepcounter{braid@level} \foreach \braid@k in {1,...,\value{braid@strands}} { \pgfsys@beginscope \tikz@mode@drawtrue% \let\tikz@mode=\pgfutil@empty \let\tikz@options=\pgfutil@empty \braid@tx=\braid@k\braid@width \braid@ty=\value{braid@level}\braid@height \advance\braid@ty by 2\braid@eh \expandafter\let\expandafter\braid@path@origin% \csname braid@strand@\braid@k @origin\endcsname \ifx\braid@path@origin\relax \pgfsyssoftpath@setcurrentpath{\@empty} \pgfpathmoveto{\pgfqpoint{\braid@tx}{0pt}} \let\braid@path@origin\braid@k \else \expandafter\let\expandafter\braid@path% \csname braid@strand@\braid@path@origin\endcsname \pgfsyssoftpath@setcurrentpath{\braid@path} \fi \pgflineto{\pgfqpoint{\braid@tx}{\braid@ty}} \expandafter\tikzset\expandafter{\braid@style} \expandafter\let\expandafter\braid@style% \csname braid@options@strand@\braid@path@origin\endcsname \ifx\braid@style\relax \else \expandafter\tikzset\expandafter{\braid@style} \fi \braid@options \tikz@mode \tikz@options \edef\tikz@temp{\noexpand\pgfusepath{% \iftikz@mode@draw draw\fi% }}% \tikz@temp \ifx\braid@name\pgfutil@empty \else \coordinate (\braid@name-\braid@path@origin-e) at (\braid@tx,\braid@ty); \coordinate (\braid@name-rev-\braid@k-e) at (\braid@tx,\braid@ty); \braid@nx=\braid@path@origin\braid@width \coordinate (\braid@name-\braid@path@origin-s) at (\braid@nx,0pt); \coordinate (\braid@name-rev-\braid@k-s) at (\braid@nx,0pt); \fi \pgfsys@endscope } \ifx\braid@name\pgfutil@empty \else \braid@tx=\value{braid@strands}\braid@width \braid@ty=\value{braid@level}\braid@height \advance\braid@ty by 2\braid@eh \advance\braid@tx by \braid@width \braid@tx=.5\braid@tx \braid@ty=.5\braid@ty \coordinate (\braid@name) at (\braid@tx,\braid@ty); \fi \ifx\braid@strand@labels\pgfutil@empty \else \expandafter\braid@render@strand@labels\braid@strand@labels{}% \fi \pgfsys@endscope \endgroup} \def\braid@start#1{% \pgfsys@beginscope \setcounter{braid@level}{-1}% \let\braid@label\@empty \let\braid@strand@labels\@empty \let\braid@floors\@empty \let\braid@name\empty \let\clabel=\braid@clabel@strand \let\olabel=\braid@olabel@strand \pgfkeys{/pgf/braid/.cd,#1}% \ifbraid@strand@labels@origin \let\label=\braid@olabel@strand \else \let\label=\braid@clabel@strand \fi \let\braid@options\tikz@options \tikz@transform \setcounter{braid@strands}{% \pgfkeysvalueof{/pgf/braid/number of strands}}% \braid@width=\pgfkeysvalueof{/pgf/braid/width}% \braid@height=\pgfkeysvalueof{/pgf/braid/height}% \braid@eh=\pgfkeysvalueof{/pgf/braid/border height}% \pgfkeysgetvalue{/pgf/braid/control factor}{\braid@cf}% \pgfkeysgetvalue{/pgf/braid/nudge factor}{\braid@nf}% \braid@height=-\braid@height \braid@eh=-\braid@eh \braid@increase@leveltrue \braid@process@start } \newdimen\braid@width \newdimen\braid@height \newdimen\braid@tx \newdimen\braid@ty \newdimen\braid@nx \newdimen\braid@ny \newdimen\braid@cy \newdimen\braid@dy \newdimen\braid@eh \newif\ifbraid@increase@level \newif\ifbraid@strand@labels@origin \let\braid@style\pgfutil@empty \let\braid@floors@style\pgfutil@empty \def\braid@over@cross{1} \newcounter{braid@level} \newcounter{braid@strands} \pgfkeys{ /tikz/braid/.search also={/pgf}, /pgf/braid/.search also={/pgf,/tikz}, /pgf/braid/.cd, number of strands/.initial=0, height/.initial=1cm, width/.initial=1cm, gap/.initial=.1, border height/.initial=.25cm, control factor/.initial=.5, nudge factor/.initial=.05, name/.code={% \def\braid@name{#1}% }, at/.code={% \braid@relocate{#1}% }, floor command/.code={% \def\braid@render@floor{#1}% }, style strands/.code 2 args={% \def\braid@temp{#2}% \braidset{style each strand/.list={#1}}% }, style each strand/.code={% \expandafter\edef% \csname braid@options@strand@#1\endcsname{\braid@temp}% }, style floors/.code 2 args={% \def\braid@temp{#2}% \braidset{style each floor/.list={#1}}% }, style each floor/.code={% \expandafter\edef% \csname braid@options@floor@#1\endcsname{\braid@temp}% }, style all floors/.code={% \def\braid@floors@style{#1} }, strand label/.style={}, strand label by origin/.is if=braid@strand@labels@origin, } \def\braidset#1{% \pgfkeys{/pgf/braid/.cd,#1}} %% %% 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 braids.dtx %% braids_doc.tex %% and the derived files README.txt, %% braids.ins, %% braids.pdf, %% braids.sty, %% tikzlibrarybraids.code.tex, %% braids_doc.pdf. %% %% %% End of file `braids.sty'.