diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/spath3/tikzlibraryknots.code.tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/spath3/tikzlibraryknots.code.tex | 876 |
1 files changed, 876 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/spath3/tikzlibraryknots.code.tex b/Master/texmf-dist/tex/latex/spath3/tikzlibraryknots.code.tex new file mode 100644 index 00000000000..2cc0806f588 --- /dev/null +++ b/Master/texmf-dist/tex/latex/spath3/tikzlibraryknots.code.tex @@ -0,0 +1,876 @@ +%% +%% This is file `tikzlibraryknots.code.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% spath3.dtx (with options: `knots') +%% ---------------------------------------------------------------- +%% spath3 --- Functions for manipulating PGF soft paths +%% E-mail: stacey@math.ntnu.no +%% Released under the LaTeX Project Public License v1.3c or later +%% See http://www.latex-project.org/lppl.txt +%% ---------------------------------------------------------------- +%% +%% +\RequirePackage{spath3} +\usetikzlibrary{intersections} + +\ExplSyntaxOn + +\tl_new:N \l__knot_tmpa_tl +\tl_new:N \l__knot_tmpb_tl +\tl_new:N \l__knot_tmpc_tl +\tl_new:N \l__knot_tmpd_tl +\tl_new:N \l__knot_tmpe_tl +\tl_new:N \l__knot_tmpf_tl +\tl_new:N \l__knot_tmpg_tl +\tl_new:N \l__knot_redraws_tl +\tl_new:N \l__knot_clip_width_tl +\tl_new:N \l__knot_name_tl +\tl_new:N \l__knot_node_tl + +\int_new:N \l__knot_tmpa_int +\int_new:N \l__knot_strands_int +\int_new:N \l__knot_intersections_int +\int_new:N \l__knot_filaments_int +\int_new:N \l__knot_component_start_int + +\dim_new:N \l__knot_tmpa_dim +\dim_new:N \l__knot_tmpb_dim +\dim_new:N \l__knot_tmpc_dim +\dim_new:N \l__knot_tolerance_dim +\dim_new:N \l__knot_clip_radius_dim + +\bool_new:N \l__knot_draft_bool +\bool_new:N \l__knot_ignore_ends_bool +\bool_new:N \l__knot_self_intersections_bool +\bool_new:N \l__knot_splits_bool +\bool_new:N \l__knot_super_draft_bool + +\bool_new:N \l__knot_prepend_prev_bool +\bool_new:N \l__knot_append_next_bool +\bool_new:N \l__knot_skip_bool + +\bool_set_true:N \l__knot_ignore_ends_bool +\tikzset{ + knot/.code={ + \tl_if_eq:nnTF {#1} {none} + { + \tikz@addmode{\tikz@mode@doublefalse} + } + { + \tikz@addmode{\tikz@mode@doubletrue} + \tl_if_empty:nTF {#1} + { + \pgfsetinnerstrokecolor{\tikz@strokecolor} + } + { + \pgfsetinnerstrokecolor{#1} + } + \tikz@addoption{\pgfsetstrokecolor{knotbg}} + \tl_set:Nn \tikz@double@setup{ + \pgfsetinnerlinewidth{\pgflinewidth} + \pgfsetlinewidth{\dim_eval:n {\tl_use:N \l__knot_gap_tl \pgflinewidth}} + } + } + }, + knot~ gap/.store~ in=\l__knot_gap_tl, + knot~ gap=3, + knot~ diagram/.is~family, + knot~ diagram/.unknown/.code={ + \tl_set_eq:NN \l__knot_tmpa_tl \pgfkeyscurrentname + \pgfkeysalso{ + /tikz/\l__knot_tmpa_tl=#1 + } + }, + background~ colour/.code={% + \colorlet{knotbg}{#1}% + }, + background~ color/.code={% + \colorlet{knotbg}{#1}% + }, + background~ colour=white, + knot~ diagram, + name/.store~in=\l__knot_name_tl, + name={knot}, + every~ strand/.style={draw}, + ignore~ endpoint~ intersections/.code={ + \tl_if_eq:nnTF {#1} {true} + { + \bool_set_true:N \l__knot_ignore_ends_bool + } + { + \bool_set_false:N \l__knot_ignore_ends_bool + } + }, + ignore~ endpoint~ intersections/.default=true, + consider~ self~ intersections/.is~choice, + consider~ self~ intersections/true/.code={ + \bool_set_true:N \l__knot_self_intersections_bool + \bool_set_true:N \l__knot_splits_bool + }, + consider~ self~ intersections/false/.code={ + \bool_set_false:N \l__knot_self_intersections_bool + \bool_set_false:N \l__knot_splits_bool + }, + consider~ self~ intersections/no~ splits/.code={ + \bool_set_true:N \l__knot_self_intersections_bool + \bool_set_false:N \l__knot_splits_bool + }, + consider~ self~ intersections/.default={true}, + clip~ radius/.code={ + \dim_set:Nn \l__knot_clip_radius_dim {#1} + }, + clip~ radius=10pt, + end~ tolerance/.code={ + \dim_set:Nn \l__knot_tolerance_dim {#1} + }, + end~ tolerance=14pt, + clip~ width/.code={ + \tl_set:Nn \l__knot_clip_width_tl {#1} + }, + clip~ width=3, + flip~ crossing/.code={% + \tl_clear_new:c {l__knot_crossing_#1} + \tl_set:cn {l__knot_crossing_#1} {x} + }, + draft~ mode/.is~ choice, + draft~ mode/off/.code={% + \bool_set_false:N \l__knot_draft_bool + \bool_set_false:N \l__knot_super_draft_bool + }, + draft~ mode/crossings/.code={% + \bool_set_true:N \l__knot_draft_bool + \bool_set_false:N \l__knot_super_draft_bool + }, + draft~ mode/strands/.code={% + \bool_set_true:N \l__knot_draft_bool + \bool_set_true:N \l__knot_super_draft_bool + }, + draft/.is~ family, + draft, + crossing~ label/.style={ + overlay, + fill=white, + fill~ opacity=.5, + text~ opacity=1, + text=blue, + pin~ edge={blue,<-} + }, + strand~ label/.style={ + overlay, + circle, + draw=purple, + fill=white, + fill~ opacity=.5, + text~ opacity=1, + text=purple, + inner~ sep=0pt + }, +} +\cs_new_nopar:Npn \knot_apply_style:N #1 +{ + \tl_if_exist:NT #1 { + \exp_args:NV \tikzset #1 + } +} +\cs_generate_variant:Nn \knot_apply_style:N {c} +\NewDocumentCommand \flipcrossings {m} +{ + \tikzset{knot~ diagram/flip~ crossing/.list={#1}}% +} +\NewDocumentCommand \strand { O{} } +{ + \int_incr:N \l__knot_strands_int + \tl_clear_new:c {l__knot_options_strand \int_use:N \l__knot_strands_int} + \tl_set:cn {l__knot_options_strand \int_use:N \l__knot_strands_int} {#1} + \path[#1,save~ spath=knot strand \int_use:N \l__knot_strands_int] +} +\NewDocumentEnvironment{knot} { O{} } +{ + \knot_initialise:n {#1} +} +{ + \knot_render: +} +\cs_new_protected_nopar:Npn \knot_initialise:n #1 +{ + \tikzset{knot~ diagram/.cd,every~ knot~ diagram/.try,#1} + \int_zero:N \l__knot_strands_int + \tl_clear:N \l__knot_redraws_tl +} +\cs_new_protected_nopar:Npn \knot_render: +{ + \pgfscope + \pgftransformreset + \int_step_function:nnnN {1} {1} {\l__knot_strands_int} \knot_draw_strand:n + \bool_if:NF \l__knot_super_draft_bool + { + \int_step_function:nnnN {1} {1} {\l__knot_strands_int} \knot_draw_labels:n + \bool_if:NTF \l__knot_self_intersections_bool + { + \knot_split_strands: + \int_set_eq:NN \l__knot_tmpa_int \l__knot_filaments_int + \tl_set:Nn \l__knot_prefix_tl {filament} + } + { + \int_set_eq:NN \l__knot_tmpa_int \l__knot_strands_int + \tl_set:Nn \l__knot_prefix_tl {strand} + } + \int_gzero:N \l__knot_intersections_int + \bool_if:NTF \l__knot_draft_bool + { + \tl_set:Nn \l__knot_node_tl + {\node[coordinate,pin={[knot~ diagram/draft/crossing~ label]{\int_use:N \l__knot_intersections_int}}]} + } + { + \tl_set:Nn \l__knot_node_tl {\node[coordinate]} + } + \int_step_variable:nnnNn {1} {1} {\l__knot_tmpa_int - 1} \l__knot_tmpa_tl + { + \int_step_variable:nnnNn {\tl_use:N \l__knot_tmpa_tl + 1} {1} {\l__knot_tmpa_int} \l__knot_tmpb_tl + { + \knot_intersections:VV \l__knot_tmpa_tl \l__knot_tmpb_tl + } + } + \tl_use:N \l__knot_redraws_tl + } + \endpgfscope +} +\cs_new_protected_nopar:Npn \knot_draw_strand:n #1 +{ + \pgfscope + \group_begin: + \tl_set:Nn \l_tmpa_tl {knot~ diagram/every~ strand/.try,} + \tl_put_right:Nv \l_tmpa_tl {l__knot_options_strand #1} + \tl_put_right:Nn \l_tmpa_tl {,knot~ diagram/only~ when~ rendering/.try,only~ when~ rendering/.try} + \spath_tikz_path:Vn \l_tmpa_tl {knot strand #1} + \group_end: + \endpgfscope +} +\cs_generate_variant:Nn \tl_put_right:Nn {Nv} +\cs_new_protected_nopar:Npn \knot_draw_labels:n #1 +{ + \bool_if:NT \l__knot_draft_bool + { + \spath_get:nnN {knot strand #1} {final point} \l__knot_tmpb_tl + \dim_set:Nn \l__knot_tmpa_dim {\tl_item:Nn \l__knot_tmpb_tl {1}} + \dim_set:Nn \l__knot_tmpb_dim {\tl_item:Nn \l__knot_tmpb_tl {2}} + \node[knot~ diagram/draft/strand~label] at (\l__knot_tmpa_dim,\l__knot_tmpb_dim) {#1}; + \spath_get:nnN {knot strand #1} {initial point} \l__knot_tmpb_tl + \dim_set:Nn \l__knot_tmpa_dim {\tl_item:Nn \l__knot_tmpb_tl {1}} + \dim_set:Nn \l__knot_tmpb_dim {\tl_item:Nn \l__knot_tmpb_tl {2}} + \node[knot~ diagram/draft/strand~label] at (\l__knot_tmpa_dim,\l__knot_tmpb_dim) {#1}; + } + \bool_if:nT { + \l__knot_self_intersections_bool + && + \l__knot_splits_bool + } + { + \tl_clear:N \l__knot_tmpa_tl + \spath_map_segment_function:nN {knot strand #1} \knot_split_self_intersects:NN + \spath_put:nnV {knot strand #1} {path} \l__knot_tmpa_tl + } +} +\cs_new_protected_nopar:Npn \knot_split_self_intersects:NN #1#2 +{ + \tl_case:Nnn #1 + { + \g__spath_curvetoa_tl + { + \fp_set:Nn \l_tmpa_fp + { + (\tl_item:Nn #2 {3} - 3 * \tl_item:Nn #2 {6} + 3 * \tl_item:Nn #2 {9} - \tl_item:Nn #2 {12}) + * + (3 * \tl_item:Nn #2 {8} - 3 * \tl_item:Nn #2 {11}) + - + (\tl_item:Nn #2 {2} - 3 * \tl_item:Nn #2 {5} + 3 * \tl_item:Nn #2 {8} - \tl_item:Nn #2 {11}) + * + (3 * \tl_item:Nn #2 {9} - 3 * \tl_item:Nn #2 {12}) + } + \fp_set:Nn \l_tmpb_fp + { + (\tl_item:Nn #2 {2} - 3 * \tl_item:Nn #2 {5} + 3 * \tl_item:Nn #2 {8} - \tl_item:Nn #2 {11}) + * + (3 * \tl_item:Nn #2 {6} - 6 * \tl_item:Nn #2 {9} + 3 * \tl_item:Nn #2 {12}) + - + (\tl_item:Nn #2 {3} - 3 * \tl_item:Nn #2 {6} + 3 * \tl_item:Nn #2 {9} - \tl_item:Nn #2 {12}) + * + (3 * \tl_item:Nn #2 {5} - 6 * \tl_item:Nn #2 {8} + 3 * \tl_item:Nn #2 {11}) + } + \fp_compare:nTF + { + \l_tmpb_fp != 0 + } + { + \fp_set:Nn \l_tmpa_fp {.5 * \l_tmpa_fp / \l_tmpb_fp} + \fp_compare:nTF + { + 0 < \l_tmpa_fp && \l_tmpa_fp < 1 + } + { + \spath_split_curve:VVNN \l_tmpa_fp #2 \l_tmpa_tl \l_tmpb_tl + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} + \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} + \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} + \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl + \tl_put_right:NV \l__knot_tmpa_tl \l_tmpb_tl + } + { + \tl_set_eq:NN \l_tmpa_tl #2 + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl + } + } + { + \tl_set_eq:NN \l_tmpa_tl #2 + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl + } + } + \g__spath_lineto_tl + { + \tl_set_eq:NN \l_tmpa_tl #2 + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} + \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl + } + } + { + \tl_put_right:NV \l__knot_tmpa_tl #2 + } +} +\cs_new_protected_nopar:Npn \knot_intersections:nn #1#2 +{ + \group_begin: + \tl_set_eq:NN \l__knot_tmpa_tl \l__knot_prefix_tl + \tl_put_right:Nn \l__knot_tmpa_tl {#1} + \tl_set_eq:NN \l__knot_tmpb_tl \l__knot_prefix_tl + \tl_put_right:Nn \l__knot_tmpb_tl {#2} + \spath_get:nnN {knot \tl_use:N \l__knot_tmpa_tl} {path} \l__knot_tmpc_tl + \spath_get:nnN {knot \tl_use:N \l__knot_tmpb_tl} {path} \l__knot_tmpd_tl + + \pgfintersectionofpaths{\pgfsetpath\l__knot_tmpc_tl}{\pgfsetpath\l__knot_tmpd_tl} + + \int_compare:nT {\pgfintersectionsolutions > 0} + { + \int_step_function:nnnN {1} {1} {\pgfintersectionsolutions} \knot_do_intersection:n + } + \group_end: +} +\cs_new_protected_nopar:Npn \knot_do_intersection:n #1 +{ + \pgfpointintersectionsolution{#1} + \dim_set:Nn \l__knot_tmpa_dim {\pgf@x} + \dim_set:Nn \l__knot_tmpb_dim {\pgf@y} + \bool_set_false:N \l__knot_skip_bool + \bool_if:NT \l__knot_self_intersections_bool + { + \tl_set:Nn \l_tmpa_tl {knot previous} + \tl_put_right:NV \l_tmpa_tl \l__knot_tmpa_tl + \tl_set:Nv \l_tmpa_tl \l_tmpa_tl + \tl_if_eq:NNT \l_tmpa_tl \l__knot_tmpb_tl + { + \knot_test_endpoint:VnT \l__knot_tmpb_tl {final point} + { + \bool_set_true:N \l__knot_skip_bool + } + } + + \tl_set:Nn \l_tmpa_tl {knot previous} + \tl_put_right:NV \l_tmpa_tl \l__knot_tmpb_tl + \tl_set:Nv \l_tmpa_tl \l_tmpa_tl + \tl_if_eq:NNT \l_tmpa_tl \l__knot_tmpa_tl + { + \knot_test_endpoint:VnT \l__knot_tmpa_tl {final point} + { + \bool_set_true:N \l__knot_skip_bool + } + } + } + \bool_if:NT \l__knot_ignore_ends_bool + { + \knot_test_endpoint:VnT \l__knot_tmpa_tl {initial point} + { + \bool_set_true:N \l__knot_skip_bool + } + \knot_test_endpoint:VnT \l__knot_tmpa_tl {final point} + { + \bool_set_true:N \l__knot_skip_bool + } + \knot_test_endpoint:VnT \l__knot_tmpb_tl {initial point} + { + \bool_set_true:N \l__knot_skip_bool + } + \knot_test_endpoint:VnT \l__knot_tmpb_tl {final point} + { + \bool_set_true:N \l__knot_skip_bool + } + } + \bool_if:NF \l__knot_skip_bool + { + + \int_gincr:N \l__knot_intersections_int + \bool_if:nTF + { + \tl_if_exist_p:c {l__knot_crossing_ \int_use:N + \l__knot_intersections_int} + && + ! \tl_if_empty_p:c {l__knot_crossing_ \int_use:N + \l__knot_intersections_int} + } + { + \tl_set_eq:NN \l__knot_tmpg_tl \l__knot_tmpb_tl + } + { + \tl_set_eq:NN \l__knot_tmpg_tl \l__knot_tmpa_tl + } + \bool_if:NT \l__knot_self_intersections_bool + { + \knot_test_endpoint:VnT \l__knot_tmpg_tl {initial point} + { + \bool_set_true:N \l__knot_prepend_prev_bool + } + { + \bool_set_false:N \l__knot_prepend_prev_bool + } + + \knot_test_endpoint:VnT \l__knot_tmpg_tl {final point} + { + \bool_set_true:N \l__knot_append_next_bool + } + { + \bool_set_false:N \l__knot_append_next_bool + } + \bool_if:nT + { + \l__knot_prepend_prev_bool || \l__knot_append_next_bool + } + { + \spath_clone:nn {knot \tl_use:N \l__knot_tmpg_tl} + {knot \tl_use:N \l__knot_prefix_tl -1} + + \tl_set_eq:cc {l__knot_options_ \tl_use:N \l__knot_prefix_tl -1} {l__knot_options_ \tl_use:N \l__knot_tmpg_tl} + + \bool_if:NT \l__knot_prepend_prev_bool + { + \spath_prepend_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot previous \tl_use:N \l__knot_tmpg_tl}} + \bool_if:NT \l__knot_splits_bool + { + \knot_test_endpoint:vnT {knot previous \tl_use:N \l__knot_tmpg_tl} {initial point} + { + \spath_get:nnN {knot \tl_use:N \l__knot_prefix_tl -1} {path} \l_tmpa_tl + \spath_prepend_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot previous \tl_use:c {knot previous \tl_use:N \l__knot_tmpg_tl}}} + \spath_get:nnN {knot \tl_use:N \l__knot_prefix_tl -1} {path} \l_tmpa_tl + + } + } + } + \bool_if:NT \l__knot_append_next_bool + { + \spath_append_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot next \tl_use:N \l__knot_tmpg_tl}} + \bool_if:NT \l__knot_splits_bool + { + \knot_test_endpoint:vnT {knot previous \tl_use:N \l__knot_tmpg_tl} {final point} + { + \spath_append_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot next \tl_use:c {knot next \tl_use:N \l__knot_tmpg_tl}}} + + } + } + } + + \tl_set:Nn \l__knot_tmpg_tl {\tl_use:N \l__knot_prefix_tl -1} + } + } + \group_begin: + \tikzset{knot~ diagram/intersection~ \int_use:N \l__knot_intersections_int/.try} + \knot_draw_crossing:nVV {\tl_use:N \l__knot_tmpg_tl} \l__knot_tmpa_dim \l__knot_tmpb_dim + \group_end: + \tl_use:N \l__knot_node_tl (\l__knot_name_tl \c_space_tl \int_use:N \l__knot_intersections_int) at (\l__knot_tmpa_dim, \l__knot_tmpb_dim) {}; + } +} + +\cs_generate_variant:Nn \knot_intersections:nn {VV} +\prg_new_conditional:Npnn \knot_test_endpoint:N #1 {p,T,F,TF} +{ + \dim_compare:nTF + { + \dim_abs:n {\pgf@x - \tl_item:Nn #1 {1}} + + + \dim_abs:n {\pgf@y - \tl_item:Nn #1 {2}} + < + \l__knot_tolerance_dim + } + { + \prg_return_true: + } + { + \prg_return_false: + } +} +\prg_new_protected_conditional:Npnn \knot_test_endpoint:nn #1#2 {T,F,TF} +{ + \spath_get:nnN {knot #1} {#2} \l__knot_tmpd_tl + \knot_test_endpoint:NTF \l__knot_tmpd_tl + { + \prg_return_true: + } + { + \prg_return_false: + } +} + +\cs_generate_variant:Nn \knot_test_endpoint:nnT {VnT,vnT} +\cs_generate_variant:Nn \knot_test_endpoint:nnF {VnF,vnF} +\cs_generate_variant:Nn \knot_test_endpoint:nnTF {VnTF,vnTF} +\cs_new_nopar:Npn \knot_draw_crossing:nnn #1#2#3 +{ + \group_begin: + \pgfscope + \clip (#2, #3) circle[radius=\l__knot_clip_radius_dim]; + + \tl_set:Nn \l_tmpa_tl {knot~ diagram/every~ strand/.try,} + \tl_if_exist:cT {l__knot_options_ #1} + { + \tl_put_right:Nv \l_tmpa_tl {l__knot_options_ #1} + } + \tl_put_right:Nn \l_tmpa_tl {,knotbg,line~ width= \tl_use:N \l__knot_clip_width_tl * \pgflinewidth} + \spath_tikz_path:Vn \l_tmpa_tl {knot #1} + + \endpgfscope + + \pgfscope + \clip (#2, #3) circle[radius=1.1\l__knot_clip_radius_dim]; + + \tl_set:Nn \l_tmpa_tl {knot~ diagram/every~ strand/.try,} + \tl_if_exist:cT {l__knot_options_ #1} + { + \tl_put_right:Nv \l_tmpa_tl {l__knot_options_ #1} + } + \tl_put_right:Nn \l_tmpa_tl {,knot~ diagram/only~ when~ rendering/.try,only~ when~ rendering/.try} + \spath_tikz_path:Vn \l_tmpa_tl {knot #1} + + \endpgfscope + \group_end: +} + +\cs_generate_variant:Nn \knot_draw_crossing:nnn {nVV} +\cs_new_protected_nopar:Npn \knot_split_strands: +{ + \int_gzero:N \l__knot_filaments_int + \int_step_function:nnnN {1} {1} {\l__knot_strands_int} \knot_split_strand:n + \int_step_function:nnnN {1} {1} {\l__knot_filaments_int} \knot_compute_nexts:n +} +\cs_new_protected_nopar:Npn \knot_compute_nexts:n #1 +{ + \tl_clear_new:c {knot next \tl_use:c {knot previous filament #1}} + \tl_set:cn {knot next \tl_use:c {knot previous filament #1}} {filament #1} +} +\cs_new_protected_nopar:Npn \knot_split_strand:n #1 +{ + \int_set_eq:NN \l__knot_component_start_int \l__knot_filaments_int + \int_incr:N \l__knot_component_start_int + \spath_map_segment_function:nN {knot strand #1} \knot_save_filament:NN +} +\cs_new_protected_nopar:Npn \knot_save_filament:NN #1#2 +{ + \tl_case:Nnn #1 + { + \g__spath_moveto_tl + { + \int_compare:nT {\l__knot_component_start_int < \l__knot_filaments_int} + { + \int_set_eq:NN \l__knot_component_start_int \l__knot_filaments_int + } + } + \g__spath_lineto_tl + { + \int_gincr:N \l__knot_filaments_int + \spath_clear_new:n {knot filament \int_use:N \l__knot_filaments_int} + \spath_put:nnV {knot filament \int_use:N \l__knot_filaments_int} {path} #2 + \tl_clear_new:c {knot previous filament \int_use:N \l__knot_filaments_int} + \int_compare:nF {\l__knot_component_start_int == \l__knot_filaments_int} + { + \tl_set:cx {knot previous filament \int_use:N \l__knot_filaments_int} {filament \int_eval:n {\l__knot_filaments_int - 1}} + } + } + \g__spath_curvetoa_tl + { + \int_gincr:N \l__knot_filaments_int + \spath_clear_new:n {knot filament \int_use:N \l__knot_filaments_int} + \spath_put:nnV {knot filament \int_use:N \l__knot_filaments_int} {path} #2 + \tl_clear_new:c {knot previous filament \int_use:N \l__knot_filaments_int} + \int_compare:nF {\l__knot_component_start_int == \l__knot_filaments_int} + { + \tl_set:cx {knot previous filament \int_use:N \l__knot_filaments_int} {filament \int_eval:n {\l__knot_filaments_int - 1}} + } + } + \g__spath_close_tl + { + \int_gincr:N \l__knot_filaments_int + \spath_clear_new:n {knot filament \int_use:N \l__knot_filaments_int} + \tl_set_eq:NN \l_tmpa_tl #2 + \tl_set:Nx \l_tmpa_tl {\tl_item:Nn #2 {1}\tl_item:Nn #2 {2}\tl_item:Nn #2 {3}} + \tl_put_right:NV \l_tmpa_tl \g__spath_lineto_tl + \tl_set:Nx \l_tmpa_tl {\tl_item:Nn #2 {5}\tl_item:Nn #2 {6}} + \spath_put:nnV {knot filament \int_use:N \l__knot_filaments_int} {path} \l_tmpa_tl + \tl_clear_new:c {knot previous filament \int_use:N \l__knot_filaments_int} + \int_compare:nF {\l__knot_component_start_int == \l__knot_filaments_int} + { + \tl_set:cx {knot previous filament \int_use:N \l__knot_filaments_int} {filament \int_eval:n {\l__knot_filaments_int - 1}} + } + \tl_set:cx {knot previous filament \int_use:N \l__knot_component_start_int} {filament \int_use:N \l__knot_filaments_int} + } + } + { + } +} +\NewDocumentCommand \redraw { m m } +{ + \tikz@scan@one@point\pgfutil@firstofone #2 \relax + \tl_put_right:Nn \l__knot_redraws_tl {\knot_draw_crossing:nnn} + \tl_put_right:Nx \l__knot_redraws_tl { + {strand #1} {\dim_use:N \pgf@x} {\dim_use:N \pgf@y} + } +} +\ExplSyntaxOff +\def\pgf@sh@@knotanchor#1#2{% + \anchor{#2 north west}{% + \csname pgf@anchor@knot #1@north west\endcsname% + \pgf@x=#2\pgf@x% + \pgf@y=#2\pgf@y% + }% + \anchor{#2 north east}{% + \csname pgf@anchor@knot #1@north east\endcsname% + \pgf@x=#2\pgf@x% + \pgf@y=#2\pgf@y% + }% + \anchor{#2 south west}{% + \csname pgf@anchor@knot #1@south west\endcsname% + \pgf@x=#2\pgf@x% + \pgf@y=#2\pgf@y% + }% + \anchor{#2 south east}{% + \csname pgf@anchor@knot #1@south east\endcsname% + \pgf@x=#2\pgf@x% + \pgf@y=#2\pgf@y% + }% + \anchor{#2 north}{% + \csname pgf@anchor@knot #1@north\endcsname% + \pgf@x=#2\pgf@x% + \pgf@y=#2\pgf@y% + }% + \anchor{#2 east}{% + \csname pgf@anchor@knot #1@east\endcsname% + \pgf@x=#2\pgf@x% + \pgf@y=#2\pgf@y% + }% + \anchor{#2 west}{% + \csname pgf@anchor@knot #1@west\endcsname% + \pgf@x=#2\pgf@x% + \pgf@y=#2\pgf@y% + }% + \anchor{#2 south}{% + \csname pgf@anchor@knot #1@south\endcsname% + \pgf@x=#2\pgf@x% + \pgf@y=#2\pgf@y% + }% +} +\pgfdeclareshape{knot crossing} +{ + \inheritsavedanchors[from=circle] % this is nearly a circle + \inheritanchorborder[from=circle] + \inheritanchor[from=circle]{north} + \inheritanchor[from=circle]{north west} + \inheritanchor[from=circle]{north east} + \inheritanchor[from=circle]{center} + \inheritanchor[from=circle]{west} + \inheritanchor[from=circle]{east} + \inheritanchor[from=circle]{mid} + \inheritanchor[from=circle]{mid west} + \inheritanchor[from=circle]{mid east} + \inheritanchor[from=circle]{base} + \inheritanchor[from=circle]{base west} + \inheritanchor[from=circle]{base east} + \inheritanchor[from=circle]{south} + \inheritanchor[from=circle]{south west} + \inheritanchor[from=circle]{south east} + \inheritanchorborder[from=circle] + \pgf@sh@@knotanchor{crossing}{2} + \pgf@sh@@knotanchor{crossing}{3} + \pgf@sh@@knotanchor{crossing}{4} + \pgf@sh@@knotanchor{crossing}{8} + \pgf@sh@@knotanchor{crossing}{16} + \pgf@sh@@knotanchor{crossing}{32} + \backgroundpath{ + \pgfutil@tempdima=\radius% + \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@xb<\pgf@yb% + \advance\pgfutil@tempdima by-\pgf@yb% + \else% + \advance\pgfutil@tempdima by-\pgf@xb% + \fi% + } +} +\pgfdeclareshape{knot over cross} +{ + \inheritsavedanchors[from=rectangle] % this is nearly a circle + \inheritanchorborder[from=rectangle] + \inheritanchor[from=rectangle]{north} + \inheritanchor[from=rectangle]{north west} + \inheritanchor[from=rectangle]{north east} + \inheritanchor[from=rectangle]{center} + \inheritanchor[from=rectangle]{west} + \inheritanchor[from=rectangle]{east} + \inheritanchor[from=rectangle]{mid} + \inheritanchor[from=rectangle]{mid west} + \inheritanchor[from=rectangle]{mid east} + \inheritanchor[from=rectangle]{base} + \inheritanchor[from=rectangle]{base west} + \inheritanchor[from=rectangle]{base east} + \inheritanchor[from=rectangle]{south} + \inheritanchor[from=rectangle]{south west} + \inheritanchor[from=rectangle]{south east} + \inheritanchorborder[from=rectangle] + \backgroundpath{ + \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y + \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y + \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}} + \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}} + } + \foregroundpath{ + \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y + \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y + \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}} + \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}} + } +} +\pgfdeclareshape{knot under cross} +{ + \inheritsavedanchors[from=rectangle] % this is nearly a circle + \inheritanchorborder[from=rectangle] + \inheritanchor[from=rectangle]{north} + \inheritanchor[from=rectangle]{north west} + \inheritanchor[from=rectangle]{north east} + \inheritanchor[from=rectangle]{center} + \inheritanchor[from=rectangle]{west} + \inheritanchor[from=rectangle]{east} + \inheritanchor[from=rectangle]{mid} + \inheritanchor[from=rectangle]{mid west} + \inheritanchor[from=rectangle]{mid east} + \inheritanchor[from=rectangle]{base} + \inheritanchor[from=rectangle]{base west} + \inheritanchor[from=rectangle]{base east} + \inheritanchor[from=rectangle]{south} + \inheritanchor[from=rectangle]{south west} + \inheritanchor[from=rectangle]{south east} + \inheritanchorborder[from=rectangle] + \backgroundpath{ + \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y + \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y + \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}} + \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}} + } + \foregroundpath{ + \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y + \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y + \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}} + \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}} + } +} +\pgfdeclareshape{knot vert} +{ + \inheritsavedanchors[from=rectangle] % this is nearly a circle + \inheritanchorborder[from=rectangle] + \inheritanchor[from=rectangle]{north} + \inheritanchor[from=rectangle]{north west} + \inheritanchor[from=rectangle]{north east} + \inheritanchor[from=rectangle]{center} + \inheritanchor[from=rectangle]{west} + \inheritanchor[from=rectangle]{east} + \inheritanchor[from=rectangle]{mid} + \inheritanchor[from=rectangle]{mid west} + \inheritanchor[from=rectangle]{mid east} + \inheritanchor[from=rectangle]{base} + \inheritanchor[from=rectangle]{base west} + \inheritanchor[from=rectangle]{base east} + \inheritanchor[from=rectangle]{south} + \inheritanchor[from=rectangle]{south west} + \inheritanchor[from=rectangle]{south east} + \inheritanchorborder[from=rectangle] + \backgroundpath{ + \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y + \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y + \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}} + \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}} + \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yb}} + \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}} + } +} +\pgfdeclareshape{knot horiz} +{ + \inheritsavedanchors[from=rectangle] % this is nearly a circle + \inheritanchorborder[from=rectangle] + \inheritanchor[from=rectangle]{north} + \inheritanchor[from=rectangle]{north west} + \inheritanchor[from=rectangle]{north east} + \inheritanchor[from=rectangle]{center} + \inheritanchor[from=rectangle]{west} + \inheritanchor[from=rectangle]{east} + \inheritanchor[from=rectangle]{mid} + \inheritanchor[from=rectangle]{mid west} + \inheritanchor[from=rectangle]{mid east} + \inheritanchor[from=rectangle]{base} + \inheritanchor[from=rectangle]{base west} + \inheritanchor[from=rectangle]{base east} + \inheritanchor[from=rectangle]{south} + \inheritanchor[from=rectangle]{south west} + \inheritanchor[from=rectangle]{south east} + \inheritanchorborder[from=rectangle] + \foregroundpath{ + \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y + \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y + \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}} + \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}} + \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}} + \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}} + } +} +%% +%% Copyright (C) 2011 by Andrew Stacey <stacey@math.ntnu.no> +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License (LPPL), either +%% version 1.3c of this license or (at your option) any later +%% version. The latest version of this license is in the file: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% This work is "maintained" (as per LPPL maintenance status) by +%% Andrew Stacey. +%% +%% This work consists of the files spath3.dtx +%% calligraphy_doc.tex +%% knot_doc.tex +%% and the derived files spath3.ins, +%% spath3.pdf, +%% spath3.sty, +%% tikzlibrarycalligraphy.code.tex +%% tikzlibraryknots.code.tex +%% calligraphy_doc.pdf +%% knots_doc.pdf +%% README.txt +%% +%% +%% End of file `tikzlibraryknots.code.tex'. |