summaryrefslogtreecommitdiff
path: root/graphics
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-07-06 03:00:52 +0000
committerNorbert Preining <norbert@preining.info>2021-07-06 03:00:52 +0000
commit109a435244c29109322bcd46386301f6c62d4061 (patch)
tree13a621b9870dcf81bf4c6e38410f6ee4b0fb54f3 /graphics
parent500adb5fa10a924ea571a0d9d7754ed17dab5dbf (diff)
CTAN sync 202107060300
Diffstat (limited to 'graphics')
-rw-r--r--graphics/pgf/contrib/strands/README.md15
-rw-r--r--graphics/pgf/contrib/strands/strands.dtx1835
-rw-r--r--graphics/pgf/contrib/strands/strands.ins57
-rw-r--r--graphics/pgf/contrib/strands/strands.pdfbin0 -> 156024 bytes
-rw-r--r--graphics/pgf/contrib/yquant/doc/yquant-doc.pdfbin679110 -> 680322 bytes
-rw-r--r--graphics/pgf/contrib/yquant/doc/yquant-doc.tex10
-rw-r--r--graphics/pgf/contrib/yquant/tex/yquant-draw.tex55
-rw-r--r--graphics/pgf/contrib/yquant/tex/yquant-prepare.tex8
-rw-r--r--graphics/pgf/contrib/yquant/tex/yquant.sty2
9 files changed, 1958 insertions, 24 deletions
diff --git a/graphics/pgf/contrib/strands/README.md b/graphics/pgf/contrib/strands/README.md
new file mode 100644
index 0000000000..88b84d5b4c
--- /dev/null
+++ b/graphics/pgf/contrib/strands/README.md
@@ -0,0 +1,15 @@
+%
+% Copyright (C) 2021 by Diego Arcis <arcisd@gmail.com>
+% ---------------------------------------------------------------------------
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Diego Arcis.
+% \ No newline at end of file
diff --git a/graphics/pgf/contrib/strands/strands.dtx b/graphics/pgf/contrib/strands/strands.dtx
new file mode 100644
index 0000000000..a1ac4f1b4b
--- /dev/null
+++ b/graphics/pgf/contrib/strands/strands.dtx
@@ -0,0 +1,1835 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2021 by Diego Arcis <arcisd@gmail.com>
+% ---------------------------------------------------------------------------
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Diego Arcis.
+%
+% This work consists of the files strands.dtx and strands.ins
+% and the derived filebase strands.sty.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{strands.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<package>\ProvidesPackage{strands}
+%<*package>
+ [<+date+> <+version+> <+description+>]
+%</package>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{strands}[<+date+>]
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{strands.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{1713}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{<+version+>}{<+date+>}{Converted to DTX file}
+%
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+% \providecommand*{\url}{\texttt}
+% \GetFileInfo{strands.dtx}
+% \title{The \textsf{strands} package}
+% \author{Diego Arcis \\ \url{arcisd@gmail.com}}
+% \date{\fileversion~from \filedate}
+%
+% \maketitle
+%
+% \section{Introduction}
+%
+% Put text here.
+%
+% \section{Usage}
+%
+% Put text here.
+%
+%
+% \DescribeMacro{\getelem}
+%
+%
+% \DescribeMacro{\decoratestrands}
+%
+%
+% \DescribeMacro{\vvpartition}
+%
+%
+% \DescribeMacro{\vpartition}
+%
+%
+% \DescribeMacro{\arcpartition}
+%
+%
+% \DescribeMacro{\permutation}
+%
+%
+% \DescribeMacro{\tiedpair}
+%
+%
+% \DescribeMacro{\tie}
+%
+%
+% \DescribeMacro{\bbackstrands}
+%
+%
+% \DescribeMacro{\lleftstrand}
+%
+%
+% \DescribeMacro{\rrightstrand}
+%
+%
+% \DescribeMacro{\ccrossback}
+%
+%
+% \DescribeMacro{\bbraidgen}
+%
+%
+% \DescribeMacro{\ttanglegen}
+%
+%
+% \DescribeMacro{\aaddgen}
+%
+%
+% \DescribeMacro{\sstrands}
+%
+%
+% \DescribeMacro{\strands}
+%
+
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{strands}[Diego Arcis 2021/07/05 Strands v1.0]
+% \end{macrocode}
+% packages:
+% \begin{macrocode}
+\RequirePackage{forarray}
+\RequirePackage{ifthen}
+\RequirePackage{tikz}
+\RequirePackage{xfp}
+\RequirePackage{xstring}
+\RequirePackage{xkeyval}
+\usetikzlibrary{snakes}
+% \end{macrocode}
+%
+% \begin{macro}{\getelem}
+% \begin{macrocode}
+\newcommand{\getelem}[3]{ % \getelem{list}{index}{\name}
+ \StrBetween[#2,\fpeval{#2+1}]{,#1,}{,}{,}[#3]
+}
+% \end{macrocode}
+% \end{macro}
+%
+% global variables:
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{strands}{backcolor}{}
+\define@cmdkey[str]{strands}{bend}{}
+\define@cmdkey[str]{strands}{bendbraid}{}
+\define@cmdkey[str]{strands}{bendtangle}{}
+\define@cmdkey[str]{strands}{bulletsize}{}
+\define@cmdkey[str]{strands}{braidcross}{}
+\define@cmdkey[str]{strands}{braidsingcross}{}
+\define@cmdkey[str]{strands}{braidvirtcross}{}
+\define@cmdkey[str]{strands}{coverunion}{}
+\define@cmdkey[str]{strands}{direction}{}
+\define@cmdkey[str]{strands}{externalize}{}
+\define@cmdkey[str]{strands}{font}{}
+\define@cmdkey[str]{strands}{gencharposbraid}{}
+\define@cmdkey[str]{strands}{gencharnegbraid}{}
+\define@cmdkey[str]{strands}{gencharvirtual}{}
+\define@cmdkey[str]{strands}{gencharsingular}{}
+\define@cmdkey[str]{strands}{genchartangle}{}
+\define@cmdkey[str]{strands}{genchartie}{}
+\define@cmdkey[str]{strands}{genchartiedtangle}{}
+\define@cmdkey[str]{strands}{genchartrivial}{}
+\define@cmdkey[str]{strands}{height}{}
+\define@cmdkey[str]{strands}{labelver}{}
+\define@cmdkey[str]{strands}{labelhor}{}
+\define@cmdkey[str]{strands}{norma}{}
+\define@cmdkey[str]{strands}{normb}{}
+\define@cmdkey[str]{strands}{normcolor}{}
+\define@cmdkey[str]{strands}{normsymbol}{}
+\define@cmdkey[str]{strands}{nstr}{}
+\define@cmdkey[str]{strands}{num}{}
+\define@cmdkey[str]{strands}{rotate}{}
+\define@cmdkey[str]{strands}{scale}{}
+\define@cmdkey[str]{strands}{strwidth}{}
+\define@cmdkey[str]{strands}{tiebend}{}
+\define@cmdkey[str]{strands}{tiebull}{}
+\define@cmdkey[str]{strands}{tiebullsize}{}
+\define@cmdkey[str]{strands}{tiecolor}{}
+\define@cmdkey[str]{strands}{tieheight}{}
+\define@cmdkey[str]{strands}{tiesnake}{}
+\define@cmdkey[str]{strands}{tiesnakeamp}{}
+\define@cmdkey[str]{strands}{tiesnakends}{}
+\define@cmdkey[str]{strands}{tiesnakelen}{}
+\define@cmdkey[str]{strands}{tiestyle}{}
+\define@cmdkey[str]{strands}{tiewidth}{}
+\define@cmdkey[str]{strands}{timeswidth}{}
+\define@cmdkey[str]{strands}{tkzpic}{}
+\define@cmdkey[str]{strands}{width}{}
+% \end{macrocode}
+% default options:
+% \begin{macrocode}
+\presetkeys[str]{strands}{
+ backcolor=white, % color of the paper.
+ bend=45, % bend of partitions.
+ bendbraid=30, % bend for braid crossings.
+ bendtangle=45, % bend for tangles.
+ braidcross=3, % size of the braid crossing.
+ braidsingcross=1.6, % size of the singular braid crossing.
+ braidvirtcross=8, % size of the virtual braid crossing.
+ bulletsize=0.04,
+ coverunion=0.001, % extra length to cover the union of strands.
+ direction=1,
+ externalize=0, % use 1 to transform images to PDF.
+ font=0.7, % size of the fonts for labels.
+ gencharposbraid=p,
+ gencharnegbraid=n,
+ gencharvirtual=v,
+ gencharsingular=s,
+ genchartangle=t,
+ genchartie=e,
+ genchartiedtangle=f,
+ genchartrivial=i,
+ height=1, % to set the height of strands.
+ labelver=0.2,
+ labelhor=0.03,
+ norma=0, % to normalize the height above.
+ normb=0, % to normalize the height below.
+ normcolor=transparent,
+ normsymbol=-,
+ nstr=0, % number of strands.
+ num=0, % number of dots for arc partitions.
+ rotate=0, % to rotate all pictures.
+ scale=1, % to scale all pictures.
+ strwidth=0.7, % to set the width of the strands.
+ tiebend=0, % to set bend of ties.
+ tiebull=0, % bullets for ties.
+ tiebullsize=0.04,
+ tiecolor=red, % to set color of the ties.
+ tieheight=0.5, % height of ties respect to the global height.
+ tiesnake=false,
+ tiesnakeamp=1,
+ tiesnakends=0,
+ tiesnakelen=3,
+ tiestyle=dashed, % to set the type of the tie lines.
+ tiewidth=0.5, % to set the width of tie lines.
+ timeswidth=3,
+ tkzpic=1,
+ width=0.6, % to set the width between strands.
+}{}
+\setkeys[str]{strands}{}
+% \end{macrocode}
+% declare custom options:
+% \begin{macrocode}
+\DeclareOptionX{backcolor}{\renewcommand{\cmdstr@strands@backcolor}{#1}}
+\DeclareOptionX{bend}{\renewcommand{\cmdstr@strands@bend}{#1}}
+\DeclareOptionX{bendbraid}{\renewcommand{\cmdstr@strands@bendbraid}{#1}}
+\DeclareOptionX{bendtangle}{\renewcommand{\cmdstr@strands@bendtangle}{#1}}
+\DeclareOptionX{braidcross}{\renewcommand{\cmdstr@strands@braidcross}{#1}}
+\DeclareOptionX{braidsingcross}{\renewcommand{\cmdstr@strands@braidsingcross}{#1}}
+\DeclareOptionX{braidvirtcross}{\renewcommand{\cmdstr@strands@braidvirtcross}{#1}}
+\DeclareOptionX{bulletsize}{\renewcommand{\cmdstr@strands@bulletsize}{#1}}
+\DeclareOptionX{coverunion}{\renewcommand{\cmdstr@strands@coverunion}{#1}}
+\DeclareOptionX{direction}{\renewcommand{\cmdstr@strands@direction}{#1}}
+\DeclareOptionX{externalize}{\renewcommand{\cmdstr@strands@externalize}{#1}}
+\DeclareOptionX{font}{\renewcommand{\cmdstr@strands@font}{#1}}
+\DeclareOptionX{gencharposbraid}{\renewcommand{\cmdstr@strands@gencharposbraid}{#1}}
+\DeclareOptionX{gencharnegbraid}{\renewcommand{\cmdstr@strands@gencharnegbraid}{#1}}
+\DeclareOptionX{gencharvirtual}{\renewcommand{\cmdstr@strands@gencharvirtual}{#1}}
+\DeclareOptionX{gencharsingular}{\renewcommand{\cmdstr@strands@gencharsingular}{#1}}
+\DeclareOptionX{genchartangle}{\renewcommand{\cmdstr@strands@genchartangle}{#1}}
+\DeclareOptionX{genchartie}{\renewcommand{\cmdstr@strands@genchartie}{#1}}
+\DeclareOptionX{genchartiedtangle}{\renewcommand{\cmdstr@strands@genchartiedtangle}{#1}}
+\DeclareOptionX{height}{\renewcommand{\cmdstr@strands@height}{#1}}
+\DeclareOptionX{labelver}{\renewcommand{\cmdstr@strands@labelver}{#1}}
+\DeclareOptionX{labelhor}{\renewcommand{\cmdstr@strands@labelhor}{#1}}
+\DeclareOptionX{norma}{\renewcommand{\cmdstr@strands@norma}{#1}}
+\DeclareOptionX{normb}{\renewcommand{\cmdstr@strands@normb}{#1}}
+\DeclareOptionX{normcolor}{\renewcommand{\cmdstr@strands@normcolor}{#1}}
+\DeclareOptionX{nstr}{\renewcommand{\cmdstr@strands@nstr}{#1}}
+\DeclareOptionX{num}{\renewcommand{\cmdstr@strands@num}{#1}}
+\DeclareOptionX{rotate}{\renewcommand{\cmdstr@strands@rotate}{#1}}
+\DeclareOptionX{scale}{\renewcommand{\cmdstr@strands@scale}{#1}}
+\DeclareOptionX{strwidth}{\renewcommand{\cmdstr@strands@strwidth}{#1}}
+\DeclareOptionX{tiebend}{\renewcommand{\cmdstr@strands@tiebend}{#1}}
+\DeclareOptionX{tiebull}{\renewcommand{\cmdstr@strands@tiebull}{#1}}
+\DeclareOptionX{tiebullsize}{\renewcommand{\cmdstr@strands@tiebullsize}{#1}}
+\DeclareOptionX{tiecolor}{\renewcommand{\cmdstr@strands@tiecolor}{#1}}
+\DeclareOptionX{tiesnake}{\renewcommand{\cmdstr@strands@tiesnake}{#1}}
+\DeclareOptionX{tiestyle}{\renewcommand{\cmdstr@strands@tiestyle}{#1}}
+\DeclareOptionX{tiewidth}{\renewcommand{\cmdstr@strands@tiewidth}{#1}}
+\DeclareOptionX{timeswidth}{\renewcommand{\cmdstr@strands@timeswidth}{#1}}
+\DeclareOptionX{tkzpic}{\renewcommand{\cmdstr@strands@tkzpic}{#1}}
+\DeclareOptionX{width}{\renewcommand{\cmdstr@strands@width}{#1}}
+\DeclareOptionX*{\PackageWarning{strands}{`\CurrentOption' ignored}} % ignore unknown options.
+\ProcessOptionsX\relax
+\ifnum\cmdstr@strands@externalize=1
+ \usetikzlibrary{external}
+ \tikzexternalize[optimize=false,prefix=strpack]
+\fi
+% \end{macrocode}
+% \decoratestrands - macro to add bullets and labels to picture.
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{decor}{bulla}{}
+\define@cmdkey[str]{decor}{bullb}{}
+\define@cmdkey[str]{decor}{bulletends}{}
+\define@cmdkey[str]{decor}{floor}{}
+\define@cmdkey[str]{decor}{font}{}
+\define@cmdkey[str]{decor}{height}{}
+\define@cmdkey[str]{decor}{labelver}{}
+\define@cmdkey[str]{decor}{labelhor}{}
+\define@cmdkey[str]{decor}{nstr}{}
+\define@cmdkey[str]{decor}{type}{}
+\define@cmdkey[str]{decor}{width}{}
+\presetkeys[str]{decor}{
+ bulla=1,
+ bullb=1,
+ bulletends=\cmdstr@strands@bulletsize,
+ floor=0,
+ font=\cmdstr@strands@font,
+ height=\cmdstr@strands@height,
+ labelver=\cmdstr@strands@labelver,
+ labelhor=\cmdstr@strands@labelhor,
+ nstr=\cmdstr@strands@nstr,
+ type=3,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\decoratestrands}
+% \begin{macrocode}
+\newcommand{\decoratestrands}[1][]{
+ \setkeys[str]{decor}{#1} % set variables.
+ \foreach\ind in{0,...,\fpeval{\cmdstr@decor@nstr-1}}{
+ \ifnum \cmdstr@decor@bulla=1 % bullets above.
+ \filldraw(\fpeval{\ind*\cmdstr@decor@width},
+ \fpeval{(\cmdstr@decor@floor+1)*\cmdstr@decor@height})circle(\cmdstr@decor@bulletends);
+ \fi
+ \ifnum \cmdstr@decor@bullb=1 % bullets below.
+ \filldraw(\fpeval{\ind*\cmdstr@decor@width},
+ \fpeval{\cmdstr@decor@floor*\cmdstr@decor@height})circle(\cmdstr@decor@bulletends);
+ \fi
+% \end{macrocode}
+% classic labels.
+% \begin{macrocode}
+ \ifnum \cmdstr@decor@type<5;
+ \ifnum \cmdstr@decor@type>0 % labels above from 1 to n.
+ \node[scale=\cmdstr@decor@font]at
+ (\fpeval{\ind*\cmdstr@decor@width},
+ \fpeval{(\cmdstr@decor@floor+1)*\cmdstr@decor@height+\cmdstr@decor@labelver})
+ {$\fpeval{\ind+1}$};
+ \fi
+ \node[scale=\cmdstr@decor@font]at
+ (\fpeval{\ind*\cmdstr@decor@width},
+ \fpeval{\cmdstr@decor@floor*\cmdstr@decor@height-\cmdstr@decor@labelver})
+ {$\ifnum\fpeval{(\cmdstr@decor@type+1)*(\cmdstr@decor@type-2)}=0{
+ \fpeval{\ind+1}
+ }\else{\ifnum\fpeval{abs(\cmdstr@decor@type)}=3{
+ \fpeval{\ind+\cmdstr@decor@nstr+1}
+ }\else{\ifnum\fpeval{abs(\cmdstr@decor@type)}=4{
+ \fpeval{\ind+1}'
+ }\fi}\fi}\fi$};
+ \fi
+% \end{macrocode}
+% signed labels (n must be even).
+% \begin{macrocode}
+ \ifnum \cmdstr@decor@type=5
+ \ifnum\ind<\fpeval{\cmdstr@decor@nstr/2} % labels from -2n to 2n.
+ \node[scale=\cmdstr@decor@font]at
+ (\fpeval{(\ind+\cmdstr@decor@nstr/2)*\cmdstr@decor@width},
+ \fpeval{(\cmdstr@decor@floor+1)*\cmdstr@decor@height+\cmdstr@decor@labelver})
+ {$\fpeval{\ind+1}$};
+ \node[scale=\cmdstr@decor@font]at
+ (\fpeval{\ind*\cmdstr@decor@width-\cmdstr@decor@labelhor},
+ \fpeval{(\cmdstr@decor@floor+1)*\cmdstr@decor@height+\cmdstr@decor@labelver})
+ {-$\fpeval{\cmdstr@decor@nstr/2-\ind}$};
+ \node[scale=\cmdstr@decor@font]at
+ (\fpeval{(\ind+\cmdstr@decor@nstr/2)*\cmdstr@decor@width},
+ \fpeval{\cmdstr@decor@floor*\cmdstr@decor@height-\cmdstr@decor@labelver})
+ {$\fpeval{\ind+\cmdstr@decor@nstr/2+1}$};
+ \node[scale=\cmdstr@decor@font]at
+ (\fpeval{\ind*\cmdstr@decor@width-\cmdstr@decor@labelhor},
+ \fpeval{\cmdstr@decor@floor*\cmdstr@decor@height-\cmdstr@decor@labelver})
+ {-$\fpeval{\cmdstr@decor@nstr-\ind}$};
+ \fi
+ \fi
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \vpartition - macro to draw set partitions in the partition monoid.
+%
+% Example: the set partition {1,2}{3,-4}{4,-3} of [2*4] is drawn as follows:
+%
+% \vpartition[<options>]{{1,2},{3,-4},{4,-3}}
+%
+% 1 2 3 4
+% | | | |
+% ----- - -
+% -
+% - -
+% | |
+% 5 6 7 8
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{vvpart}{bend}{}
+\define@cmdkey[str]{vvpart}{bulla}{}
+\define@cmdkey[str]{vvpart}{bullb}{}
+\define@cmdkey[str]{vvpart}{bulletends}{}
+\define@cmdkey[str]{vvpart}{floor}{}
+\define@cmdkey[str]{vvpart}{font}{}
+\define@cmdkey[str]{vvpart}{height}{}
+\define@cmdkey[str]{vvpart}{labelver}{}
+\define@cmdkey[str]{vvpart}{labelhor}{}
+\define@cmdkey[str]{vvpart}{norma}{}
+\define@cmdkey[str]{vvpart}{normb}{}
+\define@cmdkey[str]{vvpart}{nstr}{}
+\define@cmdkey[str]{vvpart}{permut}{}
+\define@cmdkey[str]{vvpart}{reflect}{}
+\define@cmdkey[str]{vvpart}{strwidth}{}
+\define@cmdkey[str]{vvpart}{type}{}
+\define@cmdkey[str]{vvpart}{width}{}
+\presetkeys[str]{vvpart}{
+ bend=\cmdstr@strands@bend,
+ bulla=1,
+ bullb=1,
+ bulletends=\cmdstr@strands@bulletsize,
+ floor=0,
+ font=\cmdstr@strands@font,
+ height=\cmdstr@strands@height,
+ labelver=\cmdstr@strands@labelver,
+ labelhor=\cmdstr@strands@labelhor,
+ norma=\cmdstr@strands@norma,
+ normb=\cmdstr@strands@normb,
+ nstr=\cmdstr@strands@nstr,
+ permut=0, % use 1 to draw permutations (to use with \permutation).
+ reflect=0,
+ strwidth=\cmdstr@strands@strwidth,
+ type=3,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\vvpartition}
+% \begin{macrocode}
+\newcommand{\vvpartition}[2][]{
+ \setkeys[str]{vvpart}{#1} % set variables.
+% \end{macrocode}
+% normalize vertical size.
+% \begin{macrocode}
+ \node[\cmdstr@strands@normcolor]at(0,\cmdstr@vvpart@norma){\cmdstr@strands@normsymbol};
+ \node[\cmdstr@strands@normcolor]at(0,\cmdstr@vvpart@normb){\cmdstr@strands@normsymbol};
+% \end{macrocode}
+% number of strands.
+% \begin{macrocode}
+ \StrRemoveBraces{#2}[\nobracespart]
+ \let\oldnumstrands\cmdstr@vvpart@nstr
+ \renewcommand{\cmdstr@vvpart@nstr}
+ {\fpeval{max(abs(min(\nobracespart)),abs(max(\nobracespart)),\fpeval{abs(\oldnumstrands)})}}
+% \end{macrocode}
+% bullets and labels.
+% \begin{macrocode}
+ \decoratestrands[
+ bulla=\cmdstr@vvpart@bulla,
+ bullb=\cmdstr@vvpart@bullb,
+ bulletends=\cmdstr@vvpart@bulletends,
+ floor=\cmdstr@vvpart@floor,
+ font=\cmdstr@vvpart@font,
+ height=\cmdstr@vvpart@height,
+ labelver=\cmdstr@vvpart@labelver,
+ labelhor=\cmdstr@vvpart@labelhor,
+ nstr=\cmdstr@vvpart@nstr,
+ type=\cmdstr@vvpart@type,
+ width=\cmdstr@vvpart@width
+ ]
+% \end{macrocode}
+% connections: permutation case.
+% \begin{macrocode}
+ \foreach\ind in{0,...,\fpeval{\cmdstr@vvpart@nstr-1}}{
+ \ifnum\cmdstr@vvpart@permut=1
+ \getelem{#2}{\fpeval{\ind+1}}{\index}
+ \draw[line width=\cmdstr@vvpart@strwidth](\fpeval{\ind*\cmdstr@vvpart@width},
+ \fpeval{\cmdstr@vvpart@height+\cmdstr@vvpart@floor*\cmdstr@vvpart@height})to
+ (\fpeval{(\ifnum\fpeval{\index+0}>0 \index\else\fpeval{\ind+1}\fi-1)*
+ \cmdstr@vvpart@width},\cmdstr@vvpart@floor*\cmdstr@vvpart@height);
+ \fi
+ }
+% \end{macrocode}
+% connections: general case.
+% \begin{macrocode}
+ \ifnum\cmdstr@vvpart@permut=0 \foreach\block in{#2}{
+ \StrCount{\block}{,}[\numcom]
+ \ifnum\numcom>0\foreach\ind in {2,...,\fpeval{\numcom+1}}{
+ \getelem{\block}{\fpeval{\ind-1}}{\firbul}
+ \getelem{\block}{\ind}{\secbul}
+ \ifnum \cmdstr@vvpart@reflect=1 % reflect connections vertically.
+ \let\oldfirbul\firbul
+ \renewcommand{\firbul}{-\oldfirbul}
+ \let\oldsecbul\secbul
+ \renewcommand{\secbul}{-\oldsecbul}
+ \fi
+ \draw[line width=\cmdstr@vvpart@strwidth]
+% \end{macrocode}
+% from.
+% \begin{macrocode}
+ (\fpeval{(abs(\firbul)-1)*\cmdstr@vvpart@width},
+ \ifnum\firbul>0
+ \fpeval{(\cmdstr@vvpart@floor+1)*\cmdstr@vvpart@height}
+ \else
+ \fpeval{\cmdstr@vvpart@floor*\cmdstr@vvpart@height}
+ \fi
+ )
+% \end{macrocode}
+% bending.
+% \begin{macrocode}
+ to[bend right=\ifnum \fpeval{\firbul*\secbul}>0
+ \fpeval{(\firbul/abs(\firbul))*((abs(\secbul)-abs(\firbul))/
+ abs(abs(\secbul)-abs(\firbul)))*\cmdstr@vvpart@bend}
+ \else
+ 0
+ \fi]
+% \end{macrocode}
+% to.
+% \begin{macrocode}
+ (\fpeval{(abs(\secbul)-1)*\cmdstr@vvpart@width},
+ \ifnum\secbul>0
+ \fpeval{(\cmdstr@vvpart@floor+1)*\cmdstr@vvpart@height}
+ \else
+ \fpeval{\cmdstr@vvpart@floor*\cmdstr@vvpart@height}
+ \fi
+ );
+ }\fi
+ }\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{vpart}{bend}{}
+\define@cmdkey[str]{vpart}{bulla}{}
+\define@cmdkey[str]{vpart}{bullb}{}
+\define@cmdkey[str]{vpart}{bulletends}{}
+\define@cmdkey[str]{vpart}{floor}{}
+\define@cmdkey[str]{vpart}{font}{}
+\define@cmdkey[str]{vpart}{height}{}
+\define@cmdkey[str]{vpart}{labelver}{}
+\define@cmdkey[str]{vpart}{labelhor}{}
+\define@cmdkey[str]{vpart}{norma}{}
+\define@cmdkey[str]{vpart}{normb}{}
+\define@cmdkey[str]{vpart}{nstr}{}
+\define@cmdkey[str]{vpart}{permut}{}
+\define@cmdkey[str]{vpart}{reflect}{}
+\define@cmdkey[str]{vpart}{rotate}{}
+\define@cmdkey[str]{vpart}{scale}{}
+\define@cmdkey[str]{vpart}{strwidth}{}
+\define@cmdkey[str]{vpart}{tkzpic}{}
+\define@cmdkey[str]{vpart}{type}{}
+\define@cmdkey[str]{vpart}{width}{}
+\presetkeys[str]{vpart}{
+ bend=\cmdstr@strands@bend,
+ bulla=1,
+ bullb=1,
+ bulletends=\cmdstr@strands@bulletsize,
+ floor=0,
+ font=\cmdstr@strands@font,
+ height=\cmdstr@strands@height,
+ labelver=\cmdstr@strands@labelver,
+ labelhor=\cmdstr@strands@labelhor,
+ norma=\cmdstr@strands@norma,
+ normb=\cmdstr@strands@normb,
+ nstr=\cmdstr@strands@nstr,
+ permut=0, % use 1 to draw permutations (to use with \permutation).
+ reflect=0,
+ rotate=\cmdstr@strands@rotate,
+ scale=\cmdstr@strands@scale,
+ strwidth=\cmdstr@strands@strwidth,
+ tkzpic=\cmdstr@strands@tkzpic,
+ type=3,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\vpartition}
+% \begin{macrocode}
+\newcommand{\vpartition}[2][]{
+ \setkeys[str]{vpart}{#1} % set variables.
+ \ifthenelse{\equal{\cmdstr@vpart@tkzpic}{1}}{
+ \begin{tikzpicture}[rotate=\cmdstr@vpart@rotate,scale=\cmdstr@vpart@scale]
+ \vvpartition[
+ bend=\cmdstr@vpart@bend,
+ bulla=\cmdstr@vpart@bulla,
+ bullb=\cmdstr@vpart@bullb,
+ bulletends=\cmdstr@vpart@bulletends,
+ floor=\cmdstr@vpart@floor,
+ font=\cmdstr@vpart@font,
+ height=\cmdstr@vpart@height,
+ labelver=\cmdstr@vpart@labelver,
+ labelhor=\cmdstr@vpart@labelhor,
+ norma=\cmdstr@vpart@norma,
+ normb=\cmdstr@vpart@normb,
+ nstr=\cmdstr@vpart@nstr,
+ permut=\cmdstr@vpart@permut,
+ reflect=\cmdstr@vpart@reflect,
+ strwidth=\cmdstr@vpart@strwidth,
+ type=\cmdstr@vpart@type,
+ width=\cmdstr@vpart@width
+ ]{#2}
+ \end{tikzpicture}
+ }{
+ \vvpartition[
+ bend=\cmdstr@vpart@bend,
+ bulla=\cmdstr@vpart@bulla,
+ bullb=\cmdstr@vpart@bullb,
+ bulletends=\cmdstr@vpart@bulletends,
+ floor=\cmdstr@vpart@floor,
+ font=\cmdstr@vpart@font,
+ height=\cmdstr@vpart@height,
+ labelver=\cmdstr@vpart@labelver,
+ labelhor=\cmdstr@vpart@labelhor,
+ norma=\cmdstr@vpart@norma,
+ normb=\cmdstr@vpart@normb,
+ nstr=\cmdstr@vpart@nstr,
+ permut=\cmdstr@vpart@permut,
+ reflect=\cmdstr@vpart@reflect,
+ strwidth=\cmdstr@vpart@strwidth,
+ type=\cmdstr@vpart@type,
+ width=\cmdstr@vpart@width
+ ]{#2}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \arcpartition - macro to draw set partitions via arcs.
+%
+% Example: the set partition {1,4}{2,3,7} of [7] is drawn as follows:
+%
+% \arcpartition[<options>]{{1,4},{2,3,7}}
+%
+% -----------------
+% | |
+% ------------- |
+% | | | |
+% | ----- | |
+% | | | | |
+% 1 2 3 4 5 6 7
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{apart}{bend}{}
+\define@cmdkey[str]{apart}{bull}{}
+\define@cmdkey[str]{apart}{bulletsize}{}
+\define@cmdkey[str]{apart}{floor}{}
+\define@cmdkey[str]{apart}{font}{}
+\define@cmdkey[str]{apart}{labelver}{}
+\define@cmdkey[str]{apart}{labelhor}{}
+\define@cmdkey[str]{apart}{norma}{}
+\define@cmdkey[str]{apart}{normb}{}
+\define@cmdkey[str]{apart}{num}{}
+\define@cmdkey[str]{apart}{rotate}{}
+\define@cmdkey[str]{apart}{scale}{}
+\define@cmdkey[str]{apart}{strwidth}{}
+\define@cmdkey[str]{apart}{tkzpic}{}
+\define@cmdkey[str]{apart}{type}{}
+\define@cmdkey[str]{apart}{width}{}
+\presetkeys[str]{apart}{
+ bend=\cmdstr@strands@bend,
+ bull=1,
+ bulletsize=\cmdstr@strands@bulletsize,
+ floor=0,
+ font=\cmdstr@strands@font,
+ labelver=\cmdstr@strands@labelver,
+ labelhor=\cmdstr@strands@labelhor,
+ norma=\cmdstr@strands@norma,
+ normb=\cmdstr@strands@normb,
+ num=\cmdstr@strands@num,
+ rotate=\cmdstr@strands@rotate,
+ scale=\cmdstr@strands@scale,
+ strwidth=\cmdstr@strands@strwidth,
+ tkzpic=\cmdstr@strands@tkzpic,
+ type=1,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\arcpartition}
+% \begin{macrocode}
+\newcommand{\arcpartition}[2][]{
+ \setkeys[str]{apart}{#1}
+ \vpartition[
+ bend=\cmdstr@apart@bend,
+ bulla=0, % no bullets above.
+ bullb=\cmdstr@apart@bull,
+ bulletends=\cmdstr@apart@bulletsize,
+ floor=\cmdstr@apart@floor,
+ font=\cmdstr@apart@font,
+ labelver=\cmdstr@apart@labelver,
+ labelhor=\cmdstr@apart@labelhor,
+ norma=\cmdstr@apart@norma,
+ normb=\cmdstr@apart@normb,
+ nstr=\cmdstr@apart@num,
+ reflect=1, % put connections below.
+ rotate=\cmdstr@apart@rotate,
+ scale=\cmdstr@apart@scale,
+ strwidth=\cmdstr@apart@strwidth,
+ tkzpic=\cmdstr@apart@tkzpic,
+ type=-\cmdstr@apart@type,
+ width=\cmdstr@apart@width
+ ]{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \permutation - macro to draw permutations by lines.
+%
+% Example: the permutation 2134 of [4] is drawn as follows:
+%
+% \permutation[<options>]{2,1,3,4}
+%
+% 1 2 3 4
+% | | | |
+% - - | |
+% - | |
+% - - | |
+% | | | |
+% 1 2 3 4
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{perm}{bulla}{}
+\define@cmdkey[str]{perm}{bullb}{}
+\define@cmdkey[str]{perm}{bulletends}{}
+\define@cmdkey[str]{perm}{floor}{}
+\define@cmdkey[str]{perm}{font}{}
+\define@cmdkey[str]{perm}{height}{}
+\define@cmdkey[str]{perm}{labelver}{}
+\define@cmdkey[str]{perm}{labelhor}{}
+\define@cmdkey[str]{perm}{norma}{}
+\define@cmdkey[str]{perm}{normb}{}
+\define@cmdkey[str]{perm}{nstr}{}
+\define@cmdkey[str]{perm}{rotate}{}
+\define@cmdkey[str]{perm}{scale}{}
+\define@cmdkey[str]{perm}{strwidth}{}
+\define@cmdkey[str]{perm}{tkzpic}{}
+\define@cmdkey[str]{perm}{type}{}
+\define@cmdkey[str]{perm}{width}{}
+\presetkeys[str]{perm}{
+ bulla=1,
+ bullb=1,
+ bulletends=\cmdstr@strands@bulletsize,
+ floor=0,
+ font=\cmdstr@strands@font,
+ height=\cmdstr@strands@height,
+ labelver=\cmdstr@strands@labelver,
+ labelhor=\cmdstr@strands@labelhor,
+ norma=\cmdstr@strands@norma,
+ normb=\cmdstr@strands@normb,
+ nstr=\cmdstr@strands@nstr,
+ rotate=\cmdstr@strands@rotate,
+ scale=\cmdstr@strands@scale,
+ strwidth=\cmdstr@strands@strwidth,
+ tkzpic=\cmdstr@strands@tkzpic,
+ type=2,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\permutation}
+% \begin{macrocode}
+\newcommand{\permutation}[2][]{
+ \setkeys[str]{perm}{#1}
+ \vpartition[
+ bulla=\cmdstr@perm@bulla,
+ bullb=\cmdstr@perm@bullb,
+ bulletends=\cmdstr@perm@bulletends,
+ floor=\cmdstr@perm@floor,
+ font=\cmdstr@perm@font,
+ height=\cmdstr@perm@height,
+ labelver=\cmdstr@perm@labelver,
+ labelhor=\cmdstr@perm@labelhor,
+ norma=\cmdstr@perm@norma,
+ normb=\cmdstr@perm@normb,
+ nstr=\cmdstr@perm@nstr,
+ permut=1, % permutation.
+ rotate=\cmdstr@perm@rotate,
+ scale=\cmdstr@perm@scale,
+ strwidth=\cmdstr@perm@strwidth,
+ tkzpic=\cmdstr@perm@tkzpic,
+ type=\cmdstr@perm@type,
+ width=\cmdstr@perm@width
+ ]{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \tiedpair - macro to draw a tied permutation as a pair.
+%
+% Example: the permutation ({2,4},2134) of [4] is drawn as follows:
+%
+% \tiedpair[<options>]{{2,4}}{2,1,3,4}
+%
+% 2 4
+% ---------
+% 1 | 3 |
+% | | | |
+% - - | |
+% - | |
+% - - | |
+% | | | |
+% 1 2 3 4
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{tpair}{above}{}
+\define@cmdkey[str]{tpair}{bend}{}
+\define@cmdkey[str]{tpair}{bulla}{}
+\define@cmdkey[str]{tpair}{bullb}{}
+\define@cmdkey[str]{tpair}{bulletends}{}
+\define@cmdkey[str]{tpair}{floor}{}
+\define@cmdkey[str]{tpair}{font}{}
+\define@cmdkey[str]{tpair}{height}{}
+\define@cmdkey[str]{tpair}{labelver}{}
+\define@cmdkey[str]{tpair}{labelhor}{}
+\define@cmdkey[str]{tpair}{norma}{}
+\define@cmdkey[str]{tpair}{normb}{}
+\define@cmdkey[str]{tpair}{nstr}{}
+\define@cmdkey[str]{tpair}{rotate}{}
+\define@cmdkey[str]{tpair}{scale}{}
+\define@cmdkey[str]{tpair}{strwidth}{}
+\define@cmdkey[str]{tpair}{tkzpic}{}
+\define@cmdkey[str]{tpair}{type}{}
+\define@cmdkey[str]{tpair}{width}{}
+\presetkeys[str]{tpair}{
+ above=1,
+ bend=\cmdstr@strands@bend,
+ bulla=1,
+ bullb=1,
+ bulletends=\cmdstr@strands@bulletsize,
+ floor=0,
+ font=\cmdstr@strands@font,
+ height=\cmdstr@strands@height,
+ labelver=\cmdstr@strands@labelver,
+ labelhor=\cmdstr@strands@labelhor,
+ norma=\cmdstr@strands@norma,
+ normb=\cmdstr@strands@normb,
+ nstr=\cmdstr@strands@nstr,
+ rotate=\cmdstr@strands@rotate,
+ scale=\cmdstr@strands@scale,
+ strwidth=\cmdstr@strands@strwidth,
+ tkzpic=\cmdstr@strands@tkzpic,
+ type=-1,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\tiedpair}
+% \begin{macrocode}
+\newcommand{\tiedpair}[3][]{
+ \setkeys[str]{tpair}{#1}
+ \ifthenelse{\equal{\cmdstr@tpair@tkzpic}{1}}{
+ \begin{tikzpicture}[rotate=\cmdstr@tpair@rotate,scale=\cmdstr@tpair@scale]
+ \permutation[
+ bulla=\cmdstr@tpair@bulla,
+ bullb=\cmdstr@tpair@bullb,
+ bulletends=\cmdstr@tpair@bulletends,
+ floor=\cmdstr@tpair@floor,
+ font=\cmdstr@tpair@font,
+ height=\cmdstr@tpair@height,
+ labelver=\cmdstr@tpair@labelver,
+ labelhor=\cmdstr@tpair@labelhor,
+ norma=\cmdstr@tpair@norma,
+ normb=\cmdstr@tpair@normb,
+ nstr=\cmdstr@tpair@nstr,
+ strwidth=\cmdstr@tpair@strwidth,
+ tkzpic=0,
+ type=\cmdstr@tpair@type,
+ width=\cmdstr@tpair@width
+ ]{#2}
+ \arcpartition[
+ bend=\cmdstr@tpair@bend,
+ bull=0, % no bullets.
+ bulletsize=\cmdstr@tpair@bulletsize,
+ floor=\fpeval{\cmdstr@tpair@floor+\cmdstr@tpair@above*\cmdstr@tpair@height},
+ tkzpic=0,
+ type=0, % no labels.
+ strwidth=\cmdstr@tpair@strwidth,
+ width=\cmdstr@tpair@width
+ ]{#3}
+ \end{tikzpicture}
+ }{
+ \permutation[
+ bulla=\cmdstr@tpair@bulla,
+ bullb=\cmdstr@tpair@bullb,
+ bulletends=\cmdstr@tpair@bulletends,
+ floor=\cmdstr@tpair@floor,
+ font=\cmdstr@tpair@font,
+ height=\cmdstr@tpair@height,
+ labelver=\cmdstr@tpair@labelver,
+ labelhor=\cmdstr@tpair@labelhor,
+ norma=\cmdstr@tpair@norma,
+ normb=\cmdstr@tpair@normb,
+ nstr=\cmdstr@tpair@nstr,
+ strwidth=\cmdstr@tpair@strwidth,
+ tkzpic=0,
+ type=\cmdstr@tpair@type,
+ width=\cmdstr@tpair@width
+ ]{#2}
+ \arcpartition[
+ bend=\cmdstr@tpair@bend,
+ bull=0, % no bullets.
+ floor=\fpeval{\cmdstr@tpair@floor+\cmdstr@tpair@above*\cmdstr@tpair@height},
+ tkzpic=0,
+ type=0, % no labels.
+ strwidth=\cmdstr@tpair@strwidth,
+ width=\cmdstr@tpair@width
+ ]{#3}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \tie - macro to draw a tie.
+%
+% \begin{tikzpicture} \tie[height=1.5]{{1,0.8},{3,0.7},{4,0.8}} \end{tikzpicture}
+% \begin{tikzpicture} \tie[height=1.5]{1,2,5} \end{tikzpicture}
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{tie}{bend}{}
+\define@cmdkey[str]{tie}{bull}{}
+\define@cmdkey[str]{tie}{bulletie}{}
+\define@cmdkey[str]{tie}{floor}{}
+\define@cmdkey[str]{tie}{height}{}
+\define@cmdkey[str]{tie}{color}{}
+\define@cmdkey[str]{tie}{snake}{}
+\define@cmdkey[str]{tie}{snakeamp}{}
+\define@cmdkey[str]{tie}{snakends}{}
+\define@cmdkey[str]{tie}{snakelen}{}
+\define@cmdkey[str]{tie}{style}{}
+\define@cmdkey[str]{tie}{tieheight}{}
+\define@cmdkey[str]{tie}{tiewidth}{}
+\define@cmdkey[str]{tie}{width}{}
+\presetkeys[str]{tie}{
+ bend=\cmdstr@strands@tiebend, % bend of the ties.
+ bull=1, % use 1 to use bullets, 0 otherwise.
+ bulletie=\cmdstr@strands@bulletsize,
+ color=\cmdstr@strands@tiecolor, % color of the ties.
+ floor=0, % the picture starts at floor*height.
+ height=\cmdstr@strands@height, % height of the strands.
+ snake=\cmdstr@strands@tiesnake, % true or false to snake the tie line.
+ snakeamp=\cmdstr@strands@tiesnakeamp, % snake amplitude.
+ snakends=\cmdstr@strands@tiesnakends, % snake lengths of ends.
+ snakelen=\cmdstr@strands@tiesnakelen, % snake lengths.
+ style=\cmdstr@strands@tiestyle, % type of the tie (solid, dashed, dotted, etc).
+ tieheight=\cmdstr@strands@tieheight, % height of the tie respect to the global height.
+ tiewidth=\cmdstr@strands@tiewidth, % width of the tie line.
+ width=\cmdstr@strands@width % width between strands.
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\tie}
+% \begin{macrocode}
+\newcommand{\tie}[2][]{
+ \setkeys[str]{tie}{#1}
+ \foreach\elem[count=\ind]in{#2}{
+ \StrRemoveBraces{\elem}[\nobrace]
+ \getelem{\nobrace}{1}{\elemwidth} % get width of elem.
+ \getelem{\nobrace}{2}{\elemheight} % get height of elem.
+ \StrCount{\nobrace}{,}[\elemcoms]
+ \ifnum\elemcoms=0 \renewcommand{\elemheight}{\cmdstr@tie@tieheight}\fi % update height of elem.
+ \ifnum \cmdstr@tie@bull=1
+ \filldraw[\cmdstr@tie@color](\fpeval{(\elemwidth-1)*\cmdstr@tie@width},
+ \fpeval{\elemheight*\cmdstr@tie@height+\cmdstr@tie@floor*\cmdstr@tie@height})
+ circle(\cmdstr@tie@bulletie);
+ \fi
+ \ifnum\ind>1
+ \getelem{#2}{\fpeval{\ind-1}}{\prevelem}
+ \StrRemoveBraces{\prevelem}[\prevnobrace]
+ \getelem{\prevnobrace}{1}{\prevelemwidth}
+ \getelem{\prevnobrace}{2}{\prevelemheight}
+ \StrCount{\prevnobrace}{,}[\prevelemcoms]
+ \ifnum\prevelemcoms=0 \renewcommand{\prevelemheight}{\cmdstr@tie@tieheight}\fi
+ \draw[
+ bend right=\cmdstr@tie@bend,
+ color=\cmdstr@tie@color,
+ line width=\cmdstr@tie@tiewidth,
+ decorate=\cmdstr@tie@snake,
+ decoration={
+ snake,
+ amplitude=\cmdstr@tie@snakeamp,
+ post length=\cmdstr@tie@snakends,
+ pre length=\cmdstr@tie@snakends,
+ segment length=\cmdstr@tie@snakelen
+ },
+ style=\cmdstr@tie@style
+ ]
+ (\fpeval{(\elemwidth-1)*\cmdstr@tie@width},
+ \fpeval{\elemheight*\cmdstr@tie@height+\cmdstr@tie@floor*\cmdstr@tie@height})to
+ (\fpeval{(\prevelemwidth-1)*\cmdstr@tie@width},
+ \fpeval{\prevelemheight*\cmdstr@tie@height+\cmdstr@tie@floor*\cmdstr@tie@height});
+ \fi
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \bbackstrands - macro to draws a trivial two-strands-braid of double strand width.
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{bbackstr}{cdnx}{}
+\define@cmdkey[str]{bbackstr}{cdny}{}
+\define@cmdkey[str]{bbackstr}{color}{}
+\define@cmdkey[str]{bbackstr}{height}{}
+\define@cmdkey[str]{bbackstr}{strwidth}{}
+\define@cmdkey[str]{bbackstr}{timeswidth}{}
+\define@cmdkey[str]{bbackstr}{width}{}
+\presetkeys[str]{bbackstr}{
+ cdnx=nothing,
+ cdny=nothing,
+ height=\cmdstr@strands@height,
+ strwidth=\cmdstr@strands@strwidth,
+ timeswidth=\cmdstr@strands@timeswidth, % times the width of the back line is bigger.
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\bbackstrands}
+% \begin{macrocode}
+\newcommand{\bbackstrands}[1][]{ %
+ \setkeys[str]{bbackstr}{#1}
+ \draw[
+ color=\cmdstr@strands@backcolor,
+ line width=\fpeval{\cmdstr@bbackstr@timeswidth*\cmdstr@bbackstr@strwidth}pt
+ ](\cmdstr@bbackstr@cdnx,\cmdstr@bbackstr@cdny)
+ to(\cmdstr@bbackstr@cdnx,\fpeval{\cmdstr@bbackstr@cdny-\cmdstr@bbackstr@height});
+ \draw[
+ color=\cmdstr@strands@backcolor,
+ line width=\fpeval{\cmdstr@bbackstr@timeswidth*\cmdstr@bbackstr@strwidth}pt
+ ](\fpeval{\cmdstr@bbackstr@cdnx+\cmdstr@bbackstr@width},\cmdstr@bbackstr@cdny)
+ to(\fpeval{\cmdstr@bbackstr@cdnx+\cmdstr@bbackstr@width},
+ \fpeval{\cmdstr@bbackstr@cdny-\cmdstr@bbackstr@height});
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \lleftstrand - macro to draws a strand starting from the left.
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{lleftstr}{bend}{}
+\define@cmdkey[str]{lleftstr}{cdnx}{}
+\define@cmdkey[str]{lleftstr}{cdny}{}
+\define@cmdkey[str]{lleftstr}{color}{}
+\define@cmdkey[str]{lleftstr}{height}{}
+\define@cmdkey[str]{lleftstr}{strwidth}{}
+\define@cmdkey[str]{lleftstr}{width}{}
+\presetkeys[str]{lleftstr}{
+ bend=\cmdstr@strands@bendbraid,
+ cdnx=nothing,
+ cdny=nothing,
+ color=black,
+ height=\cmdstr@strands@height,
+ strwidth=\cmdstr@strands@strwidth,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\lleftstrand}
+% \begin{macrocode}
+\newcommand{\lleftstrand}[1][]{
+ \setkeys[str]{lleftstr}{#1}
+ \draw[
+ color=\cmdstr@lleftstr@color,
+ line width=\cmdstr@lleftstr@strwidth pt
+ ](\cmdstr@lleftstr@cdnx,\fpeval{\cmdstr@lleftstr@cdny+\cmdstr@strands@coverunion})
+ to[bend right=\cmdstr@lleftstr@bend]
+ (\fpeval{\cmdstr@lleftstr@cdnx+\cmdstr@lleftstr@width/2},
+ \fpeval{\cmdstr@lleftstr@cdny-\cmdstr@lleftstr@height/2})
+ to[bend left=\cmdstr@lleftstr@bend]
+ (\fpeval{\cmdstr@lleftstr@cdnx+\cmdstr@lleftstr@width},
+ \fpeval{\cmdstr@lleftstr@cdny-\cmdstr@lleftstr@height-\cmdstr@strands@coverunion});
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \rrightstrand - macro to draw a strand starting from the right.
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{rrightstr}{bend}{}
+\define@cmdkey[str]{rrightstr}{cdnx}{}
+\define@cmdkey[str]{rrightstr}{cdny}{}
+\define@cmdkey[str]{rrightstr}{color}{}
+\define@cmdkey[str]{rrightstr}{floor}{}
+\define@cmdkey[str]{rrightstr}{height}{}
+\define@cmdkey[str]{rrightstr}{strwidth}{}
+\define@cmdkey[str]{rrightstr}{width}{}
+\presetkeys[str]{rrightstr}{
+ bend=\cmdstr@strands@bendbraid,
+ cdnx=nothing,
+ cdny=nothing,
+ color=black,
+ floor=0,
+ height=\cmdstr@strands@height,
+ strwidth=\cmdstr@strands@strwidth,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\rrightstrand}
+% \begin{macrocode}
+\newcommand{\rrightstrand}[1][]{ % color / init-x-coordinate / init-y-coordinate.
+ \setkeys[str]{rrightstr}{#1}
+ \draw[
+ color=\cmdstr@rrightstr@color,
+ line width=\cmdstr@rrightstr@strwidth pt
+ ](\fpeval{\cmdstr@rrightstr@cdnx+\cmdstr@rrightstr@width},
+ \fpeval{\cmdstr@rrightstr@cdny+\cmdstr@strands@coverunion})
+ to[bend left=\cmdstr@rrightstr@bend]
+ (\fpeval{\cmdstr@rrightstr@cdnx+\cmdstr@rrightstr@width/2},
+ \fpeval{\cmdstr@rrightstr@cdny-\cmdstr@rrightstr@height/2})
+ to[bend right=\cmdstr@rrightstr@bend]
+ (\cmdstr@rrightstr@cdnx,
+ \fpeval{\cmdstr@rrightstr@cdny-\cmdstr@rrightstr@height-\cmdstr@strands@coverunion});
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \ccrossback - macro to draw a \backcolor filled circle to create an over-under / under-over crossing.
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{ccrossback}{cdnx}{}
+\define@cmdkey[str]{ccrossback}{cdny}{}
+\define@cmdkey[str]{ccrossback}{height}{}
+\define@cmdkey[str]{ccrossback}{width}{}
+\presetkeys[str]{ccrossback}{
+ cdnx=nothing,
+ cdny=nothing,
+ height=\cmdstr@strands@height,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\ccrossback}
+% \begin{macrocode}
+\newcommand{\ccrossback}[1][]{
+ \setkeys[str]{ccrossback}{#1}
+ \filldraw[\cmdstr@strands@backcolor]
+ (\fpeval{\cmdstr@ccrossback@cdnx+\cmdstr@ccrossback@width/2},
+ \fpeval{\cmdstr@ccrossback@cdny-\cmdstr@ccrossback@height/2})
+ circle(\cmdstr@strands@braidcross pt);
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \bbraidgen - macro to draw a braid crossing (classic, virtual or singular).
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{bbraidgen}{bend}{}
+\define@cmdkey[str]{bbraidgen}{cdnx}{}
+\define@cmdkey[str]{bbraidgen}{cdny}{}
+\define@cmdkey[str]{bbraidgen}{colorleft}{}
+\define@cmdkey[str]{bbraidgen}{coloright}{}
+\define@cmdkey[str]{bbraidgen}{colorsingular}{}
+\define@cmdkey[str]{bbraidgen}{colorvirtual}{}
+\define@cmdkey[str]{bbraidgen}{height}{}
+\define@cmdkey[str]{bbraidgen}{strwidth}{}
+\define@cmdkey[str]{bbraidgen}{type}{}
+\define@cmdkey[str]{bbraidgen}{width}{}
+\presetkeys[str]{bbraidgen}{
+ bend=\cmdstr@strands@bendbraid,
+ cdnx=0,
+ cdny=0,
+ colorleft=black,
+ coloright=black,
+ colorsingular=black,
+ colorvirtual=black,
+ height=\cmdstr@strands@height,
+ strwidth=\cmdstr@strands@strwidth,
+ type=1, % negative-braid=-1 | positive-braid=1 | virtual-braid=2 | singular-braid=3
+ width=\cmdstr@strands@width
+}{}
+\tikzset{
+ cross/.style={ % node style to draw x--crosses inside nodes.
+ path picture={
+ \draw[black]
+ (path picture bounding box.south east)--
+ (path picture bounding box.north west)
+ (path picture bounding box.south west)--
+ (path picture bounding box.north east);
+ }
+ }
+}
+% \end{macrocode}
+%
+% \begin{macro}{\bbraidgen}
+% \begin{macrocode}
+\newcommand{\bbraidgen}[1][]{
+ \setkeys[str]{bbraidgen}{#1}
+ \bbackstrands[ % trivial two-strands-braid.
+ cdnx=\cmdstr@bbraidgen@cdnx,
+ cdny=\cmdstr@bbraidgen@cdny,
+ height=\cmdstr@bbraidgen@height,
+ strwidth=\cmdstr@bbraidgen@strwidth,
+ width=\cmdstr@bbraidgen@width
+ ]
+ \ifnum\cmdstr@bbraidgen@type<1 % negative generator.
+ \rrightstrand[
+ bend=\cmdstr@bbraidgen@bend,
+ cdnx=\cmdstr@bbraidgen@cdnx,
+ cdny=\cmdstr@bbraidgen@cdny,
+ color=\cmdstr@bbraidgen@coloright,
+ height=\cmdstr@bbraidgen@height,
+ strwidth=\cmdstr@bbraidgen@strwidth,
+ width=\cmdstr@bbraidgen@width
+ ]
+ \ifnum\cmdstr@bbraidgen@type<2
+ \ccrossback[
+ cdnx=\cmdstr@bbraidgen@cdnx,
+ cdny=\cmdstr@bbraidgen@cdny,
+ height=\cmdstr@bbraidgen@height,
+ width=\cmdstr@bbraidgen@width
+ ]
+ \fi
+ \lleftstrand[
+ bend=\cmdstr@bbraidgen@bend,
+ cdnx=\cmdstr@bbraidgen@cdnx,
+ cdny=\cmdstr@bbraidgen@cdny,
+ color=\cmdstr@bbraidgen@colorleft,
+ height=\cmdstr@bbraidgen@height,
+ strwidth=\cmdstr@bbraidgen@strwidth,
+ width=\cmdstr@bbraidgen@width
+ ]
+ \else % positive generator.
+ \lleftstrand[
+ bend=\cmdstr@bbraidgen@bend,
+ cdnx=\cmdstr@bbraidgen@cdnx,
+ cdny=\cmdstr@bbraidgen@cdny,
+ color=\cmdstr@bbraidgen@colorleft,
+ height=\cmdstr@bbraidgen@height,
+ strwidth=\cmdstr@bbraidgen@strwidth,
+ width=\cmdstr@bbraidgen@width
+ ]
+ \ifnum\cmdstr@bbraidgen@type<2 % over-under circle only if type is one.
+ \ccrossback[
+ cdnx=\cmdstr@bbraidgen@cdnx,
+ cdny=\cmdstr@bbraidgen@cdny,
+ height=\cmdstr@bbraidgen@height,
+ width=\cmdstr@bbraidgen@width
+ ]
+ \fi
+ \rrightstrand[
+ bend=\cmdstr@bbraidgen@bend,
+ cdnx=\cmdstr@bbraidgen@cdnx,
+ cdny=\cmdstr@bbraidgen@cdny,
+ color=\cmdstr@bbraidgen@coloright,
+ height=\cmdstr@bbraidgen@height,
+ strwidth=\cmdstr@bbraidgen@strwidth,
+ width=\cmdstr@bbraidgen@width
+ ]
+ \ifnum\cmdstr@bbraidgen@type=2 % virtual crossing.
+ \node[
+ circle,
+ cross,
+ draw=\cmdstr@bbraidgen@colorvirtual,
+ fill=\cmdstr@strands@backcolor,
+ inner sep=0,
+ line width=\cmdstr@bbraidgen@strwidth,
+ minimum width=\cmdstr@strands@braidvirtcross
+ ]
+ at(\fpeval{\cmdstr@bbraidgen@cdnx+\cmdstr@bbraidgen@width/2},
+ \fpeval{\cmdstr@bbraidgen@cdny-\cmdstr@bbraidgen@height/2}){};
+ \fi
+ \ifnum\cmdstr@bbraidgen@type=3 % singular crossing.
+ \filldraw[\cmdstr@bbraidgen@colorsingular]
+ (\fpeval{\cmdstr@bbraidgen@cdnx+\cmdstr@bbraidgen@width/2},
+ \fpeval{\cmdstr@bbraidgen@cdny-\cmdstr@bbraidgen@height/2})
+ circle(\cmdstr@strands@braidsingcross pt);
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \ttanglegen - macro to draw a tangle generator.
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{ttanglegen}{bend}{}
+\define@cmdkey[str]{ttanglegen}{cdnx}{}
+\define@cmdkey[str]{ttanglegen}{cdny}{}
+\define@cmdkey[str]{ttanglegen}{color}{}
+\define@cmdkey[str]{ttanglegen}{height}{}
+\define@cmdkey[str]{ttanglegen}{strwidth}{}
+\define@cmdkey[str]{ttanglegen}{tiecolor}{}
+\define@cmdkey[str]{ttanglegen}{tied}{}
+\define@cmdkey[str]{ttanglegen}{tiesnake}{}
+\define@cmdkey[str]{ttanglegen}{tiesnakeamp}{}
+\define@cmdkey[str]{ttanglegen}{tiesnakelen}{}
+\define@cmdkey[str]{ttanglegen}{tiesnakends}{}
+\define@cmdkey[str]{ttanglegen}{tiestyle}{}
+\define@cmdkey[str]{ttanglegen}{tiewidth}{}
+\define@cmdkey[str]{ttanglegen}{width}{}
+\presetkeys[str]{ttanglegen}{
+ bend=\cmdstr@strands@bendtangle,
+ cdnx=0,
+ cdny=0,
+ color=black,
+ height=\cmdstr@strands@height,
+ strwidth=\cmdstr@strands@strwidth,
+ tiecolor=\cmdstr@strands@tiecolor,
+ tied=0,
+ tiesnake=\cmdstr@strands@tiesnake,
+ tiesnakeamp=\cmdstr@strands@tiesnakeamp,
+ tiesnakelen=\cmdstr@strands@tiesnakelen,
+ tiesnakends=\cmdstr@strands@tiesnakends,
+ tiestyle=\cmdstr@strands@tiestyle,
+ tiewidth=\cmdstr@strands@tiewidth,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\ttanglegen}
+% \begin{macrocode}
+\newcommand{\ttanglegen}[1][]{
+ \setkeys[str]{ttanglegen}{#1}
+ \bbackstrands[ % trivial two-strands-braid.
+ cdnx=\cmdstr@ttanglegen@cdnx,
+ cdny=\cmdstr@ttanglegen@cdny,
+ height=\cmdstr@ttanglegen@height,
+ strwidth=\cmdstr@ttanglegen@strwidth,
+ width=\cmdstr@ttanglegen@width
+ ]
+ \draw[
+ bend right=\cmdstr@strands@bendtangle,
+ color=\cmdstr@ttanglegen@color,
+ line width=\cmdstr@strands@strwidth
+ ](\cmdstr@ttanglegen@cdnx,\fpeval{\cmdstr@ttanglegen@cdny+\cmdstr@strands@coverunion})
+ to(\fpeval{\cmdstr@ttanglegen@cdnx+\cmdstr@ttanglegen@width/2},
+ \fpeval{\cmdstr@ttanglegen@cdny-\cmdstr@ttanglegen@height/3+0.03})
+ to(\fpeval{\cmdstr@ttanglegen@cdnx+\cmdstr@ttanglegen@width},
+ \fpeval{\cmdstr@ttanglegen@cdny+\cmdstr@strands@coverunion});
+ \draw[
+ bend left=\cmdstr@strands@bendtangle,
+ color=\cmdstr@ttanglegen@color,
+ line width=\cmdstr@strands@strwidth
+ ](\cmdstr@ttanglegen@cdnx,
+ \fpeval{\cmdstr@ttanglegen@cdny-\cmdstr@ttanglegen@height-\cmdstr@strands@coverunion})
+ to(\fpeval{\cmdstr@ttanglegen@cdnx+\cmdstr@ttanglegen@width/2},
+ \fpeval{\cmdstr@ttanglegen@cdny-(2*\cmdstr@ttanglegen@height)/3-0.03})
+ to(\fpeval{\cmdstr@ttanglegen@cdnx+\cmdstr@ttanglegen@width},
+ \fpeval{\cmdstr@ttanglegen@cdny-\cmdstr@ttanglegen@height-\cmdstr@strands@coverunion});
+ \ifnum\cmdstr@ttanglegen@tied=1 % tied version.
+ \draw[
+ color=\cmdstr@ttanglegen@tiecolor,
+ line width=\cmdstr@ttanglegen@tiewidth,
+ decorate=\cmdstr@ttanglegen@tiesnake,
+ decoration={
+ snake,
+ amplitude=\cmdstr@ttanglegen@tiesnakeamp,
+ post length=\cmdstr@ttanglegen@tiesnakends,
+ pre length=\cmdstr@ttanglegen@tiesnakends,
+ segment length=\cmdstr@ttanglegen@tiesnakelen
+ },
+ style=\cmdstr@ttanglegen@tiestyle
+ ](\fpeval{\cmdstr@ttanglegen@cdnx+\cmdstr@ttanglegen@width/2},
+ \fpeval{\cmdstr@ttanglegen@cdny-\cmdstr@ttanglegen@height/3+0.03})
+ to(\fpeval{\cmdstr@ttanglegen@cdnx+\cmdstr@ttanglegen@width/2},
+ \fpeval{\cmdstr@ttanglegen@cdny-(2*\cmdstr@ttanglegen@height)/3-0.03});
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \aaddgen - macro to add a generator on a strand level.
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{aaddgen}{bendbraid}{}
+\define@cmdkey[str]{aaddgen}{bendtangle}{}
+\define@cmdkey[str]{aaddgen}{direction}{}
+\define@cmdkey[str]{aaddgen}{floor}{}
+\define@cmdkey[str]{aaddgen}{generator}{}
+\define@cmdkey[str]{aaddgen}{height}{}
+\define@cmdkey[str]{aaddgen}{level}{}
+\define@cmdkey[str]{aaddgen}{numlevs}{}
+\define@cmdkey[str]{aaddgen}{posx}{}
+\define@cmdkey[str]{aaddgen}{posy}{}
+\define@cmdkey[str]{aaddgen}{strwidth}{}
+\define@cmdkey[str]{aaddgen}{tiebull}{}
+\define@cmdkey[str]{aaddgen}{tiebullsize}{}
+\define@cmdkey[str]{aaddgen}{tiecolor}{}
+\define@cmdkey[str]{aaddgen}{tieheight}{}
+\define@cmdkey[str]{aaddgen}{tiesnake}{}
+\define@cmdkey[str]{aaddgen}{tiesnakeamp}{}
+\define@cmdkey[str]{aaddgen}{tiesnakends}{}
+\define@cmdkey[str]{aaddgen}{tiesnakelen}{}
+\define@cmdkey[str]{aaddgen}{tiestyle}{}
+\define@cmdkey[str]{aaddgen}{tiewidth}{}
+\define@cmdkey[str]{aaddgen}{width}{}
+\presetkeys[str]{aaddgen}{
+ bendbraid=\cmdstr@strands@bendbraid,
+ bendtangle=\cmdstr@strands@bendtangle,
+ direction=\cmdstr@strands@direction,
+ floor=0,
+ generator=s1,
+ height=\cmdstr@strands@height,
+ level=0,
+ numlevs=0,
+ posx=nothing, % internal.
+ posy=nothing, % internal.
+ strwidth=\cmdstr@strands@strwidth,
+ tiebull=\cmdstr@strands@tiebull,
+ tiebullsize=\cmdstr@strands@tiebullsize,
+ tiecolor=\cmdstr@strands@tiecolor,
+ tieheight=\cmdstr@strands@tieheight,
+ tiesnake=\cmdstr@strands@tiesnake,
+ tiesnakeamp=\cmdstr@strands@tiesnakeamp,
+ tiesnakends=\cmdstr@strands@tiesnakends,
+ tiesnakelen=\cmdstr@strands@tiesnakelen,
+ tiestyle=\cmdstr@strands@tiestyle,
+ tiewidth=\cmdstr@strands@tiewidth,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\aaddgen}
+% \begin{macrocode}
+\newcommand{\aaddgen}[1][]{
+ \setkeys[str]{aaddgen}{#1}
+ \StrChar{\cmdstr@aaddgen@generator}{1}[\firstchar]
+ \StrBehind{\cmdstr@aaddgen@generator}{\firstchar}[\numstrand]
+ \renewcommand{\cmdstr@aaddgen@posx}{\fpeval{(\numstrand-1)*\cmdstr@aaddgen@width}}
+ \ifnum\cmdstr@aaddgen@direction=1
+ \renewcommand{\cmdstr@aaddgen@posy}{\fpeval{(\cmdstr@aaddgen@numlevs+2+\cmdstr@aaddgen@floor-\cmdstr@aaddgen@level)*\cmdstr@aaddgen@height}}
+ \fi
+ \ifnum\cmdstr@aaddgen@direction=0
+ \renewcommand{\cmdstr@aaddgen@posy}{\fpeval{\cmdstr@aaddgen@level*\cmdstr@aaddgen@height}}
+ \fi
+ \ifthenelse{\equal{\firstchar}{\cmdstr@strands@gencharnegbraid}}{
+ \bbraidgen[
+ bend=\cmdstr@aaddgen@bendbraid,
+ cdnx=\cmdstr@aaddgen@posx,
+ cdny=\cmdstr@aaddgen@posy,
+ height=\cmdstr@aaddgen@height,
+ strwidth=\cmdstr@aaddgen@strwidth,
+ type=-1,
+ width=\cmdstr@aaddgen@width
+ ]
+ }{\ifthenelse{\equal{\firstchar}{\cmdstr@strands@gencharposbraid}}{
+ \bbraidgen[
+ bend=\cmdstr@aaddgen@bendbraid,
+ cdnx=\cmdstr@aaddgen@posx,
+ cdny=\cmdstr@aaddgen@posy,
+ height=\cmdstr@aaddgen@height,
+ strwidth=\cmdstr@aaddgen@strwidth,
+ type=1,
+ width=\cmdstr@aaddgen@width
+ ]
+ }{\ifthenelse{\equal{\firstchar}{\cmdstr@strands@gencharvirtual}}{
+ \bbraidgen[
+ bend=\cmdstr@aaddgen@bendbraid,
+ cdnx=\cmdstr@aaddgen@posx,
+ cdny=\cmdstr@aaddgen@posy,
+ height=\cmdstr@aaddgen@height,
+ strwidth=\cmdstr@aaddgen@strwidth,
+ type=2,
+ width=\cmdstr@aaddgen@width
+ ]
+ }{\ifthenelse{\equal{\firstchar}{\cmdstr@strands@gencharsingular}}{
+ \bbraidgen[
+ bend=\cmdstr@aaddgen@bendbraid,
+ cdnx=\cmdstr@aaddgen@posx,
+ cdny=\cmdstr@aaddgen@posy,
+ height=\cmdstr@aaddgen@height,
+ strwidth=\cmdstr@aaddgen@strwidth,
+ type=3,
+ width=\cmdstr@aaddgen@width
+ ]
+ }{\ifthenelse{\equal{\firstchar}{\cmdstr@strands@genchartangle}}{
+ \ttanglegen[
+ bend=\cmdstr@aaddgen@bendtangle,
+ cdnx=\cmdstr@aaddgen@posx,
+ cdny=\cmdstr@aaddgen@posy,
+ height=\cmdstr@aaddgen@height,
+ strwidth=\cmdstr@aaddgen@strwidth,
+ tied=0,
+ width=\cmdstr@aaddgen@width
+ ]
+ }{\ifthenelse{\equal{\firstchar}{\cmdstr@strands@genchartie}}{
+ \tie[
+ bull=\cmdstr@aaddgen@tiebull,
+ bulletie=\cmdstr@aaddgen@tiebullsize, %%%%%%%%%%%%%%%%%%%%%
+ color=\cmdstr@aaddgen@tiecolor,
+ height=\cmdstr@aaddgen@height,
+ floor=\fpeval{\cmdstr@aaddgen@posy-1},
+ snake=\cmdstr@aaddgen@tiesnake,
+ snakeamp=\cmdstr@aaddgen@tiesnakeamp,
+ snakelen=\cmdstr@aaddgen@tiesnakelen,
+ snakends=\cmdstr@aaddgen@tiesnakends,
+ style=\cmdstr@aaddgen@tiestyle,
+ tieheight=\cmdstr@aaddgen@tieheight,
+ tiewidth=\cmdstr@aaddgen@tiewidth,
+ width=\cmdstr@aaddgen@width
+ ]{\numstrand,\fpeval{\numstrand+1}}
+ }{\ifthenelse{\equal{\firstchar}{\cmdstr@strands@genchartiedtangle}}{
+ \ttanglegen[
+ bend=\cmdstr@aaddgen@bendtangle,
+ cdnx=\cmdstr@aaddgen@posx,
+ cdny=\cmdstr@aaddgen@posy,
+ height=\cmdstr@aaddgen@height,
+ strwidth=\cmdstr@aaddgen@strwidth,
+ tiecolor=\cmdstr@aaddgen@tiecolor,
+ tied=1,
+ tiesnake=\cmdstr@aaddgen@tiesnake,
+ tiesnakeamp=\cmdstr@aaddgen@tiesnakeamp,
+ tiesnakelen=\cmdstr@aaddgen@tiesnakelen,
+ tiesnakends=\cmdstr@aaddgen@tiesnakends,
+ tiestyle=\cmdstr@aaddgen@tiestyle,
+ tiewidth=\cmdstr@aaddgen@tiewidth,
+ width=\cmdstr@aaddgen@width
+ ]
+ }{DO NOTHING!}}}}}}} % \ifthenelse always use "else", so it will do nothing if other letter.
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \strands - macro to draw braid-like element via generators (with tikz environment).
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{ggens}{bendbraid}{}
+\define@cmdkey[str]{ggens}{bendtangle}{}
+\define@cmdkey[str]{ggens}{bulla}{}
+\define@cmdkey[str]{ggens}{bullb}{}
+\define@cmdkey[str]{ggens}{bulletends}{}
+\define@cmdkey[str]{ggens}{direction}{}
+\define@cmdkey[str]{ggens}{floor}{}
+\define@cmdkey[str]{ggens}{font}{}
+\define@cmdkey[str]{ggens}{height}{}
+\define@cmdkey[str]{ggens}{labelver}{}
+\define@cmdkey[str]{ggens}{labelhor}{}
+\define@cmdkey[str]{ggens}{nstr}{}
+\define@cmdkey[str]{ggens}{nstrsave}{}
+\define@cmdkey[str]{ggens}{strwidth}{}
+\define@cmdkey[str]{ggens}{tiebull}{}
+\define@cmdkey[str]{ggens}{tiebullsize}{}
+\define@cmdkey[str]{ggens}{tiecolor}{}
+\define@cmdkey[str]{ggens}{tieheight}{}
+\define@cmdkey[str]{ggens}{tiesnake}{}
+\define@cmdkey[str]{ggens}{tiesnakeamp}{}
+\define@cmdkey[str]{ggens}{tiesnakends}{}
+\define@cmdkey[str]{ggens}{tiesnakelen}{}
+\define@cmdkey[str]{ggens}{tiestyle}{}
+\define@cmdkey[str]{ggens}{tiewidth}{}
+\define@cmdkey[str]{ggens}{type}{}
+\define@cmdkey[str]{ggens}{width}{}
+\presetkeys[str]{ggens}{
+ bendbraid=\cmdstr@strands@bendbraid,
+ bendtangle=\cmdstr@strands@bendtangle,
+ bulla=1,
+ bullb=1,
+ bulletends=\cmdstr@strands@bulletsize,
+ direction=\cmdstr@strands@direction,
+ floor=0,
+ font=\cmdstr@strands@font,
+ height=\cmdstr@strands@height,
+ labelver=\cmdstr@strands@labelver,
+ labelhor=\cmdstr@strands@labelhor,
+ nstr=0,
+ nstrsave=0,
+ strwidth=\cmdstr@strands@strwidth,
+ tiebull=\cmdstr@strands@tiebull,
+ tiebullsize=\cmdstr@strands@tiebullsize,
+ tiecolor=\cmdstr@strands@tiecolor,
+ tieheight=\cmdstr@strands@tieheight,
+ tiesnake=\cmdstr@strands@tiesnake,
+ tiesnakeamp=\cmdstr@strands@tiesnakeamp,
+ tiesnakends=\cmdstr@strands@tiesnakends,
+ tiesnakelen=\cmdstr@strands@tiesnakelen,
+ tiestyle=\cmdstr@strands@tiestyle,
+ tiewidth=\cmdstr@strands@tiewidth,
+ type=3,
+ width=\cmdstr@strands@width
+}{}
+\newcounter{levelscounter} % count levels.
+% \end{macrocode}
+%
+% \begin{macro}{\sstrands}
+% \begin{macrocode}
+\newcommand{\sstrands}[2][]{
+ \setkeys[str]{ggens}{#1}
+% \end{macrocode}
+% number of strands.
+% \begin{macrocode}
+ \StrSubstitute{#2}{ }{}[\cmdstr@ggens@nstrsave] % remove whitespaces.
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{\cmdstr@strands@gencharposbraid}{}[\cmdstr@ggens@nstrsave]
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{\cmdstr@strands@gencharnegbraid}{}[\cmdstr@ggens@nstrsave]
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{\cmdstr@strands@gencharvirtual}{}[\cmdstr@ggens@nstrsave]
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{\cmdstr@strands@gencharsingular}{}[\cmdstr@ggens@nstrsave]
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{\cmdstr@strands@genchartangle}{}[\cmdstr@ggens@nstrsave]
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{\cmdstr@strands@genchartie}{}[\cmdstr@ggens@nstrsave]
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{\cmdstr@strands@genchartiedtangle}{}[\cmdstr@ggens@nstrsave]
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{\cmdstr@strands@genchartrivial}{}[\cmdstr@ggens@nstrsave]
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{*}{,}[\cmdstr@ggens@nstrsave]
+ \StrSubstitute{\cmdstr@ggens@nstrsave}{-}{,}[\cmdstr@ggens@nstrsave]
+ \let\oldnstr\cmdstr@ggens@nstr
+ \renewcommand{\cmdstr@ggens@nstr}{\fpeval{max(max(\cmdstr@ggens@nstrsave)+1,\oldnstr)}}
+% \end{macrocode}
+% backstrands.
+% \begin{macrocode}
+ \StrCount{#2}{*}[\numlevs]
+ \permutation[ % backstrands.
+ bulla=0,
+ bullb=0,
+ floor=\fpeval{\cmdstr@ggens@floor/((\numlevs+1)*\cmdstr@ggens@height)}, % ??????????????
+ height=\fpeval{(\numlevs+1)*\cmdstr@ggens@height},
+ nstr=\cmdstr@ggens@nstr,
+ tkzpic=0,
+ type=0
+ ]{1}
+% \end{macrocode}
+% generators.
+% \begin{macrocode}
+ \setcounter{levelscounter}{0}
+ \ForEach{*}{ % for each level.
+ \stepcounter{levelscounter}
+ \ForEachSublevel{-}{ % for each generator in level.
+ \aaddgen[ % add the generator.
+ bendbraid=\cmdstr@ggens@bendbraid,
+ bendtangle=\cmdstr@ggens@bendtangle,
+ direction=\cmdstr@ggens@direction,
+ floor=\cmdstr@ggens@floor,
+ generator=\thislevelitem,
+ height=\cmdstr@ggens@height,
+ level=\thelevelscounter,
+ numlevs=\numlevs,
+ strwidth=\cmdstr@ggens@strwidth,
+ tiebull=\cmdstr@ggens@tiebull,
+ tiebullsize=\cmdstr@ggens@tiebullsize,
+ tiecolor=\cmdstr@ggens@tiecolor,
+ tieheight=\cmdstr@ggens@tieheight,
+ tiesnake=\cmdstr@ggens@tiesnake,
+ tiesnakeamp=\cmdstr@ggens@tiesnakeamp,
+ tiesnakends=\cmdstr@ggens@tiesnakends,
+ tiesnakelen=\cmdstr@ggens@tiesnakelen,
+ tiestyle=\cmdstr@ggens@tiestyle,
+ tiewidth=\cmdstr@ggens@tiewidth,
+ width=\cmdstr@ggens@width
+ ]
+ }
+ }{#2}
+ \decoratestrands[
+ bulla=\cmdstr@ggens@bulla,
+ bullb=\cmdstr@ggens@bullb,
+ bulletends=\cmdstr@ggens@bulletends,
+ floor=\fpeval{\cmdstr@ggens@floor/((\numlevs+1)*\cmdstr@ggens@height)},
+ font=\cmdstr@ggens@font,
+ height=\fpeval{(\numlevs+1)*\cmdstr@ggens@height},
+ labelver=\cmdstr@ggens@labelver,
+ labelhor=\cmdstr@ggens@labelhor,
+ nstr=\cmdstr@ggens@nstr,
+ type=\cmdstr@ggens@type,
+ width=\cmdstr@ggens@width
+ ]
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\makeatletter
+\define@cmdkey[str]{gens}{bendbraid}{}
+\define@cmdkey[str]{gens}{bendtangle}{}
+\define@cmdkey[str]{gens}{bulla}{}
+\define@cmdkey[str]{gens}{bullb}{}
+\define@cmdkey[str]{gens}{bulletends}{}
+\define@cmdkey[str]{gens}{direction}{}
+\define@cmdkey[str]{gens}{floor}{}
+\define@cmdkey[str]{gens}{font}{}
+\define@cmdkey[str]{gens}{height}{}
+\define@cmdkey[str]{gens}{labelver}{}
+\define@cmdkey[str]{gens}{labelhor}{}
+\define@cmdkey[str]{gens}{nstr}{}
+\define@cmdkey[str]{gens}{nstrsave}{}
+\define@cmdkey[str]{gens}{rotate}{}
+\define@cmdkey[str]{gens}{scale}{}
+\define@cmdkey[str]{gens}{strwidth}{}
+\define@cmdkey[str]{gens}{tiebull}{}
+\define@cmdkey[str]{gens}{tiebullsize}{}
+\define@cmdkey[str]{gens}{tiecolor}{}
+\define@cmdkey[str]{gens}{tieheight}{}
+\define@cmdkey[str]{gens}{tiesnake}{}
+\define@cmdkey[str]{gens}{tiesnakeamp}{}
+\define@cmdkey[str]{gens}{tiesnakends}{}
+\define@cmdkey[str]{gens}{tiesnakelen}{}
+\define@cmdkey[str]{gens}{tiestyle}{}
+\define@cmdkey[str]{gens}{tiewidth}{}
+\define@cmdkey[str]{gens}{tkzpic}{}
+\define@cmdkey[str]{gens}{type}{}
+\define@cmdkey[str]{gens}{width}{}
+\presetkeys[str]{gens}{
+ bendbraid=\cmdstr@strands@bendbraid,
+ bendtangle=\cmdstr@strands@bendtangle,
+ bulla=1,
+ bullb=1,
+ bulletends=\cmdstr@strands@bulletsize,
+ direction=\cmdstr@strands@direction,
+ floor=0,
+ font=\cmdstr@strands@font,
+ height=\cmdstr@strands@height,
+ labelver=\cmdstr@strands@labelver,
+ labelhor=\cmdstr@strands@labelhor,
+ nstr=0,
+ nstrsave=0,
+ rotate=\cmdstr@strands@rotate,
+ scale=\cmdstr@strands@scale,
+ strwidth=\cmdstr@strands@strwidth,
+ tiebull=\cmdstr@strands@tiebull,
+ tiebullsize=\cmdstr@strands@tiebullsize,
+ tiecolor=\cmdstr@strands@tiecolor,
+ tieheight=\cmdstr@strands@tieheight,
+ tiesnake=\cmdstr@strands@tiesnake,
+ tiesnakeamp=\cmdstr@strands@tiesnakeamp,
+ tiesnakends=\cmdstr@strands@tiesnakends,
+ tiesnakelen=\cmdstr@strands@tiesnakelen,
+ tiestyle=\cmdstr@strands@tiestyle,
+ tiewidth=\cmdstr@strands@tiewidth,
+ tkzpic=\cmdstr@strands@tkzpic,
+ type=3,
+ width=\cmdstr@strands@width
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\strands}
+% \begin{macrocode}
+\newcommand{\strands}[2][]{
+ \setkeys[str]{gens}{#1}
+ \ifthenelse{\equal{\cmdstr@gens@tkzpic}{1}}{
+ \begin{tikzpicture}[rotate=\cmdstr@gens@rotate,scale=\cmdstr@gens@scale]
+ \sstrands[
+ bendbraid=\cmdstr@gens@bendbraid,
+ bendtangle=\cmdstr@gens@bendtangle,
+ bulla=\cmdstr@gens@bulla,
+ bullb=\cmdstr@gens@bullb,
+ bulletends=\cmdstr@gens@bulletends,
+ direction=\cmdstr@gens@direction,
+ floor=\cmdstr@gens@floor,
+ font=\cmdstr@gens@font,
+ height=\cmdstr@gens@height,
+ labelver=\cmdstr@gens@labelver,
+ labelhor=\cmdstr@gens@labelhor,
+ nstr=\cmdstr@gens@nstr,
+ nstrsave=\cmdstr@gens@nstrsave,
+ strwidth=\cmdstr@gens@strwidth,
+ tiebull=\cmdstr@gens@tiebull,
+ tiebullsize=\cmdstr@gens@tiebullsize,
+ tiecolor=\cmdstr@gens@tiecolor,
+ tieheight=\cmdstr@gens@tieheight,
+ tiesnake=\cmdstr@gens@tiesnake,
+ tiesnakeamp=\cmdstr@gens@tiesnakeamp,
+ tiesnakends=\cmdstr@gens@tiesnakends,
+ tiesnakelen=\cmdstr@gens@tiesnakelen,
+ tiestyle=\cmdstr@gens@tiestyle,
+ tiewidth=\cmdstr@gens@tiewidth,
+ type=\cmdstr@gens@type,
+ width=\cmdstr@gens@width
+ ]{#2}
+ \end{tikzpicture}
+ }{
+ \sstrands[
+ bendbraid=\cmdstr@gens@bendbraid,
+ bendtangle=\cmdstr@gens@bendtangle,
+ bulla=\cmdstr@gens@bulla,
+ bullb=\cmdstr@gens@bullb,
+ bulletends=\cmdstr@gens@bulletends,
+ direction=\cmdstr@gens@direction,
+ floor=\cmdstr@gens@floor,
+ font=\cmdstr@gens@font,
+ height=\cmdstr@gens@height,
+ labelver=\cmdstr@gens@labelver,
+ labelhor=\cmdstr@gens@labelhor,
+ nstr=\cmdstr@gens@nstr,
+ nstrsave=\cmdstr@gens@nstrsave,
+ strwidth=\cmdstr@gens@strwidth,
+ tiebull=\cmdstr@gens@tiebull,
+ tiebullsize=\cmdstr@gens@tiebullsize,
+ tiecolor=\cmdstr@gens@tiecolor,
+ tieheight=\cmdstr@gens@tieheight,
+ tiesnake=\cmdstr@gens@tiesnake,
+ tiesnakeamp=\cmdstr@gens@tiesnakeamp,
+ tiesnakends=\cmdstr@gens@tiesnakends,
+ tiesnakelen=\cmdstr@gens@tiesnakelen,
+ tiestyle=\cmdstr@gens@tiestyle,
+ tiewidth=\cmdstr@gens@tiewidth,
+ type=\cmdstr@gens@type,
+ width=\cmdstr@gens@width
+ ]{#2}
+ }
+}% \end{macrocode}
+% \end{macro}
+%
+
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \Finale
+\endinput
diff --git a/graphics/pgf/contrib/strands/strands.ins b/graphics/pgf/contrib/strands/strands.ins
new file mode 100644
index 0000000000..5f38a838ae
--- /dev/null
+++ b/graphics/pgf/contrib/strands/strands.ins
@@ -0,0 +1,57 @@
+%% Copyright (C) 2021 by Diego Arcis <arcisd@gmail.com>
+%% --------------------------------------------------------------------------
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Diego Arcis.
+%%
+%% This work consists of the files strands.dtx and strands.ins
+%% and the derived filebase strands.sty.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/strands}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2021 by Diego Arcis <arcisd@gmail.com>
+--------------------------------------------------------------------------
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3
+of this license or (at your option) any later version.
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+\endpreamble
+
+\generate{\file{strands.sty}{\from{strands.dtx}{package}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* strands.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file strands.dtx *}
+\Msg{* through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
diff --git a/graphics/pgf/contrib/strands/strands.pdf b/graphics/pgf/contrib/strands/strands.pdf
new file mode 100644
index 0000000000..b09fa4ed88
--- /dev/null
+++ b/graphics/pgf/contrib/strands/strands.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/yquant/doc/yquant-doc.pdf b/graphics/pgf/contrib/yquant/doc/yquant-doc.pdf
index 203ef161c9..0a1e1d144a 100644
--- a/graphics/pgf/contrib/yquant/doc/yquant-doc.pdf
+++ b/graphics/pgf/contrib/yquant/doc/yquant-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/yquant/doc/yquant-doc.tex b/graphics/pgf/contrib/yquant/doc/yquant-doc.tex
index 8a9ebc886d..2b2469e463 100644
--- a/graphics/pgf/contrib/yquant/doc/yquant-doc.tex
+++ b/graphics/pgf/contrib/yquant/doc/yquant-doc.tex
@@ -1,3 +1,4 @@
+% !TeX spellcheck = en_US
\documentclass{scrartcl}
\title{yquant.sty package documentation}
@@ -216,7 +217,7 @@
This document outlines the scope and usage of the \Yquant{} package.
It contains both a reference and a huge number of examples.
\Yquant{} is a package that makes typesetting quantum circuits easy; the package is available on CTAN.
- This beta version~0.4 \emph{should} be stable and interfaces are not very likely to change in an incompatible way in the future.
+ This beta version~0.4.1 \emph{should} be stable and interfaces are not very likely to change in an incompatible way in the future.
\compat{New in 0.4}Sometimes, backwards\hyp incompatible changes are required or advisable, in which case a compatibility setting will allow to revert back to the old behavior (rather, to maximize compatibility, this is an opt\hyp in setting: unless you choose the new behavior, you will get the old one).
Please do report all issues and desirable additions on \href{https://github.com/projekter/yquant/issues}{GitHub}.
@@ -1021,6 +1022,7 @@ IndexSingle = ?number? | ( [ ?number? ], "-", [ ?number? ] );
Counters for target registers, positive, and negative controls are all independent.
Finally, you can even access names within a subcircuit, provided you give a name to the subcircuit.
All nodes in the subcircuit will then have the name \texttt{\textit{<subcircuit name>}-\textit{<name specified in the subcircuits>}}.
+ Note that here, \texttt{\textit{<subcircuit name>}} is the \emph{full} name of the subcircuit, which includes the \tex!-\idx! suffix, \compat{New in 0.4.1}unless there is only a single target register.
For nested subcircuits, you will get multiple prefixes.
\subsection{Shapes and the drawing pipeline}
@@ -3410,7 +3412,7 @@ $=$
\subsection*{2020-10-27: Version 0.3.3}
Fix \href{https://github.com/projekter/yquant/issues/6}{\#6}: shorten doesn't work for 2-qubit barriers. This fixes a bug in how the \texttt{shorten} keyword worked on \gate{barrier}s, which may require re\hyp assessing your chosen values.
- \subsection*{2021-02-21: Version 0.4a}
+ \subsection*{2021-02-21: Version 0.4-alpha}
Lots of internal fixes, most notably vertical alignment with subcircuits. \\
Introduce capability to perform vertical alignment with multi\hyp register gates. \\
Dramatic changes under the hood regarding horizontal positioning, which is now only determined in the drawing stage; this paves the way for delayed gates, which are planned for 0.4.
@@ -3427,5 +3429,9 @@ $=$
\subsection*{2021-03-27: Version 0.4}
New gate: \gate{inspect}. Various bug fixes. \\
Introduce the \texttt{direct control} feature: \gate{measure} gates can now substitute positive controls of future gates.
+
+ \subsection*{2021-07-03: Version 0.4.1}
+ Fix \href{https://github.com/projekter/yquant/issues/9}{\#9}: Output bracket misaligned. \\
+ Fix \href{https://github.com/projekter/yquant/issues/10}{\#10}: Unable to access node in subcircuit. As of this version, named nodes in subcircuits will also be properly aliased if there is only a single target subcircuit (so that you don't need to use the \texttt{-0} suffix for the subcircuit's name).
%END_FOLD
\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/yquant/tex/yquant-draw.tex b/graphics/pgf/contrib/yquant/tex/yquant-draw.tex
index 1bf8d3fb19..7527e1ea05 100644
--- a/graphics/pgf/contrib/yquant/tex/yquant-draw.tex
+++ b/graphics/pgf/contrib/yquant/tex/yquant-draw.tex
@@ -404,7 +404,7 @@
\noexpand\path (\yquant@circuit@endwires@x, \the\dimexpr.5\dimexpr%
\yquant@draw@multiinit@@min+\yquant@draw@multiinit@@max\relax%
\relax)%
- node[\ifnum\yquant@compat>1 /yquant/every operator, /yquant/every output,\fi%
+ node[\ifnum\yquant@compat>1 /yquant/every operator,\fi /yquant/every output,%
\yquant@draw@@style,%
\ifnum\yquant@compat<2 /yquant/every multi output,\fi%
/yquant/this operator,%
@@ -413,7 +413,7 @@
{\unexpanded\expandafter{\yquant@draw@@content}};%
\ifdefined\yquant@parent%
\pgfshapeclippath{yquantbox}%
- {\ifnum\yquant@compat>1 /yquant/every operator, /yquant/every output,\fi%
+ {\ifnum\yquant@compat>1 /yquant/every operator,\fi /yquant/every output,%
\yquant@draw@@style,
\ifnum\yquant@compat<2 /yquant/every multi output,\fi%
/yquant/this operator}%
@@ -441,9 +441,10 @@
% #1: id of subcircuit
% #2: name
-% #3: {width of subcircuit (excluding outer box)}{including outer box}{left margin}
-% #4: affected wires
-\protected\long\def\yquant@draw@subcircuit@prepare#1#2#3#4{%
+% #3: 1 if aliasing of the name should be done (remove -0), 0 else
+% #4: {width of subcircuit (excluding outer box)}{including outer box}{left margin}
+% #5: affected wires
+\protected\long\def\yquant@draw@subcircuit@prepare#1#2#3#4#5{%
\let\idx=\yquant@draw@@idx@content%
% In order to wrap the inner circuit in a proper box operator and clip outer paths appropriately (which was not possible yet, as we didn't know the exact vertical positions), we first place it within a box.
% First, we anticipate the macro that is used by our subcircuit to store the node
@@ -458,19 +459,19 @@
\pgf@picminy=16000pt %
\pgf@size@hookedfalse%
\let\pgf@path@size@hook=\pgfutil@empty%
- % now we must take care of extending all the wires appropriately until the beginning of the box. #3 contains width of this box, #4 contains registers affected by this box. Note that for subcircuits, x extension by the group is disabled.
+ % now we must take care of extending all the wires appropriately until the beginning of the box. #4 contains width of this box, #5 contains registers affected by this box. Note that for subcircuits, x extension by the group is disabled.
\dimdef\newx{%
- \yquant@draw@@x-.5\dimexpr\@secondofthree#3\relax%
+ \yquant@draw@@x-.5\dimexpr\@secondofthree#4\relax%
}%
\dimen0=\newx%
\let\yquant@draw@subcircuit@leftpos=\newx% seamless subcircuits: do not add another separation if we are there
\let\pgfshapeclippathhorzresult=\empty%
- \forlistloop\yquant@draw@move@loop{#4}%
+ \forlistloop\yquant@draw@move@loop{#5}%
% but the new positions are not at the beginning of the box, but inside (with possible margin)
\dimdef\newx{%
- \yquant@draw@@x-.5\dimexpr\@firstofthree#3\relax-\@thirdofthree#3%
+ \yquant@draw@@x-.5\dimexpr\@firstofthree#4\relax-\@thirdofthree#4%
}%
- \forlistloop\yquant@draw@group@advance{#4}%
+ \forlistloop\yquant@draw@group@advance{#5}%
\setbox\yquant@prepare@subcircuit@box=\hbox{{%
\let\yquant@draw@subcircuit@wirestart=\newx%
\let\yquant@parent=\yquant@prefix%
@@ -481,6 +482,9 @@
\let\pgf@nodecallback=\yquant@draw@subcircuit@nodecallback%
}{%
\pgfkeys{/tikz/name prefix/.expanded={\pgfkeysvalueof{/tikz/name prefix}#2-}}%
+ \ifnum#3=1 %
+ \let\pgf@nodecallback=\yquant@draw@subcircuit@nodecallback%
+ \fi%
}%
\pgfkeys{/yquant/operators/this subcircuit box/.style={}}%
\edef\yquant@draw@subcircuit@style{%
@@ -497,6 +501,17 @@
\ifdim\dimen0<\pgf@picminy %
\global\pgf@picminy=\dimen0 %
\fi%
+ \ifnum#3=1 %
+ % we must apply the aliasing to all the included nodes. We do this in this group, which still has the callback available, so that the aliased nodes will also be added to the list and can propagate (note that the number of node names is then exponential in the number of nested subcircuits)
+ \protected\def\yquant@draw@subcircuit@alias@do##1#2-##2\relax##3\relax{%
+ \ifstrempty{##1}{%
+ \pgfnodealias{\yquant@draw@subcircuit@alias@removezero#2-##2}{#2-##2}%
+ \@gobble% there is an additional \relax
+ }\relax%
+ }%
+ \forlistcsloop%
+ {\yquant@draw@subcircuit@alias{#2}}\yquant@draw@subcircuit@nodelist%
+ \fi%
}}%
\edef\cmd{%
\noexpand\path (\yquant@draw@@x, \the\dimexpr.5\pgf@picminy+.5\pgf@picmaxy\relax)%
@@ -505,10 +520,10 @@
/yquant/operators/this subcircuit box,%
/yquant/internal/multi main=true,%
name prefix=, name suffix=, name=yquantbox]%
- {\vbox to \the\dimexpr\pgf@picmaxy-\pgf@picminy\relax {\hbox to \@firstofthree#3 {}}};%
+ {\vbox to \the\dimexpr\pgf@picmaxy-\pgf@picminy\relax {\hbox to \@firstofthree#4 {}}};%
}%
\cmd%
- \unhbox\yquant@prepare@subcircuit@box
+ \unhbox\yquant@prepare@subcircuit@box%
% \endpgfinterruptboundingbox + increase
\ifdim\pgf@interrupt@savemaxy>\pgf@picmaxy%
\global\pgf@picmaxy=\pgf@interrupt@savemaxy%
@@ -519,7 +534,7 @@
\endgroup%
% Now that the subcircuit is finished, we need advance all the wires
\dimdef\newx{\yquant@draw@@x+.5\dimexpr\yquant@draw@@width\relax}%
- \forlistloop\yquant@draw@group@advance{#4}%
+ \forlistloop\yquant@draw@group@advance{#5}%
\ifstrempty{#2}{%
% However, if the outer node was not named, no access to the inner nodes is desired, so we delete all nodes again.
\def\do##1{%
@@ -539,9 +554,15 @@
}%
}
-\protected\long\def\yquant@draw@subcircuit@single#1#2#3#4{%
+\def\yquant@draw@subcircuit@alias@removezero#1-0{#1}
+
+\def\yquant@draw@subcircuit@alias#1#2{%
+ \yquant@draw@subcircuit@alias@do#2\relax#1-0-\relax\relax%
+}
+
+\protected\long\def\yquant@draw@subcircuit@single#1#2#3#4#5{%
\yquant@config@operator@multifalse%
- \yquant@draw@subcircuit@prepare{#2}{#3}{#4}{#1}%
+ \yquant@draw@subcircuit@prepare{#2}{#3}{#4}{#5}{#1}%
\edef\cmd{%
\pgfshapeclippath{yquantbox}{%
/yquant/every operator, \yquant@draw@@style,%
@@ -563,10 +584,10 @@
\numdef\yquant@draw@@idx@content{\yquant@draw@@idx@content+1}%
}
-\protected\long\def\yquant@draw@subcircuit@multi#1#2#3#4#5#6#7{%
+\protected\long\def\yquant@draw@subcircuit@multi#1#2#3#4#5#6#7#8{%
\yquant@config@operator@multitrue%
% there is no contiguous slicing for subcircuits, as they may have all kinds of wire operations that can extend beyond the individual slices, let alone ancillas
- \yquant@draw@subcircuit@prepare{#5}{#6}{#7}{#4}%
+ \yquant@draw@subcircuit@prepare{#5}{#6}{#7}{#8}{#4}%
\edef\cmd{%
\pgfshapeclippath{yquantbox}{%
/yquant/every operator, \yquant@draw@@style,%
diff --git a/graphics/pgf/contrib/yquant/tex/yquant-prepare.tex b/graphics/pgf/contrib/yquant/tex/yquant-prepare.tex
index c9db0883b6..ba240dfc5e 100644
--- a/graphics/pgf/contrib/yquant/tex/yquant-prepare.tex
+++ b/graphics/pgf/contrib/yquant/tex/yquant-prepare.tex
@@ -766,7 +766,7 @@
\yquant@draw@subcircuit@single%
{#2}% register index
{\yquant@circuit@subcircuit@id}%
- {\nodename}%
+ {\nodename}\ifnum\yquant@circuit@operator@numtarget=1 1\else0\fi%
{\noexpand\yquant@prepare@subcircuit@width}%
}%
}%
@@ -787,7 +787,7 @@
\yquant@draw@subcircuit@multi%
#2%
{\yquant@circuit@subcircuit@id}%
- {\nodename}%
+ {\nodename}\ifnum\yquant@circuit@operator@numtarget=1 1\else0\fi%
{\noexpand\yquant@prepare@subcircuit@width}%
}%
}%
@@ -866,7 +866,7 @@
}%
}
-\def\yquant@prepare@finalize@ctrl@subcircuit@single#1#2#3#4{%
+\def\yquant@prepare@finalize@ctrl@subcircuit@single#1#2#3#4#5{%
\yquant@prepare@finalize@ctrl@single{#1}{#3}%
}
@@ -877,7 +877,7 @@
\yquant@prepare@callback@prepare{#1}%
}
-\protected\def\yquant@prepare@finalize@ctrl@subcircuit@multi#1#2#3#4#5#6#7{%
+\protected\def\yquant@prepare@finalize@ctrl@subcircuit@multi#1#2#3#4#5#6#7#8{%
% there are no contiguous parts here, don't call the normal @multi
\forlistloop\yquant@prepare@finalize@ctrl@subcircuit@multi@loop{#4}%
} \ No newline at end of file
diff --git a/graphics/pgf/contrib/yquant/tex/yquant.sty b/graphics/pgf/contrib/yquant/tex/yquant.sty
index ecbee654e0..e98878845c 100644
--- a/graphics/pgf/contrib/yquant/tex/yquant.sty
+++ b/graphics/pgf/contrib/yquant/tex/yquant.sty
@@ -15,7 +15,7 @@
%
% The Current Maintainer of this work is Benjamin Desef.
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{yquant}[2021/03/27 v0.4 Yet another quantum circuit library for LaTeX]
+\ProvidesPackage{yquant}[2021/07/03 v0.4.1 Yet another quantum circuit library for LaTeX]
\RequirePackage{etoolbox}[2018/02/11]
\RequirePackage{tikz}[2015/08/29]