diff options
author | Karl Berry <karl@freefriends.org> | 2022-10-26 19:57:44 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-10-26 19:57:44 +0000 |
commit | 1727757c182b7cd2377643274a192119053353ff (patch) | |
tree | ba525e38c36acb13b350db06fe6657ff55e59072 /Master | |
parent | bccfc1d794af6d60fb6280ae09009425fc7d69ca (diff) |
braids (26oct22)
git-svn-id: svn://tug.org/texlive/trunk@64817 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r-- | Master/texmf-dist/doc/latex/braids/braids.pdf | bin | 314455 -> 301271 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/braids/braids.tex | 55 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/braids/braids_code.pdf | bin | 410835 -> 456447 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/braids/braids_code.dtx | 693 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/braids/braids_code.ins | 4 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/braids/braids.sty | 2 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/braids/tikzlibrarybraids.code.tex | 622 |
7 files changed, 1023 insertions, 353 deletions
diff --git a/Master/texmf-dist/doc/latex/braids/braids.pdf b/Master/texmf-dist/doc/latex/braids/braids.pdf Binary files differindex 5241cd38eec..32712530b63 100644 --- a/Master/texmf-dist/doc/latex/braids/braids.pdf +++ b/Master/texmf-dist/doc/latex/braids/braids.pdf diff --git a/Master/texmf-dist/doc/latex/braids/braids.tex b/Master/texmf-dist/doc/latex/braids/braids.tex index 7dab9f08738..fa99fd937be 100644 --- a/Master/texmf-dist/doc/latex/braids/braids.tex +++ b/Master/texmf-dist/doc/latex/braids/braids.tex @@ -10,7 +10,15 @@ \usepackage{listings} \lstloadlanguages{[LaTeX]TeX} -\lstset{breakatwhitespace=true,breaklines=true,language=TeX} + \lstset{ + gobble=2, + breakatwhitespace=true, + breaklines=true, + language=[LaTeX]TeX, + basicstyle=\small\ttfamily, + keepspaces=true, + columns=fullflexible +} \usepackage{fancyvrb} @@ -21,7 +29,6 @@ \begin{center} \setlength{\parindent}{0pt} \fbox{\begin{minipage}{.9\linewidth} - \lstset{breakatwhitespace=true,breaklines=true,language=TeX,basicstyle=\small} \lstinputlisting[]{example.out} \end{minipage}} @@ -105,15 +112,27 @@ The usual syntax for this is as follows: \DescribeMacro{braid-word} The \Verb+braid-word+ is an expression in the braid group, such as \Verb+s_1 s_2^{-1} s_{3,5}+. The generator labels are not significant. -If the subscript is a single number, as in \Verb+s_2+, the crossing goes from that number over the next. -If the subscript is two numbers, as in \Verb+s_{2,4}+, the crossing goes from the first over the second, with both the crossing strands passing over all of the intervening strands. + +The subscript determines how the strands cross, as follows: +\begin{enumerate} +\item If the subscript is a single number, as in \Verb+s_2+, the crossing goes from that number over the next. +\item If the subscript is two or more numbers separated by a comma, as in \Verb+s_{2,4}+ or \Verb+s_{1,3,5}+, imagine holding the numbered strands and moving each to the position of the next with the last strand moving under the others to where the first stands. +Any intermediate non-specified strand is behind all those involved in the crossing. +\item If the subscript is hyphenated, as in \Verb+s_{1-5}+, this is equivalent to \Verb+s_{1,2,3,4,5}+. +This can be used as part of a list, as in \Verb+s_{1-3,5}+. +\end{enumerate} + +All of these crossings take place in the same amount of vertical space. +Be advised that crossings involving a lot of strands can get quite squashed. + The exponent can be \Verb+1+, \Verb+{-1}+, or missing (in which case it defaults to \Verb+1+, note also that the exponent is read as a \TeX-token so \Verb+{1}+ is also legal). -If the exponent is \(-1\) then the over and under strands swap. +If the exponent is \(-1\) then the braid element represented by the crossing is inverted. \begin{itemize} \item \Verb+s_1+ is strand \(1\) over strand \(2\). \item \Verb+s_1^{-1}+ is strand \(2\) over strand \(1\). \item \Verb+s_{1,3}+ is strand \(1\) over strand \(3\), and both are over strand \(2\). +\item \Verb+s_{1-3}+ is strand \(3\) under strand \(2\) and then under strand \(1\). \end{itemize} Certain other symbols are allowed in the \Verb+braid-word+ which control the rendering of the braid. @@ -217,9 +236,13 @@ With a \Verb+name prefix+, the coordinate names look like the following: The crossing number can also be either \Verb+s+ or \Verb+e+ for the start and end of the strand. Note that \Verb+-1-0+ and \Verb+-1-s+ are slightly different in that \Verb+s+ includes the border height. +In addition, if the braid is named then a rectangular node is defined that fits around the whole braid. +This node is not actually rendered but its anchors can be used afterwards as if it had been. + \DescribeMacro{anchor} The key \Verb+anchor+ (in the \Verb+braid+ name space) can be used to shift the braid so that a different part of it is at the specified location. -It uses the same syntax as the coordinates, except without the \Verb+<name prefix>-+. +If the argument contains a hyphen then it is assumed to refer to a point on a strand with the same interpretation as the coordinates (except without the \Verb+<name prefix>-+, of course). +If the argument does not contain a hyphen then it is taken to be an anchor of a surrounding rectangular node (the node might not itself exist -- if the braid isn't named -- but that doesn't affect the positioning). In the following example, the braid is shifted so that where the third strand starts the second level is at the position \Verb+(1,1)+ \begin{example} @@ -282,6 +305,26 @@ Here are more detailed examples. \end{example} +\begin{example} +\begin{center} +\begin{tikzpicture} +\pic[ + braid/.cd, + number of strands=3, + ultra thick, + strand 1/.style={red}, + strand 2/.style={green}, + strand 3/.style={blue}, + gap=0.1, +% control factor=0, +% nudge factor=0, + name prefix=braid, +] {braid={a_{1-3} a_{1,3}}}; +\end{tikzpicture} +\end{center} + +\end{example} + \newpage \section{Original Package Usage (Depreciated)} diff --git a/Master/texmf-dist/doc/latex/braids/braids_code.pdf b/Master/texmf-dist/doc/latex/braids/braids_code.pdf Binary files differindex d60b9b6f399..e001392bde0 100644 --- a/Master/texmf-dist/doc/latex/braids/braids_code.pdf +++ b/Master/texmf-dist/doc/latex/braids/braids_code.pdf diff --git a/Master/texmf-dist/source/latex/braids/braids_code.dtx b/Master/texmf-dist/source/latex/braids/braids_code.dtx index 51a4ee2c600..f1f59c29b05 100644 --- a/Master/texmf-dist/source/latex/braids/braids_code.dtx +++ b/Master/texmf-dist/source/latex/braids/braids_code.dtx @@ -35,7 +35,7 @@ See http://www.latex-project.org/lppl.txt \endpreamble \postamble -Copyright (C) 2011-2019 by Andrew Stacey <loopspace@mathforge.org> +Copyright (C) 2011-2022 by Andrew Stacey <loopspace@mathforge.org> This work may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either @@ -103,7 +103,7 @@ and the derived files README.txt, %</driver> % \fi % -% \CheckSum{1949} +% \CheckSum{2352} % % \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 @@ -125,6 +125,8 @@ and the derived files README.txt, % \changes{1.0}{2011/05/03}{Converted to DTX file} % \changes{1.1}{2011/05/03}{Extended syntax} % \changes{2.0}{2019/03/20}{Converted TikZ library} +% \changes{2.1}{2019/08/14}{Extended crossing capability} +% \changes{2.2}{2022/10/26}{Advanced positioning} % % \DoNotIndex{\newcommand,\newenvironment} % @@ -1181,7 +1183,7 @@ and the derived files README.txt, % Life is so much easier with \LaTeX3. % \begin{macrocode} \ProvidesFile{tikzlibrarybraids.code.tex}[% - 2019/03/20 v2.0 Tikz/PGF library for drawing braid diagrams% + 2022/10/26 v2.2 Tikz/PGF library for drawing braid diagrams% ] \RequirePackage{expl3} \ExplSyntaxOn @@ -1207,11 +1209,19 @@ and the derived files README.txt, \fp_new:N \l_@@_anchor_x_fp \fp_new:N \l_@@_anchor_y_fp \int_new:N \l_@@_tmpa_int +\int_new:N \l_@@_tmpb_int \int_new:N \l_@@_length_int \int_new:N \l_@@_strands_int \int_new:N \l_@@_crossing_int +\int_new:N \l_@@_crossing_start_int +\int_new:N \l_@@_crossing_end_int +\int_new:N \l_@@_crossing_width_int +\int_new:N \l_@@_crossing_long_int +\int_new:N \l_@@_crossing_start_factor_int +\int_new:N \l_@@_crossing_end_factor_int \int_new:N \l_@@_anchor_level_int \int_new:N \l_@@_floor_int +\seq_new:N \l_@@_tmpa_seq \seq_new:N \l_@@_word_seq \seq_new:N \l_@@_crossing_seq \seq_new:N \l_@@_anchor_seq @@ -1235,22 +1245,19 @@ and the derived files README.txt, \prop_new:N \l_@@_crossing_permutation_prop \prop_new:N \l_@@_inverse_prop \prop_new:N \l_@@_anchor_prop +\cs_generate_variant:Nn \seq_set_split:Nnn {NVn} % \end{macrocode} % Our interface is through a TikZ pic. % \begin{macrocode} \tikzset{ braid/.pic={ - code={ - \@@_parse_word:n {#1} - \@@_count: - \@@_render: - } + \@@_parse_word:n {#1} + \@@_count: + \@@_render: }, floor/.pic={ - code={ - \path[pic~ actions, draw=none] (0,0) rectangle (1,1); - \path[pic~ actions, fill=none] (0,0) -- (1,0) (0,1) -- (1,1); - } + \path[pic~ actions, draw=none] (0,0) rectangle (1,1); + \path[pic~ actions, fill=none] (0,0) -- (1,0) (0,1) -- (1,1); }, /tikz/braid/.search~ also={/tikz}, braid/.cd, @@ -1431,15 +1438,35 @@ and the derived files README.txt, % \begin{macrocode} \cs_new_nopar:Npn \@@_parse_index:n #1 { - \seq_set_from_clist:Nn \l_@@_crossing_seq {#1} + \seq_clear:N \l_@@_crossing_seq + \clist_map_inline:nn {#1} + { + \tl_if_in:nnTF {##1} {-} + { + \seq_set_split:Nnn \l_@@_tmpa_seq {-} {##1} + \int_compare:nTF {\seq_item:Nn \l_@@_tmpa_seq {1} < \seq_item:Nn \l_@@_tmpa_seq {2} } + { + \int_set:Nn \l_@@_tmpa_int {1} + } + { + \int_set:Nn \l_@@_tmpa_int {-1} + } + \int_step_inline:nnnn {\seq_item:Nn \l_@@_tmpa_seq {1}} {\l_@@_tmpa_int} {\seq_item:Nn \l_@@_tmpa_seq {2}} + { + \seq_put_right:Nn \l_@@_crossing_seq {####1} + } + } + { + \seq_put_right:Nn \l_@@_crossing_seq {##1} + } + } \int_compare:nT {\seq_count:N \l_@@_crossing_seq == 1} { \seq_put_right:Nx \l_@@_crossing_seq {\int_eval:n {#1 + 1} } } - \bool_if:NT \l_@@_swap_crossing_bool + \bool_if:NF \l_@@_swap_crossing_bool { - \seq_pop_left:NN \l_@@_crossing_seq \l_@@_tmpa_tl - \seq_put_right:NV \l_@@_crossing_seq \l_@@_tmpa_tl + \seq_reverse:N \l_@@_crossing_seq } } % \end{macrocode} @@ -1507,15 +1534,11 @@ and the derived files README.txt, % \begin{macrocode} \seq_if_empty:NF \l_@@_crossing_seq { - \int_set:Nn \l_@@_strands_int + \seq_map_inline:Nn \l_@@_crossing_seq { - \int_max:nn + \int_set:Nn \l_@@_strands_int { - \int_max:nn {\l_@@_strands_int} - { \seq_item:Nn \l_@@_crossing_seq {1}} - } - { - \seq_item:Nn \l_@@_crossing_seq {2} + \int_max:nn {\l_@@_strands_int} {####1} } } } @@ -1534,38 +1557,51 @@ and the derived files README.txt, % Now we step through the braid word again and record the permutations so that we can calculate the overall permutation defined by the braid. % % We will also figure out our shift from the anchor, so first we need to get some information about the anchor. +% +% If the anchor specification has a hyphen then it is of the form strand-level, otherwise it is an anchor as if the whole braid were contained in a rectangular node. % \begin{macrocode} \tl_set:Nx \l_@@_tmpa_tl {\@@_value:n {anchor}} - \seq_set_split:NnV \l_@@_anchor_seq {-} \l_@@_tmpa_tl - - \tl_set:Nx \l_@@_tmpa_tl {\seq_item:Nn \l_@@_anchor_seq {1}} - \tl_if_eq:VnTF \l_@@_tmpa_tl {rev} - { - \tl_set:Nx \l_@@_anchor_strand_tl {\seq_item:Nn \l_@@_anchor_seq {2}} - \tl_set:Nx \l_@@_anchor_level_tl {\seq_item:Nn \l_@@_anchor_seq {3}} - } + \tl_if_in:NnTF \l_@@_tmpa_tl {-} { - \tl_set:Nx \l_@@_anchor_strand_tl {\seq_item:Nn \l_@@_anchor_seq {1}} - \tl_set:Nx \l_@@_anchor_level_tl {\seq_item:Nn \l_@@_anchor_seq {2}} - } + \seq_set_split:NnV \l_@@_anchor_seq {-} \l_@@_tmpa_tl + + \tl_set:Nx \l_@@_tmpa_tl {\seq_item:Nn \l_@@_anchor_seq {1}} + \tl_if_eq:VnTF \l_@@_tmpa_tl {rev} + { + \tl_set:Nx \l_@@_anchor_strand_tl {\seq_item:Nn \l_@@_anchor_seq {2}} + \tl_set:Nx \l_@@_anchor_level_tl {\seq_item:Nn \l_@@_anchor_seq {3}} + } + { + \tl_set:Nx \l_@@_anchor_strand_tl {\seq_item:Nn \l_@@_anchor_seq {1}} + \tl_set:Nx \l_@@_anchor_level_tl {\seq_item:Nn \l_@@_anchor_seq {2}} + } % \end{macrocode} % The important information is as to the level at which the requested anchor resides. % If it is at the end or start of a strand, we set the level to \(-1\) so that it never matches a level number. % \begin{macrocode} - \tl_if_eq:VnTF \l_@@_anchor_level_tl {s} - { - \int_set:Nn \l_@@_anchor_level_int {-1} - } - { - \tl_if_eq:VnTF \l_@@_anchor_level_tl {e} + \tl_if_eq:VnTF \l_@@_anchor_level_tl {s} { \int_set:Nn \l_@@_anchor_level_int {-1} } { - \int_set:Nn \l_@@_anchor_level_int - {\tl_use:N \l_@@_anchor_level_tl} + \tl_if_eq:VnTF \l_@@_anchor_level_tl {e} + { + \int_set:Nn \l_@@_anchor_level_int {-1} + } + { + \int_set:Nn \l_@@_anchor_level_int + {\tl_use:N \l_@@_anchor_level_tl} + } } } + { +% \end{macrocode} +% There wasn't a hyphen in the anchor specification, so assume it's an anchor on a node surrounding the entire braid. +% For now, set the anchor strand and level to \(-1\). +% \begin{macrocode} + \int_set:Nn \l_@@_anchor_level_int {-1} + \tl_set:Nn \l_@@_anchor_strand_tl {-1} + } \int_zero:N \l_@@_crossing_int \int_incr:N \l_@@_crossing_int @@ -1580,23 +1616,29 @@ and the derived files README.txt, ##1 \seq_if_empty:NF \l_@@_crossing_seq { - \prop_get:NxN \l_@@_permutation_prop - { - \seq_item:Nn \l_@@_crossing_seq {1} - } \l_@@_tmpa_tl - \prop_get:NxN \l_@@_permutation_prop + \int_step_inline:nnn {2} {\seq_count:N \l_@@_crossing_seq} { - \seq_item:Nn \l_@@_crossing_seq {2} - } \l_@@_tmpb_tl + \int_set:Nn \l_@@_tmpa_int {####1} + \int_set:Nn \l_@@_tmpb_int {####1 - 1} - \prop_put:NxV \l_@@_permutation_prop - { - \seq_item:Nn \l_@@_crossing_seq {2} - } \l_@@_tmpa_tl - \prop_put:NxV \l_@@_permutation_prop - { - \seq_item:Nn \l_@@_crossing_seq {1} - } \l_@@_tmpb_tl + \prop_get:NxN \l_@@_permutation_prop + { + \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + } \l_@@_tmpa_tl + \prop_get:NxN \l_@@_permutation_prop + { + \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int} + } \l_@@_tmpb_tl + + \prop_put:NxV \l_@@_permutation_prop + { + \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int} + } \l_@@_tmpa_tl + \prop_put:NxV \l_@@_permutation_prop + { + \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + } \l_@@_tmpb_tl + } } % \end{macrocode} % See if the current level is what was requested by the anchor. @@ -1629,24 +1671,30 @@ and the derived files README.txt, } % \end{macrocode} % Now that we have the inverse, we can figure out our anchor. -% First, see if we requested a strand by its position at the end of the braid. +% If the strand was recorded as \(-1\), then we want to figure out the position from the braid as a whole so we don't bother with processing. % \begin{macrocode} - \tl_set:Nx \l_@@_tmpa_tl {\seq_item:Nn \l_@@_anchor_seq {1}} - \tl_if_eq:VnT \l_@@_tmpa_tl {rev} + \tl_if_eq:VnF \l_@@_anchor_strand_tl {-1} { - \prop_get:NVN \l_@@_permutation_prop - \l_@@_anchor_strand_tl \l_@@_anchor_strand_tl - } - \tl_if_eq:VnF \l_@@_anchor_level_tl {s} - { - \tl_if_eq:VnTF \l_@@_anchor_level_tl {e} +% \end{macrocode} +% Now, see if we requested a strand by its position at the end of the braid. +% \begin{macrocode} + \tl_set:Nx \l_@@_tmpa_tl {\seq_item:Nn \l_@@_anchor_seq {1}} + \tl_if_eq:VnT \l_@@_tmpa_tl {rev} { - \prop_get:NVN \l_@@_inverse_prop + \prop_get:NVN \l_@@_permutation_prop \l_@@_anchor_strand_tl \l_@@_anchor_strand_tl } + \tl_if_eq:VnF \l_@@_anchor_level_tl {s} { - \prop_get:NVN \l_@@_anchor_prop - \l_@@_anchor_strand_tl \l_@@_anchor_strand_tl + \tl_if_eq:VnTF \l_@@_anchor_level_tl {e} + { + \prop_get:NVN \l_@@_inverse_prop + \l_@@_anchor_strand_tl \l_@@_anchor_strand_tl + } + { + \prop_get:NVN \l_@@_anchor_prop + \l_@@_anchor_strand_tl \l_@@_anchor_strand_tl + } } } % \end{macrocode} @@ -1684,28 +1732,91 @@ and the derived files README.txt, \cs_new_nopar:Npn \@@_render: { % \end{macrocode} -% +% Start by figuring out our anchor. % \begin{macrocode} - \fp_set:Nn \l_@@_anchor_x_fp { - 1 * (\tl_use:N \l_@@_anchor_strand_tl - 1) * \@@_dim_value:n {width} } - - \tl_if_eq:VnTF \l_@@_anchor_level_tl {s} + \tl_if_eq:VnTF \l_@@_anchor_strand_tl {-1} { - \fp_set:Nn \l_@@_anchor_y_fp {0} +% \end{macrocode} +% The strand is \(-1\) then we're working with the braid as if a node. +% We'll redefine this node later anyway. +% \begin{macrocode} + \tl_set:cn {pgf@sh@ns@temporary braid node}{rectangle} + \tl_set:cx {pgf@sh@np@temporary braid node}{% + \exp_not:N\def + \exp_not:N\southwest + { + \exp_not:N\pgfqpoint + {0pt} + {0pt} + } + \exp_not:N\def + \exp_not:N\northeast + { + \exp_not:N\pgfqpoint + { + \fp_to_dim:n + { + (\l_@@_strands_int - 1) + * + abs(\@@_dim_value:n {width}) + } + } + { + \fp_to_dim:n + { + \l_@@_length_int * abs(\@@_dim_value:n {height}) + + 2 * \@@_dim_value:n {border~ height} + } + } + } + }% + \pgfgettransform\l_@@_tmpa_tl + \tl_set:cV {pgf@sh@nt@temporary braid node} \l_@@_tmpa_tl + \tl_set:cV {pgf@sh@pi@temporary braid node} \pgfpictureid + \pgfpointanchor{temporary braid node} {\@@_value:n {anchor}} +% \end{macrocode} +% Adjustments due to the possibility of negative widths/heights +% \begin{macrocode} + \fp_set:Nn \l_@@_anchor_x_fp { + - \dim_use:c {pgf@x} + - (1 - sign(\@@_dim_value:n {width})) / 2 + * (\l_@@_strands_int - 1) + * \@@_dim_value:n {width} + } + \fp_set:Nn \l_@@_anchor_y_fp { + - \dim_use:c {pgf@y} + - (1 - sign(\@@_dim_value:n {height})) / 2 + * ( + \l_@@_length_int * abs(\@@_dim_value:n {height}) + + 2 * \@@_dim_value:n {border~ height} + ) * sign(\@@_dim_value:n {height}) + } } { - \tl_if_eq:VnTF \l_@@_anchor_level_tl {e} +% \end{macrocode} +% The strand is not \(-1\) so we're setting the anchor via strand and level numbers. +% \begin{macrocode} + \fp_set:Nn \l_@@_anchor_x_fp { - 1 * (\tl_use:N \l_@@_anchor_strand_tl - 1) * \@@_dim_value:n {width} } + + \tl_if_eq:VnTF \l_@@_anchor_level_tl {s} { - \fp_set:Nn \l_@@_anchor_y_fp { - -1 * \l_@@_length_int * \@@_dim_value:n {height} - - sign(\@@_dim_value:n {height}) - * 2 * \@@_dim_value:n {border~ height} - } + \fp_set:Nn \l_@@_anchor_y_fp {0} } { - \fp_set:Nn \l_@@_anchor_y_fp { - -1 * \l_@@_anchor_level_tl * \@@_dim_value:n {height} - - sign(\@@_dim_value:n {height}) - * \@@_dim_value:n {border~ height} + \tl_if_eq:VnTF \l_@@_anchor_level_tl {e} + { + \fp_set:Nn \l_@@_anchor_y_fp { + -1 * \l_@@_length_int * \@@_dim_value:n {height} + - sign(\@@_dim_value:n {height}) + * 2 * \@@_dim_value:n {border~ height} + } + } + { + \fp_set:Nn \l_@@_anchor_y_fp { + -1 * \l_@@_anchor_level_tl * \@@_dim_value:n {height} + - sign(\@@_dim_value:n {height}) + * \@@_dim_value:n {border~ height} + } } } } @@ -1860,190 +1971,321 @@ and the derived files README.txt, % \begin{macrocode} \seq_if_empty:NF \l_@@_crossing_seq { + \int_set:Nn \l_@@_crossing_long_int + { + % \seq_item:Nn \l_@@_crossing_seq {\seq_count:N \l_@@_crossing_seq} + \seq_item:Nn \l_@@_crossing_seq {1} + } + \int_set:Nn \l_@@_crossing_start_int + { + \int_min:nn + { + \seq_item:Nn \l_@@_crossing_seq {1} + } + { + \seq_item:Nn \l_@@_crossing_seq {\seq_count:N \l_@@_crossing_seq} + } + } + \int_set:Nn \l_@@_crossing_end_int + { + \int_max:nn + { + \seq_item:Nn \l_@@_crossing_seq {1} + } + { + \seq_item:Nn \l_@@_crossing_seq {\seq_count:N \l_@@_crossing_seq} + } + + } + \int_set:Nn \l_@@_crossing_width_int + { + \l_@@_crossing_end_int + - + \l_@@_crossing_start_int + } +% \end{macrocode} +% Step through the crossing +% \begin{macrocode} + \int_step_inline:nnn {2} {\seq_count:N \l_@@_crossing_seq} + { + \int_set:Nn \l_@@_tmpa_int {####1} + \int_set:Nn \l_@@_tmpb_int {####1 - 1} % \end{macrocode} % Keep track of the current permutation. % \begin{macrocode} \prop_get:NxN \l_@@_crossing_permutation_prop - {\seq_item:Nn \l_@@_crossing_seq {1}} \l_@@_tmpa_tl + {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int}} \l_@@_tmpa_tl \prop_get:NxN \l_@@_crossing_permutation_prop - {\seq_item:Nn \l_@@_crossing_seq {2}} \l_@@_tmpb_tl + {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}} \l_@@_tmpb_tl \prop_put:NxV \l_@@_crossing_permutation_prop - {\seq_item:Nn \l_@@_crossing_seq {2}} \l_@@_tmpa_tl + {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}} \l_@@_tmpa_tl \prop_put:NxV \l_@@_crossing_permutation_prop - {\seq_item:Nn \l_@@_crossing_seq {1}} \l_@@_tmpb_tl + {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int}} \l_@@_tmpb_tl % \end{macrocode} % Now get the strands corresponding to the ones involved in the crossing. % \begin{macrocode} \prop_get:NxN \l_@@_strands_prop - {\seq_item:Nn \l_@@_crossing_seq {1}} \l_@@_tmpa_tl + {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int}} \l_@@_tmpa_tl \prop_get:NxN \l_@@_strands_prop - {\seq_item:Nn \l_@@_crossing_seq {2}} \l_@@_tmpb_tl + {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}} \l_@@_tmpb_tl % \end{macrocode} % The over-strand is easy as that's a single curve. % \begin{macrocode} +% \int_set:Nn \l_@@_crossing_start_factor_int {1} +% \int_set:Nn \l_@@_crossing_end_factor_int {1} +% \int_compare:nT { +% \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} +% = +% \l_@@_crossing_long_int +% } +% { + \int_set:Nn \l_@@_crossing_start_factor_int {0} + \int_set:Nn \l_@@_crossing_end_factor_int {0} + + \int_compare:nT { + ####1 = \seq_count:N \l_@@_crossing_seq + } + { + \int_set:Nn \l_@@_crossing_end_factor_int {1} + } + \int_compare:nT { + ####1 = 2 + } + { + \int_set:Nn \l_@@_crossing_start_factor_int {1} + } +% } + \tl_put_right:Nx \l_@@_tmpa_tl { \exp_not:N \@@_lineto:nn {\fp_eval:n { - (\seq_item:Nn \l_@@_crossing_seq {1} - 1) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} - 1) * \@@_dim_value:n {width} } } - {\fp_eval:n { \l_@@_height_fp + \l_@@_nudge_fp } } + {\fp_eval:n { \l_@@_height_fp + \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + + \@@_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l_@@_crossing_seq - 1) + } } \exp_not:N \@@_curveto:nnnnnn {0} - {\fp_eval:n { \l_@@_control_fp}} + {\fp_eval:n { \l_@@_control_fp +% * \l_@@_crossing_start_factor_int + * 1/(\seq_count:N \l_@@_crossing_seq - 1)}} {0} - {\fp_eval:n {- \l_@@_control_fp}} + {\fp_eval:n {- \l_@@_control_fp +% * \l_@@_crossing_end_factor_int + * 1/(\seq_count:N \l_@@_crossing_seq - 1)}} {\fp_eval:n { - (\seq_item:Nn \l_@@_crossing_seq {2} - 1) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int} - 1) * \@@_dim_value:n {width} } } {\fp_eval:n { \l_@@_height_fp - + \@@_dim_value:n {height} - - \l_@@_nudge_fp + + \@@_dim_value:n {height} * (####1 - 1)/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int } } } % \end{macrocode} % The under-strand is a bit more complicated as we need to break it in the middle. % \begin{macrocode} +% \int_set:Nn \l_@@_crossing_start_factor_int {1} +% \int_set:Nn \l_@@_crossing_end_factor_int {1} +% \int_compare:nT { +% \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int} +% = +% \l_@@_crossing_long_int +% } +% { + \int_set:Nn \l_@@_crossing_start_factor_int {0} + \int_set:Nn \l_@@_crossing_end_factor_int {0} + + \int_compare:nT { + ####1 = \seq_count:N \l_@@_crossing_seq + } + { + \int_set:Nn \l_@@_crossing_end_factor_int {1} + } + \int_compare:nT { + ####1 = 2 + } + { + \int_set:Nn \l_@@_crossing_start_factor_int {1} + } +% } + \tl_put_right:Nx \l_@@_tmpb_tl { \exp_not:N \@@_lineto:nn {\fp_eval:n { - (\seq_item:Nn \l_@@_crossing_seq {2} - 1) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int} - 1) * \@@_dim_value:n {width} } } - {\fp_eval:n { \l_@@_height_fp + \l_@@_nudge_fp } } + {\fp_eval:n { \l_@@_height_fp + \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + + \@@_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l_@@_crossing_seq - 1) + + } } \exp_not:N \@@_curveto:nnnnnn {0} { \fp_eval:n { - \l_@@_control_fp * (.5 - \@@_value:n {gap} ) + \l_@@_control_fp * (.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) ) * 1/(\seq_count:N \l_@@_crossing_seq - 1) +% * \l_@@_crossing_start_factor_int } } { \fp_eval:n { - - (.5 - \@@_value:n {gap} ) / 3 * + - (.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) ) / 3 * \@@_bezier_tangent:nnnnn - {.5 - \@@_value:n {gap} } + {.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) } {0} {0} { - (\seq_item:Nn \l_@@_crossing_seq {1} - - \seq_item:Nn \l_@@_crossing_seq {2}) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + - \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}) * \@@_dim_value:n {width} } { - (\seq_item:Nn \l_@@_crossing_seq {1} - - \seq_item:Nn \l_@@_crossing_seq {2}) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + - \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}) * \@@_dim_value:n {width} } } } { \fp_eval:n { - -(.5 - \@@_value:n {gap} ) / 3 * + -(.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) ) / 3 * \@@_bezier_tangent:nnnnn - {.5 - \@@_value:n {gap} } + {.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) } {0} - {\l_@@_control_fp} { - \@@_dim_value:n {height} - - 2* \l_@@_nudge_fp - - \l_@@_control_fp + \l_@@_control_fp * 1/(\seq_count:N \l_@@_crossing_seq - 1) +% * \l_@@_crossing_start_factor_int + } + { + \@@_dim_value:n {height} * 1/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int + - \l_@@_control_fp * 1/(\seq_count:N \l_@@_crossing_seq - 1) +% * \l_@@_crossing_end_factor_int + } + { + \@@_dim_value:n {height} * 1/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int } - {\@@_dim_value:n {height} - 2* \l_@@_nudge_fp} } } { \fp_eval:n { - (\seq_item:Nn \l_@@_crossing_seq {2} - 1) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int} - 1) * \@@_dim_value:n {width} + \@@_bezier_point:nnnnn - {.5 - \@@_value:n {gap} } + {.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) } {0} {0} { - (\seq_item:Nn \l_@@_crossing_seq {1} - - \seq_item:Nn \l_@@_crossing_seq {2}) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + - \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}) * \@@_dim_value:n {width} } { - (\seq_item:Nn \l_@@_crossing_seq {1} - - \seq_item:Nn \l_@@_crossing_seq {2}) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + - \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}) * \@@_dim_value:n {width} } } } { \fp_eval:n { - \l_@@_height_fp + \l_@@_nudge_fp + + \l_@@_height_fp + + \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + + \@@_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l_@@_crossing_seq - 1) + + \@@_bezier_point:nnnnn - {.5 - \@@_value:n {gap} } + {.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) } {0} - {\l_@@_control_fp} { - \@@_dim_value:n {height} - - 2* \l_@@_nudge_fp - - \l_@@_control_fp + \l_@@_control_fp * 1/(\seq_count:N \l_@@_crossing_seq - 1) +% * \l_@@_crossing_start_factor_int + } + { + \@@_dim_value:n {height} * 1/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int + - \l_@@_control_fp * 1/(\seq_count:N \l_@@_crossing_seq - 1) +% * \l_@@_crossing_end_factor_int + } + {\@@_dim_value:n {height} * 1/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int } - {\@@_dim_value:n {height} - 2* \l_@@_nudge_fp} } } \exp_not:N \@@_moveto:nn { \fp_eval:n { - (\seq_item:Nn \l_@@_crossing_seq {2} - 1) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int} - 1) * \@@_dim_value:n {width} + \@@_bezier_point:nnnnn - {.5 + \@@_value:n {gap} } + {.5 + \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) } {0} {0} { - (\seq_item:Nn \l_@@_crossing_seq {1} - - \seq_item:Nn \l_@@_crossing_seq {2}) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + - \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}) * \@@_dim_value:n {width} } { - (\seq_item:Nn \l_@@_crossing_seq {1} - - \seq_item:Nn \l_@@_crossing_seq {2}) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + - \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}) * \@@_dim_value:n {width} } } } { \fp_eval:n { - \l_@@_height_fp + \l_@@_nudge_fp + + \l_@@_height_fp + + \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + + \@@_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l_@@_crossing_seq - 1) + + \@@_bezier_point:nnnnn - {.5 + \@@_value:n {gap} } + {.5 + \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) } {0} - {\l_@@_control_fp} { - \@@_dim_value:n {height} - 2* \l_@@_nudge_fp - - \l_@@_control_fp + \l_@@_control_fp * 1/(\seq_count:N \l_@@_crossing_seq - 1) +% * \l_@@_crossing_start_factor_int + } + { + \@@_dim_value:n {height} * 1/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int + - \l_@@_control_fp * 1/(\seq_count:N \l_@@_crossing_seq - 1) +% * \l_@@_crossing_end_factor_int + } + {\@@_dim_value:n {height} * 1/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int } - {\@@_dim_value:n {height} - 2* \l_@@_nudge_fp} } } @@ -2051,55 +2293,65 @@ and the derived files README.txt, { \fp_eval:n { - (.5 - \@@_value:n {gap} ) / 3 * + (.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) ) / 3 * \@@_bezier_tangent:nnnnn - {.5 + \@@_value:n {gap} } + {.5 + \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) } {0} {0} { - (\seq_item:Nn \l_@@_crossing_seq {1} - - \seq_item:Nn \l_@@_crossing_seq {2}) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + - \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}) * \@@_dim_value:n {width} } { - (\seq_item:Nn \l_@@_crossing_seq {1} - - \seq_item:Nn \l_@@_crossing_seq {2}) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + - \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}) * \@@_dim_value:n {width} } } } { \fp_eval:n { - (.5 - \@@_value:n {gap} ) / 3 * + (.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) ) / 3 * \@@_bezier_tangent:nnnnn - {.5 + \@@_value:n {gap} } + {.5 + \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) } {0} - {\l_@@_control_fp} { - \@@_dim_value:n {height} - 2* \l_@@_nudge_fp - - \l_@@_control_fp + \l_@@_control_fp * 1/(\seq_count:N \l_@@_crossing_seq - 1) +% * \l_@@_crossing_start_factor_int + } + { + \@@_dim_value:n {height} * 1/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int + - \l_@@_control_fp * 1/(\seq_count:N \l_@@_crossing_seq - 1) +% * \l_@@_crossing_end_factor_int + } + {\@@_dim_value:n {height} * 1/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_start_factor_int + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int } - {\@@_dim_value:n {height} - 2* \l_@@_nudge_fp} } } {0} - { \fp_eval:n { - -\l_@@_control_fp * (.5 - \@@_value:n {gap} ) - } + {\fp_eval:n { + - \l_@@_control_fp * (.5 - \@@_value:n {gap} * (\seq_count:N \l_@@_crossing_seq - 1) ) +% * \l_@@_crossing_end_factor_int + * 1/(\seq_count:N \l_@@_crossing_seq - 1)} } - {\fp_eval:n { - (\seq_item:Nn \l_@@_crossing_seq {1} - 1) + (\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} - 1) * \@@_dim_value:n {width} } } {\fp_eval:n { - \l_@@_height_fp + \@@_dim_value:n {height} - - \l_@@_nudge_fp + \l_@@_height_fp + + \@@_dim_value:n {height} * (####1 - 1)/(\seq_count:N \l_@@_crossing_seq - 1) + - \l_@@_nudge_fp * \l_@@_crossing_end_factor_int } } @@ -2108,9 +2360,9 @@ and the derived files README.txt, % Now put those new strands back in the prop. % \begin{macrocode} \prop_put:NxV \l_@@_strands_prop - {\seq_item:Nn \l_@@_crossing_seq {2}} \l_@@_tmpa_tl + {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}} \l_@@_tmpa_tl \prop_put:NxV \l_@@_strands_prop - {\seq_item:Nn \l_@@_crossing_seq {1}} \l_@@_tmpb_tl + {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int}} \l_@@_tmpb_tl % \end{macrocode} % If the strands are more than one apart, the intermediate strands need to be broken as well. % \begin{macrocode} @@ -2118,18 +2370,18 @@ and the derived files README.txt, { \int_max:nn { - \seq_item:Nn \l_@@_crossing_seq {1} + \seq_item:Nn \l_@@_crossing_seq {####1 - 1} } { - \seq_item:Nn \l_@@_crossing_seq {2} + \seq_item:Nn \l_@@_crossing_seq {####1} } - \int_min:nn { - \seq_item:Nn \l_@@_crossing_seq {1} + \seq_item:Nn \l_@@_crossing_seq {####1 - 1} } { - \seq_item:Nn \l_@@_crossing_seq {2} + \seq_item:Nn \l_@@_crossing_seq {####1} } > 1 } @@ -2138,49 +2390,78 @@ and the derived files README.txt, { \int_min:nn { - \seq_item:Nn \l_@@_crossing_seq {1} + \seq_item:Nn \l_@@_crossing_seq {####1 - 1} } { - \seq_item:Nn \l_@@_crossing_seq {2} + \seq_item:Nn \l_@@_crossing_seq {####1} } + 1} {1} { \int_max:nn { - \seq_item:Nn \l_@@_crossing_seq {1} + \seq_item:Nn \l_@@_crossing_seq {####1 - 1} } { - \seq_item:Nn \l_@@_crossing_seq {2} + \seq_item:Nn \l_@@_crossing_seq {####1} } - 1 } { - \prop_get:NnN \l_@@_strands_prop {####1} \l_@@_tmpa_tl + \prop_get:NnN \l_@@_strands_prop {########1} \l_@@_tmpa_tl \tl_put_right:Nx \l_@@_tmpa_tl { \exp_not:N \@@_lineto:nn - {\fp_eval:n {(####1 - 1) * \@@_dim_value:n {width} }} + {\fp_eval:n {(########1 - 1) * \@@_dim_value:n {width} }} {\fp_eval:n { \l_@@_height_fp + \l_@@_nudge_fp - + .5 * \l_@@_control_fp + + .5 * \l_@@_control_fp / (\seq_count:N \l_@@_crossing_seq - 1) + + \@@_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l_@@_crossing_seq - 1) } } \exp_not:N \@@_moveto:nn - {\fp_eval:n {(####1 - 1) * \@@_dim_value:n {width} }} + {\fp_eval:n {(########1 - 1) * \@@_dim_value:n {width} }} {\fp_eval:n { - \l_@@_height_fp + \@@_dim_value:n {height} - - \l_@@_nudge_fp - .5 * \l_@@_control_fp + \l_@@_height_fp + - \l_@@_nudge_fp - .5 * \l_@@_control_fp / (\seq_count:N \l_@@_crossing_seq - 1) + + \@@_dim_value:n {height} * (####1 - 1)/(\seq_count:N \l_@@_crossing_seq - 1) } } } - \prop_put:NnV \l_@@_strands_prop {####1} \l_@@_tmpa_tl + \prop_put:NnV \l_@@_strands_prop {########1} \l_@@_tmpa_tl } } +% \end{macrocode} +% Reset the current long +% \begin{macrocode} + \int_compare:nTF + { + \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int} + = + \l_@@_crossing_long_int + } + { + \int_set:Nn \l_@@_crossing_long_int {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int}} + } + { + \int_compare:nT + { + \seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpb_int} + = + \l_@@_crossing_long_int + } + { + \int_set:Nn \l_@@_crossing_long_int {\seq_item:Nn \l_@@_crossing_seq {\l_@@_tmpa_int}} + } + + } +% \end{macrocode} +% \begin{macrocode} + } } % \end{macrocode} % If we're to step the level, increase the height and add a load of coordinates. @@ -2239,6 +2520,68 @@ and the derived files README.txt, \prop_get:NnN \l_@@_strands_prop {##1} \l_@@_tmpa_tl \tl_use:N \l_@@_tmpa_tl } +% \end{macrocode} +% Finally, put a node around the whole braid if it's been named +% \begin{macrocode} + \tl_if_empty:cF {tikz@fig@name} + { + \tl_gset:cn {pgf@sh@ns@ \tl_use:c{tikz@fig@name} }{rectangle} + \tl_gset:cx {pgf@sh@np@ \tl_use:c{tikz@fig@name} }{% + \exp_not:N\def + \exp_not:N\southwest + { + \exp_not:N\pgfqpoint + { + \fp_to_dim:n + { + min(0, + (\l_@@_strands_int - 1) + * + (\@@_dim_value:n {width}) + ) + } + } + { + \fp_to_dim:n + { + min(0, + \l_@@_length_int * (\@@_dim_value:n {height}) + + 2 * sign(\@@_dim_value:n {height}) * + \@@_dim_value:n {border~ height} + ) + } + } + } + \exp_not:N\def + \exp_not:N\northeast + { + \exp_not:N\pgfqpoint + { + \fp_to_dim:n + { + max(0, + (\l_@@_strands_int - 1) + * + (\@@_dim_value:n {width}) + ) + } + } + { + \fp_to_dim:n + { + max(0, + \l_@@_length_int * (\@@_dim_value:n {height}) + + 2 * sign(\@@_dim_value:n {height}) * + \@@_dim_value:n {border~ height} + ) + } + } + } + }% + \pgfgettransform\l_@@_tmpa_tl + \tl_gset:cV {pgf@sh@nt@ \tl_use:c{tikz@fig@name} } \l_@@_tmpa_tl + \tl_gset:cV {pgf@sh@pi@ \tl_use:c{tikz@fig@name} } \pgfpictureid + } \end{scope} } % \end{macrocode} @@ -2257,6 +2600,8 @@ and the derived files README.txt, } \cs_new_nopar:Npn \@@_curveto:nnnnnn #1#2#3#4#5#6 { +% -- +(5 pt, 0) -- +(0 pt, 0pt) +% -- +(#1 pt, #2 pt) -- (#5 pt + #3 pt, #6 pt + #4 pt) -- (#5 pt, #6 pt) .. controls +(#1 pt, #2 pt) and +(#3 pt, #4 pt) .. (#5 pt, #6 pt) } diff --git a/Master/texmf-dist/source/latex/braids/braids_code.ins b/Master/texmf-dist/source/latex/braids/braids_code.ins index 4e3678839fd..ac1a171afac 100644 --- a/Master/texmf-dist/source/latex/braids/braids_code.ins +++ b/Master/texmf-dist/source/latex/braids/braids_code.ins @@ -26,7 +26,7 @@ See http://www.latex-project.org/lppl.txt \endpreamble \postamble -Copyright (C) 2011-2019 by Andrew Stacey <loopspace@mathforge.org> +Copyright (C) 2011-2022 by Andrew Stacey <loopspace@mathforge.org> This work may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either @@ -58,7 +58,7 @@ and the derived files README.txt, \endbatchfile %% -%% Copyright (C) 2011-2019 by Andrew Stacey <loopspace@mathforge.org> +%% Copyright (C) 2011-2022 by Andrew Stacey <loopspace@mathforge.org> %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either diff --git a/Master/texmf-dist/tex/latex/braids/braids.sty b/Master/texmf-dist/tex/latex/braids/braids.sty index d9976eec067..4a9959fdd12 100644 --- a/Master/texmf-dist/tex/latex/braids/braids.sty +++ b/Master/texmf-dist/tex/latex/braids/braids.sty @@ -561,7 +561,7 @@ \pgfkeys{/pgf/braid/.cd,#1}} %% -%% Copyright (C) 2011-2019 by Andrew Stacey <loopspace@mathforge.org> +%% Copyright (C) 2011-2022 by Andrew Stacey <loopspace@mathforge.org> %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either diff --git a/Master/texmf-dist/tex/latex/braids/tikzlibrarybraids.code.tex b/Master/texmf-dist/tex/latex/braids/tikzlibrarybraids.code.tex index 6bef1d8b8ce..aef3c26d330 100644 --- a/Master/texmf-dist/tex/latex/braids/tikzlibrarybraids.code.tex +++ b/Master/texmf-dist/tex/latex/braids/tikzlibrarybraids.code.tex @@ -13,7 +13,7 @@ %% ---------------------------------------------------------------- %% \ProvidesFile{tikzlibrarybraids.code.tex}[% - 2019/03/20 v2.0 Tikz/PGF library for drawing braid diagrams% + 2022/10/26 v2.2 Tikz/PGF library for drawing braid diagrams% ] \RequirePackage{expl3} \ExplSyntaxOn @@ -36,11 +36,19 @@ \fp_new:N \l__braid_anchor_x_fp \fp_new:N \l__braid_anchor_y_fp \int_new:N \l__braid_tmpa_int +\int_new:N \l__braid_tmpb_int \int_new:N \l__braid_length_int \int_new:N \l__braid_strands_int \int_new:N \l__braid_crossing_int +\int_new:N \l__braid_crossing_start_int +\int_new:N \l__braid_crossing_end_int +\int_new:N \l__braid_crossing_width_int +\int_new:N \l__braid_crossing_long_int +\int_new:N \l__braid_crossing_start_factor_int +\int_new:N \l__braid_crossing_end_factor_int \int_new:N \l__braid_anchor_level_int \int_new:N \l__braid_floor_int +\seq_new:N \l__braid_tmpa_seq \seq_new:N \l__braid_word_seq \seq_new:N \l__braid_crossing_seq \seq_new:N \l__braid_anchor_seq @@ -64,19 +72,16 @@ \prop_new:N \l__braid_crossing_permutation_prop \prop_new:N \l__braid_inverse_prop \prop_new:N \l__braid_anchor_prop +\cs_generate_variant:Nn \seq_set_split:Nnn {NVn} \tikzset{ braid/.pic={ - code={ - \__braid_parse_word:n {#1} - \__braid_count: - \__braid_render: - } + \__braid_parse_word:n {#1} + \__braid_count: + \__braid_render: }, floor/.pic={ - code={ - \path[pic~ actions, draw=none] (0,0) rectangle (1,1); - \path[pic~ actions, fill=none] (0,0) -- (1,0) (0,1) -- (1,1); - } + \path[pic~ actions, draw=none] (0,0) rectangle (1,1); + \path[pic~ actions, fill=none] (0,0) -- (1,0) (0,1) -- (1,1); }, /tikz/braid/.search~ also={/tikz}, braid/.cd, @@ -174,15 +179,35 @@ } \cs_new_nopar:Npn \__braid_parse_index:n #1 { - \seq_set_from_clist:Nn \l__braid_crossing_seq {#1} + \seq_clear:N \l__braid_crossing_seq + \clist_map_inline:nn {#1} + { + \tl_if_in:nnTF {##1} {-} + { + \seq_set_split:Nnn \l__braid_tmpa_seq {-} {##1} + \int_compare:nTF {\seq_item:Nn \l__braid_tmpa_seq {1} < \seq_item:Nn \l__braid_tmpa_seq {2} } + { + \int_set:Nn \l__braid_tmpa_int {1} + } + { + \int_set:Nn \l__braid_tmpa_int {-1} + } + \int_step_inline:nnnn {\seq_item:Nn \l__braid_tmpa_seq {1}} {\l__braid_tmpa_int} {\seq_item:Nn \l__braid_tmpa_seq {2}} + { + \seq_put_right:Nn \l__braid_crossing_seq {####1} + } + } + { + \seq_put_right:Nn \l__braid_crossing_seq {##1} + } + } \int_compare:nT {\seq_count:N \l__braid_crossing_seq == 1} { \seq_put_right:Nx \l__braid_crossing_seq {\int_eval:n {#1 + 1} } } - \bool_if:NT \l__braid_swap_crossing_bool + \bool_if:NF \l__braid_swap_crossing_bool { - \seq_pop_left:NN \l__braid_crossing_seq \l__braid_tmpa_tl - \seq_put_right:NV \l__braid_crossing_seq \l__braid_tmpa_tl + \seq_reverse:N \l__braid_crossing_seq } } \cs_new_nopar:Npn \__braid_parse_exponent:n #1 @@ -219,15 +244,11 @@ } \seq_if_empty:NF \l__braid_crossing_seq { - \int_set:Nn \l__braid_strands_int + \seq_map_inline:Nn \l__braid_crossing_seq { - \int_max:nn - { - \int_max:nn {\l__braid_strands_int} - { \seq_item:Nn \l__braid_crossing_seq {1}} - } + \int_set:Nn \l__braid_strands_int { - \seq_item:Nn \l__braid_crossing_seq {2} + \int_max:nn {\l__braid_strands_int} {####1} } } } @@ -239,32 +260,39 @@ \prop_put:Nnn \l__braid_crossing_permutation_prop {##1} {##1} } \tl_set:Nx \l__braid_tmpa_tl {\__braid_value:n {anchor}} - \seq_set_split:NnV \l__braid_anchor_seq {-} \l__braid_tmpa_tl - - \tl_set:Nx \l__braid_tmpa_tl {\seq_item:Nn \l__braid_anchor_seq {1}} - \tl_if_eq:VnTF \l__braid_tmpa_tl {rev} - { - \tl_set:Nx \l__braid_anchor_strand_tl {\seq_item:Nn \l__braid_anchor_seq {2}} - \tl_set:Nx \l__braid_anchor_level_tl {\seq_item:Nn \l__braid_anchor_seq {3}} - } - { - \tl_set:Nx \l__braid_anchor_strand_tl {\seq_item:Nn \l__braid_anchor_seq {1}} - \tl_set:Nx \l__braid_anchor_level_tl {\seq_item:Nn \l__braid_anchor_seq {2}} - } - \tl_if_eq:VnTF \l__braid_anchor_level_tl {s} + \tl_if_in:NnTF \l__braid_tmpa_tl {-} { - \int_set:Nn \l__braid_anchor_level_int {-1} - } - { - \tl_if_eq:VnTF \l__braid_anchor_level_tl {e} + \seq_set_split:NnV \l__braid_anchor_seq {-} \l__braid_tmpa_tl + + \tl_set:Nx \l__braid_tmpa_tl {\seq_item:Nn \l__braid_anchor_seq {1}} + \tl_if_eq:VnTF \l__braid_tmpa_tl {rev} + { + \tl_set:Nx \l__braid_anchor_strand_tl {\seq_item:Nn \l__braid_anchor_seq {2}} + \tl_set:Nx \l__braid_anchor_level_tl {\seq_item:Nn \l__braid_anchor_seq {3}} + } + { + \tl_set:Nx \l__braid_anchor_strand_tl {\seq_item:Nn \l__braid_anchor_seq {1}} + \tl_set:Nx \l__braid_anchor_level_tl {\seq_item:Nn \l__braid_anchor_seq {2}} + } + \tl_if_eq:VnTF \l__braid_anchor_level_tl {s} { \int_set:Nn \l__braid_anchor_level_int {-1} } { - \int_set:Nn \l__braid_anchor_level_int - {\tl_use:N \l__braid_anchor_level_tl} + \tl_if_eq:VnTF \l__braid_anchor_level_tl {e} + { + \int_set:Nn \l__braid_anchor_level_int {-1} + } + { + \int_set:Nn \l__braid_anchor_level_int + {\tl_use:N \l__braid_anchor_level_tl} + } } } + { + \int_set:Nn \l__braid_anchor_level_int {-1} + \tl_set:Nn \l__braid_anchor_strand_tl {-1} + } \int_zero:N \l__braid_crossing_int \int_incr:N \l__braid_crossing_int @@ -276,23 +304,29 @@ ##1 \seq_if_empty:NF \l__braid_crossing_seq { - \prop_get:NxN \l__braid_permutation_prop - { - \seq_item:Nn \l__braid_crossing_seq {1} - } \l__braid_tmpa_tl - \prop_get:NxN \l__braid_permutation_prop + \int_step_inline:nnn {2} {\seq_count:N \l__braid_crossing_seq} { - \seq_item:Nn \l__braid_crossing_seq {2} - } \l__braid_tmpb_tl + \int_set:Nn \l__braid_tmpa_int {####1} + \int_set:Nn \l__braid_tmpb_int {####1 - 1} - \prop_put:NxV \l__braid_permutation_prop - { - \seq_item:Nn \l__braid_crossing_seq {2} - } \l__braid_tmpa_tl - \prop_put:NxV \l__braid_permutation_prop - { - \seq_item:Nn \l__braid_crossing_seq {1} - } \l__braid_tmpb_tl + \prop_get:NxN \l__braid_permutation_prop + { + \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + } \l__braid_tmpa_tl + \prop_get:NxN \l__braid_permutation_prop + { + \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int} + } \l__braid_tmpb_tl + + \prop_put:NxV \l__braid_permutation_prop + { + \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int} + } \l__braid_tmpa_tl + \prop_put:NxV \l__braid_permutation_prop + { + \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + } \l__braid_tmpb_tl + } } \int_compare:nT {\l__braid_crossing_int = \l__braid_anchor_level_int} { @@ -314,22 +348,25 @@ \prop_get:NnN \l__braid_permutation_prop {##1} \l__braid_tmpa_tl \prop_put:NVn \l__braid_inverse_prop \l__braid_tmpa_tl {##1} } - \tl_set:Nx \l__braid_tmpa_tl {\seq_item:Nn \l__braid_anchor_seq {1}} - \tl_if_eq:VnT \l__braid_tmpa_tl {rev} - { - \prop_get:NVN \l__braid_permutation_prop - \l__braid_anchor_strand_tl \l__braid_anchor_strand_tl - } - \tl_if_eq:VnF \l__braid_anchor_level_tl {s} + \tl_if_eq:VnF \l__braid_anchor_strand_tl {-1} { - \tl_if_eq:VnTF \l__braid_anchor_level_tl {e} + \tl_set:Nx \l__braid_tmpa_tl {\seq_item:Nn \l__braid_anchor_seq {1}} + \tl_if_eq:VnT \l__braid_tmpa_tl {rev} { - \prop_get:NVN \l__braid_inverse_prop + \prop_get:NVN \l__braid_permutation_prop \l__braid_anchor_strand_tl \l__braid_anchor_strand_tl } + \tl_if_eq:VnF \l__braid_anchor_level_tl {s} { - \prop_get:NVN \l__braid_anchor_prop - \l__braid_anchor_strand_tl \l__braid_anchor_strand_tl + \tl_if_eq:VnTF \l__braid_anchor_level_tl {e} + { + \prop_get:NVN \l__braid_inverse_prop + \l__braid_anchor_strand_tl \l__braid_anchor_strand_tl + } + { + \prop_get:NVN \l__braid_anchor_prop + \l__braid_anchor_strand_tl \l__braid_anchor_strand_tl + } } } } @@ -349,26 +386,79 @@ \cs_new_nopar:Npn \__braid_render: { - \fp_set:Nn \l__braid_anchor_x_fp { - 1 * (\tl_use:N \l__braid_anchor_strand_tl - 1) * \__braid_dim_value:n {width} } - - \tl_if_eq:VnTF \l__braid_anchor_level_tl {s} + \tl_if_eq:VnTF \l__braid_anchor_strand_tl {-1} { - \fp_set:Nn \l__braid_anchor_y_fp {0} + \tl_set:cn {pgf@sh@ns@temporary braid node}{rectangle} + \tl_set:cx {pgf@sh@np@temporary braid node}{% + \exp_not:N\def + \exp_not:N\southwest + { + \exp_not:N\pgfqpoint + {0pt} + {0pt} + } + \exp_not:N\def + \exp_not:N\northeast + { + \exp_not:N\pgfqpoint + { + \fp_to_dim:n + { + (\l__braid_strands_int - 1) + * + abs(\__braid_dim_value:n {width}) + } + } + { + \fp_to_dim:n + { + \l__braid_length_int * abs(\__braid_dim_value:n {height}) + + 2 * \__braid_dim_value:n {border~ height} + } + } + } + }% + \pgfgettransform\l__braid_tmpa_tl + \tl_set:cV {pgf@sh@nt@temporary braid node} \l__braid_tmpa_tl + \tl_set:cV {pgf@sh@pi@temporary braid node} \pgfpictureid + \pgfpointanchor{temporary braid node} {\__braid_value:n {anchor}} + \fp_set:Nn \l__braid_anchor_x_fp { + - \dim_use:c {pgf@x} + - (1 - sign(\__braid_dim_value:n {width})) / 2 + * (\l__braid_strands_int - 1) + * \__braid_dim_value:n {width} + } + \fp_set:Nn \l__braid_anchor_y_fp { + - \dim_use:c {pgf@y} + - (1 - sign(\__braid_dim_value:n {height})) / 2 + * ( + \l__braid_length_int * abs(\__braid_dim_value:n {height}) + + 2 * \__braid_dim_value:n {border~ height} + ) * sign(\__braid_dim_value:n {height}) + } } { - \tl_if_eq:VnTF \l__braid_anchor_level_tl {e} + \fp_set:Nn \l__braid_anchor_x_fp { - 1 * (\tl_use:N \l__braid_anchor_strand_tl - 1) * \__braid_dim_value:n {width} } + + \tl_if_eq:VnTF \l__braid_anchor_level_tl {s} { - \fp_set:Nn \l__braid_anchor_y_fp { - -1 * \l__braid_length_int * \__braid_dim_value:n {height} - - sign(\__braid_dim_value:n {height}) - * 2 * \__braid_dim_value:n {border~ height} - } + \fp_set:Nn \l__braid_anchor_y_fp {0} } { - \fp_set:Nn \l__braid_anchor_y_fp { - -1 * \l__braid_anchor_level_tl * \__braid_dim_value:n {height} - - sign(\__braid_dim_value:n {height}) - * \__braid_dim_value:n {border~ height} + \tl_if_eq:VnTF \l__braid_anchor_level_tl {e} + { + \fp_set:Nn \l__braid_anchor_y_fp { + -1 * \l__braid_length_int * \__braid_dim_value:n {height} + - sign(\__braid_dim_value:n {height}) + * 2 * \__braid_dim_value:n {border~ height} + } + } + { + \fp_set:Nn \l__braid_anchor_y_fp { + -1 * \l__braid_anchor_level_tl * \__braid_dim_value:n {height} + - sign(\__braid_dim_value:n {height}) + * \__braid_dim_value:n {border~ height} + } } } } @@ -482,178 +572,279 @@ } \seq_if_empty:NF \l__braid_crossing_seq { + \int_set:Nn \l__braid_crossing_long_int + { + % \seq_item:Nn \l__braid_crossing_seq {\seq_count:N \l__braid_crossing_seq} + \seq_item:Nn \l__braid_crossing_seq {1} + } + \int_set:Nn \l__braid_crossing_start_int + { + \int_min:nn + { + \seq_item:Nn \l__braid_crossing_seq {1} + } + { + \seq_item:Nn \l__braid_crossing_seq {\seq_count:N \l__braid_crossing_seq} + } + } + \int_set:Nn \l__braid_crossing_end_int + { + \int_max:nn + { + \seq_item:Nn \l__braid_crossing_seq {1} + } + { + \seq_item:Nn \l__braid_crossing_seq {\seq_count:N \l__braid_crossing_seq} + } + + } + \int_set:Nn \l__braid_crossing_width_int + { + \l__braid_crossing_end_int + - + \l__braid_crossing_start_int + } + \int_step_inline:nnn {2} {\seq_count:N \l__braid_crossing_seq} + { + \int_set:Nn \l__braid_tmpa_int {####1} + \int_set:Nn \l__braid_tmpb_int {####1 - 1} \prop_get:NxN \l__braid_crossing_permutation_prop - {\seq_item:Nn \l__braid_crossing_seq {1}} \l__braid_tmpa_tl + {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int}} \l__braid_tmpa_tl \prop_get:NxN \l__braid_crossing_permutation_prop - {\seq_item:Nn \l__braid_crossing_seq {2}} \l__braid_tmpb_tl + {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}} \l__braid_tmpb_tl \prop_put:NxV \l__braid_crossing_permutation_prop - {\seq_item:Nn \l__braid_crossing_seq {2}} \l__braid_tmpa_tl + {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}} \l__braid_tmpa_tl \prop_put:NxV \l__braid_crossing_permutation_prop - {\seq_item:Nn \l__braid_crossing_seq {1}} \l__braid_tmpb_tl + {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int}} \l__braid_tmpb_tl \prop_get:NxN \l__braid_strands_prop - {\seq_item:Nn \l__braid_crossing_seq {1}} \l__braid_tmpa_tl + {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int}} \l__braid_tmpa_tl \prop_get:NxN \l__braid_strands_prop - {\seq_item:Nn \l__braid_crossing_seq {2}} \l__braid_tmpb_tl + {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}} \l__braid_tmpb_tl + \int_set:Nn \l__braid_crossing_start_factor_int {0} + \int_set:Nn \l__braid_crossing_end_factor_int {0} + + \int_compare:nT { + ####1 = \seq_count:N \l__braid_crossing_seq + } + { + \int_set:Nn \l__braid_crossing_end_factor_int {1} + } + \int_compare:nT { + ####1 = 2 + } + { + \int_set:Nn \l__braid_crossing_start_factor_int {1} + } + \tl_put_right:Nx \l__braid_tmpa_tl { \exp_not:N \__braid_lineto:nn {\fp_eval:n { - (\seq_item:Nn \l__braid_crossing_seq {1} - 1) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} - 1) * \__braid_dim_value:n {width} } } - {\fp_eval:n { \l__braid_height_fp + \l__braid_nudge_fp } } + {\fp_eval:n { \l__braid_height_fp + \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + + \__braid_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l__braid_crossing_seq - 1) + } } \exp_not:N \__braid_curveto:nnnnnn {0} - {\fp_eval:n { \l__braid_control_fp}} + {\fp_eval:n { \l__braid_control_fp + * 1/(\seq_count:N \l__braid_crossing_seq - 1)}} {0} - {\fp_eval:n {- \l__braid_control_fp}} + {\fp_eval:n {- \l__braid_control_fp + * 1/(\seq_count:N \l__braid_crossing_seq - 1)}} {\fp_eval:n { - (\seq_item:Nn \l__braid_crossing_seq {2} - 1) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int} - 1) * \__braid_dim_value:n {width} } } {\fp_eval:n { \l__braid_height_fp - + \__braid_dim_value:n {height} - - \l__braid_nudge_fp + + \__braid_dim_value:n {height} * (####1 - 1)/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int } } } + \int_set:Nn \l__braid_crossing_start_factor_int {0} + \int_set:Nn \l__braid_crossing_end_factor_int {0} + + \int_compare:nT { + ####1 = \seq_count:N \l__braid_crossing_seq + } + { + \int_set:Nn \l__braid_crossing_end_factor_int {1} + } + \int_compare:nT { + ####1 = 2 + } + { + \int_set:Nn \l__braid_crossing_start_factor_int {1} + } + \tl_put_right:Nx \l__braid_tmpb_tl { \exp_not:N \__braid_lineto:nn {\fp_eval:n { - (\seq_item:Nn \l__braid_crossing_seq {2} - 1) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int} - 1) * \__braid_dim_value:n {width} } } - {\fp_eval:n { \l__braid_height_fp + \l__braid_nudge_fp } } + {\fp_eval:n { \l__braid_height_fp + \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + + \__braid_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l__braid_crossing_seq - 1) + + } } \exp_not:N \__braid_curveto:nnnnnn {0} { \fp_eval:n { - \l__braid_control_fp * (.5 - \__braid_value:n {gap} ) + \l__braid_control_fp * (.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) ) * 1/(\seq_count:N \l__braid_crossing_seq - 1) } } { \fp_eval:n { - - (.5 - \__braid_value:n {gap} ) / 3 * + - (.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) ) / 3 * \__braid_bezier_tangent:nnnnn - {.5 - \__braid_value:n {gap} } + {.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) } {0} {0} { - (\seq_item:Nn \l__braid_crossing_seq {1} - - \seq_item:Nn \l__braid_crossing_seq {2}) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + - \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}) * \__braid_dim_value:n {width} } { - (\seq_item:Nn \l__braid_crossing_seq {1} - - \seq_item:Nn \l__braid_crossing_seq {2}) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + - \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}) * \__braid_dim_value:n {width} } } } { \fp_eval:n { - -(.5 - \__braid_value:n {gap} ) / 3 * + -(.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) ) / 3 * \__braid_bezier_tangent:nnnnn - {.5 - \__braid_value:n {gap} } + {.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) } {0} - {\l__braid_control_fp} { - \__braid_dim_value:n {height} - - 2* \l__braid_nudge_fp - - \l__braid_control_fp + \l__braid_control_fp * 1/(\seq_count:N \l__braid_crossing_seq - 1) + } + { + \__braid_dim_value:n {height} * 1/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int + - \l__braid_control_fp * 1/(\seq_count:N \l__braid_crossing_seq - 1) + } + { + \__braid_dim_value:n {height} * 1/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int } - {\__braid_dim_value:n {height} - 2* \l__braid_nudge_fp} } } { \fp_eval:n { - (\seq_item:Nn \l__braid_crossing_seq {2} - 1) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int} - 1) * \__braid_dim_value:n {width} + \__braid_bezier_point:nnnnn - {.5 - \__braid_value:n {gap} } + {.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) } {0} {0} { - (\seq_item:Nn \l__braid_crossing_seq {1} - - \seq_item:Nn \l__braid_crossing_seq {2}) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + - \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}) * \__braid_dim_value:n {width} } { - (\seq_item:Nn \l__braid_crossing_seq {1} - - \seq_item:Nn \l__braid_crossing_seq {2}) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + - \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}) * \__braid_dim_value:n {width} } } } { \fp_eval:n { - \l__braid_height_fp + \l__braid_nudge_fp + + \l__braid_height_fp + + \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + + \__braid_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l__braid_crossing_seq - 1) + + \__braid_bezier_point:nnnnn - {.5 - \__braid_value:n {gap} } + {.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) } {0} - {\l__braid_control_fp} { - \__braid_dim_value:n {height} - - 2* \l__braid_nudge_fp - - \l__braid_control_fp + \l__braid_control_fp * 1/(\seq_count:N \l__braid_crossing_seq - 1) + } + { + \__braid_dim_value:n {height} * 1/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int + - \l__braid_control_fp * 1/(\seq_count:N \l__braid_crossing_seq - 1) + } + {\__braid_dim_value:n {height} * 1/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int } - {\__braid_dim_value:n {height} - 2* \l__braid_nudge_fp} } } \exp_not:N \__braid_moveto:nn { \fp_eval:n { - (\seq_item:Nn \l__braid_crossing_seq {2} - 1) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int} - 1) * \__braid_dim_value:n {width} + \__braid_bezier_point:nnnnn - {.5 + \__braid_value:n {gap} } + {.5 + \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) } {0} {0} { - (\seq_item:Nn \l__braid_crossing_seq {1} - - \seq_item:Nn \l__braid_crossing_seq {2}) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + - \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}) * \__braid_dim_value:n {width} } { - (\seq_item:Nn \l__braid_crossing_seq {1} - - \seq_item:Nn \l__braid_crossing_seq {2}) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + - \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}) * \__braid_dim_value:n {width} } } } { \fp_eval:n { - \l__braid_height_fp + \l__braid_nudge_fp + + \l__braid_height_fp + + \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + + \__braid_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l__braid_crossing_seq - 1) + + \__braid_bezier_point:nnnnn - {.5 + \__braid_value:n {gap} } + {.5 + \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) } {0} - {\l__braid_control_fp} { - \__braid_dim_value:n {height} - 2* \l__braid_nudge_fp - - \l__braid_control_fp + \l__braid_control_fp * 1/(\seq_count:N \l__braid_crossing_seq - 1) + } + { + \__braid_dim_value:n {height} * 1/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int + - \l__braid_control_fp * 1/(\seq_count:N \l__braid_crossing_seq - 1) + } + {\__braid_dim_value:n {height} * 1/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int } - {\__braid_dim_value:n {height} - 2* \l__braid_nudge_fp} } } @@ -661,78 +852,86 @@ { \fp_eval:n { - (.5 - \__braid_value:n {gap} ) / 3 * + (.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) ) / 3 * \__braid_bezier_tangent:nnnnn - {.5 + \__braid_value:n {gap} } + {.5 + \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) } {0} {0} { - (\seq_item:Nn \l__braid_crossing_seq {1} - - \seq_item:Nn \l__braid_crossing_seq {2}) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + - \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}) * \__braid_dim_value:n {width} } { - (\seq_item:Nn \l__braid_crossing_seq {1} - - \seq_item:Nn \l__braid_crossing_seq {2}) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + - \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}) * \__braid_dim_value:n {width} } } } { \fp_eval:n { - (.5 - \__braid_value:n {gap} ) / 3 * + (.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) ) / 3 * \__braid_bezier_tangent:nnnnn - {.5 + \__braid_value:n {gap} } + {.5 + \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) } {0} - {\l__braid_control_fp} { - \__braid_dim_value:n {height} - 2* \l__braid_nudge_fp - - \l__braid_control_fp + \l__braid_control_fp * 1/(\seq_count:N \l__braid_crossing_seq - 1) + } + { + \__braid_dim_value:n {height} * 1/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int + - \l__braid_control_fp * 1/(\seq_count:N \l__braid_crossing_seq - 1) + } + {\__braid_dim_value:n {height} * 1/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_start_factor_int + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int } - {\__braid_dim_value:n {height} - 2* \l__braid_nudge_fp} } } {0} - { \fp_eval:n { - -\l__braid_control_fp * (.5 - \__braid_value:n {gap} ) - } + {\fp_eval:n { + - \l__braid_control_fp * (.5 - \__braid_value:n {gap} * (\seq_count:N \l__braid_crossing_seq - 1) ) + * 1/(\seq_count:N \l__braid_crossing_seq - 1)} } {\fp_eval:n { - (\seq_item:Nn \l__braid_crossing_seq {1} - 1) + (\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} - 1) * \__braid_dim_value:n {width} } } {\fp_eval:n { - \l__braid_height_fp + \__braid_dim_value:n {height} - - \l__braid_nudge_fp + \l__braid_height_fp + + \__braid_dim_value:n {height} * (####1 - 1)/(\seq_count:N \l__braid_crossing_seq - 1) + - \l__braid_nudge_fp * \l__braid_crossing_end_factor_int } } } \prop_put:NxV \l__braid_strands_prop - {\seq_item:Nn \l__braid_crossing_seq {2}} \l__braid_tmpa_tl + {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}} \l__braid_tmpa_tl \prop_put:NxV \l__braid_strands_prop - {\seq_item:Nn \l__braid_crossing_seq {1}} \l__braid_tmpb_tl + {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int}} \l__braid_tmpb_tl \int_compare:nT { \int_max:nn { - \seq_item:Nn \l__braid_crossing_seq {1} + \seq_item:Nn \l__braid_crossing_seq {####1 - 1} } { - \seq_item:Nn \l__braid_crossing_seq {2} + \seq_item:Nn \l__braid_crossing_seq {####1} } - \int_min:nn { - \seq_item:Nn \l__braid_crossing_seq {1} + \seq_item:Nn \l__braid_crossing_seq {####1 - 1} } { - \seq_item:Nn \l__braid_crossing_seq {2} + \seq_item:Nn \l__braid_crossing_seq {####1} } > 1 } @@ -741,49 +940,73 @@ { \int_min:nn { - \seq_item:Nn \l__braid_crossing_seq {1} + \seq_item:Nn \l__braid_crossing_seq {####1 - 1} } { - \seq_item:Nn \l__braid_crossing_seq {2} + \seq_item:Nn \l__braid_crossing_seq {####1} } + 1} {1} { \int_max:nn { - \seq_item:Nn \l__braid_crossing_seq {1} + \seq_item:Nn \l__braid_crossing_seq {####1 - 1} } { - \seq_item:Nn \l__braid_crossing_seq {2} + \seq_item:Nn \l__braid_crossing_seq {####1} } - 1 } { - \prop_get:NnN \l__braid_strands_prop {####1} \l__braid_tmpa_tl + \prop_get:NnN \l__braid_strands_prop {########1} \l__braid_tmpa_tl \tl_put_right:Nx \l__braid_tmpa_tl { \exp_not:N \__braid_lineto:nn - {\fp_eval:n {(####1 - 1) * \__braid_dim_value:n {width} }} + {\fp_eval:n {(########1 - 1) * \__braid_dim_value:n {width} }} {\fp_eval:n { \l__braid_height_fp + \l__braid_nudge_fp - + .5 * \l__braid_control_fp + + .5 * \l__braid_control_fp / (\seq_count:N \l__braid_crossing_seq - 1) + + \__braid_dim_value:n {height} * (####1 - 2)/(\seq_count:N \l__braid_crossing_seq - 1) } } \exp_not:N \__braid_moveto:nn - {\fp_eval:n {(####1 - 1) * \__braid_dim_value:n {width} }} + {\fp_eval:n {(########1 - 1) * \__braid_dim_value:n {width} }} {\fp_eval:n { - \l__braid_height_fp + \__braid_dim_value:n {height} - - \l__braid_nudge_fp - .5 * \l__braid_control_fp + \l__braid_height_fp + - \l__braid_nudge_fp - .5 * \l__braid_control_fp / (\seq_count:N \l__braid_crossing_seq - 1) + + \__braid_dim_value:n {height} * (####1 - 1)/(\seq_count:N \l__braid_crossing_seq - 1) } } } - \prop_put:NnV \l__braid_strands_prop {####1} \l__braid_tmpa_tl + \prop_put:NnV \l__braid_strands_prop {########1} \l__braid_tmpa_tl } } + \int_compare:nTF + { + \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int} + = + \l__braid_crossing_long_int + } + { + \int_set:Nn \l__braid_crossing_long_int {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int}} + } + { + \int_compare:nT + { + \seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpb_int} + = + \l__braid_crossing_long_int + } + { + \int_set:Nn \l__braid_crossing_long_int {\seq_item:Nn \l__braid_crossing_seq {\l__braid_tmpa_int}} + } + + } + } } \bool_if:NT \l__braid_step_level_bool { @@ -833,6 +1056,65 @@ \prop_get:NnN \l__braid_strands_prop {##1} \l__braid_tmpa_tl \tl_use:N \l__braid_tmpa_tl } + \tl_if_empty:cF {tikz@fig@name} + { + \tl_gset:cn {pgf@sh@ns@ \tl_use:c{tikz@fig@name} }{rectangle} + \tl_gset:cx {pgf@sh@np@ \tl_use:c{tikz@fig@name} }{% + \exp_not:N\def + \exp_not:N\southwest + { + \exp_not:N\pgfqpoint + { + \fp_to_dim:n + { + min(0, + (\l__braid_strands_int - 1) + * + (\__braid_dim_value:n {width}) + ) + } + } + { + \fp_to_dim:n + { + min(0, + \l__braid_length_int * (\__braid_dim_value:n {height}) + + 2 * sign(\__braid_dim_value:n {height}) * + \__braid_dim_value:n {border~ height} + ) + } + } + } + \exp_not:N\def + \exp_not:N\northeast + { + \exp_not:N\pgfqpoint + { + \fp_to_dim:n + { + max(0, + (\l__braid_strands_int - 1) + * + (\__braid_dim_value:n {width}) + ) + } + } + { + \fp_to_dim:n + { + max(0, + \l__braid_length_int * (\__braid_dim_value:n {height}) + + 2 * sign(\__braid_dim_value:n {height}) * + \__braid_dim_value:n {border~ height} + ) + } + } + } + }% + \pgfgettransform\l__braid_tmpa_tl + \tl_gset:cV {pgf@sh@nt@ \tl_use:c{tikz@fig@name} } \l__braid_tmpa_tl + \tl_gset:cV {pgf@sh@pi@ \tl_use:c{tikz@fig@name} } \pgfpictureid + } \end{scope} } \cs_new_nopar:Npn \__braid_moveto:nn #1#2 @@ -891,7 +1173,7 @@ \ExplSyntaxOff %% -%% Copyright (C) 2011-2019 by Andrew Stacey <loopspace@mathforge.org> +%% Copyright (C) 2011-2022 by Andrew Stacey <loopspace@mathforge.org> %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either |