summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/celtic
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2014-07-20 22:17:56 +0000
committerKarl Berry <karl@freefriends.org>2014-07-20 22:17:56 +0000
commita0ec6c4d3c2dc5ee28fce9fff1c114a2cccfe2dd (patch)
tree94ae0c40ecd1a625dc34019f1004328c55ccab97 /Master/texmf-dist/tex/latex/celtic
parent56cb8633dfea8b82bb642fefc2c98b065a6e967c (diff)
celtic (20jul14)
git-svn-id: svn://tug.org/texlive/trunk@34676 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/celtic')
-rw-r--r--Master/texmf-dist/tex/latex/celtic/tikzlibraryceltic.code.tex508
1 files changed, 508 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/celtic/tikzlibraryceltic.code.tex b/Master/texmf-dist/tex/latex/celtic/tikzlibraryceltic.code.tex
new file mode 100644
index 00000000000..20ac5a97c07
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/celtic/tikzlibraryceltic.code.tex
@@ -0,0 +1,508 @@
+%%
+%% This is file `tikzlibraryceltic.code.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% celtic.dtx (with options: `library')
+%% ----------------------------------------------------------------
+%% celtic --- TikZ library for producing Celtic knots.
+%% E-mail: loopspace@mathforge.org
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See http://www.latex-project.org/lppl.txt
+%% ----------------------------------------------------------------
+%%
+\usepackage{expl3}
+\usepackage{xparse}
+\ExplSyntaxOn
+\cs_new_nopar:Npn \celtic_shift:n #1
+{
+ \use:c{tikz@scan@one@point}\pgftransformshift #1\relax
+}
+\int_new:N \l__celtic_max_steps_int
+\int_new:N \l__celtic_int
+\int_new:N \l__celtic_flip_int
+\int_new:N \l__celtic_width_int
+\int_new:N \l__celtic_height_int
+\int_new:N \l__celtic_x
+\int_new:N \l__celtic_y
+\int_new:N \l__celtic_dx
+\int_new:N \l__celtic_dy
+\int_new:N \l__celtic_ox
+\int_new:N \l__celtic_oy
+\int_new:N \l__celtic_lout
+\int_new:N \l__celtic_cross_int
+\int_new:N \l__celtic_component_int
+\fp_new:N \l__celtic_clip_fp
+\fp_new:N \l__celtic_inner_clip_fp
+\fp_new:N \l__celtic_inner_fp
+\fp_new:N \l__celtic_outer_fp
+\seq_new:N \l__celtic_path_seq
+\seq_new:N \l__celtic_component_seq
+\seq_new:N \l__celtic_crossing_seq
+\seq_new:N \l__celtic_tmpa_seq
+\clist_new:N \l__celtic_tmpa_clist
+\tl_new:N \l__celtic_tmpa_tl
+\tl_new:N \l__celtic_path_tl
+\tl_new:N \g__celtic_colon_tl
+\tl_new:N \l__celtic_bar_tl
+\tl_new:N \l__celtic_active_bar_tl
+\bool_new:N \l__celtic_bounce_bool
+\bool_new:N \l__celtic_pbounce_bool
+\msg_new:nnnn { celtic } { max~ steps } { Limit~ of~ number~ of~ steps~ exceeded~ \msg_line_context:.}
+{ Paths~ may~ not~ be~ correctly~ constructed.~
+Consider~ raising~ the~ limit~ from \int_use:N \l__celtic_max_steps_int.}
+\group_begin:
+\char_set_lccode:nn {`;}{`:}
+\tl_to_lowercase:n {
+\group_end:
+ \tl_set:Nn \g__celtic_colon_tl {;}
+}
+\tl_set:Nn \l__celtic_bar_tl {|}
+\group_begin:
+\char_set_catcode_active:N \|
+\tl_gset:Nn \l__celtic_active_bar_tl {|}
+\group_end:
+\cs_generate_variant:Nn \tl_if_single_p:N {c}
+\cs_generate_variant:Nn \tl_if_single:NTF {cTF}
+\cs_generate_variant:Nn \tl_if_eq:nnTF {xnTF}
+\cs_generate_variant:Nn \tl_head:N {c}
+\cs_generate_variant:Nn \tl_tail:N {c}
+\cs_generate_variant:Nn \tl_if_eq:nnTF {vnTF}
+\cs_generate_variant:Nn \tl_if_in:nnTF {nVTF}
+\int_set:Nn \l__celtic_max_steps_int {20}
+\fp_set:Nn \l__celtic_inner_fp {1}
+\fp_set:Nn \l__celtic_outer_fp {2}
+\cs_new_nopar:Npn \celtic_do_crossing:nnn #1#2#3
+{
+ \tl_if_empty:nTF {#1}
+ {
+ \tl_clear:c {crossing used \int_eval:n {#2} - \int_eval:n {#3}}
+ }
+ {
+ \tl_set:cn {crossing \int_eval:n {#2} - \int_eval:n{#3}}{#1}
+ }
+}
+\cs_new_nopar:Npn \celtic_maybe_symmetric:nnnn #1#2#3#4
+{
+ \tl_if_empty:nTF {#1}
+ {
+ \celtic_do_crossing:nnn {#2}{#3}{#4}
+ }
+ {
+ \celtic_do_crossing:nnn {#2}{#3}{#4}
+ \celtic_do_crossing:nnn {#2}{\l__celtic_width_int - #3}{#4}
+ \celtic_do_crossing:nnn {#2}{#3}{\l__celtic_height_int - #4}
+ \celtic_do_crossing:nnn {#2}{\l__celtic_width_int - #3}{\l__celtic_height_int - #4}
+ }
+}
+\cs_new_nopar:Npn \celtic_maybe_xrange:nnnn #1#2#3#4
+{
+ \tl_if_in:nVTF {#3} \g__celtic_colon_tl
+ {
+ \celtic_do_xrange:w {#1}{#2}#3\q_stop{#4}
+ }
+ {
+ \celtic_maybe_yrange:nnnn {#1}{#2}{#3}{#4}
+ }
+}
+\cs_new_nopar:Npn \celtic_maybe_yrange:nnnn #1#2#3#4
+{
+ \tl_if_in:nVTF {#4} \g__celtic_colon_tl
+ {
+ \celtic_do_yrange:w {#1}{#2}{#3}#4\q_stop
+ }
+ {
+ \celtic_maybe_symmetric:nnnn {#1}{#2}{#3}{#4}
+ }
+}
+\tl_set:Nx \l_tmpa_tl
+{
+ \exp_not:N \cs_new_nopar:Npn \exp_not:N \celtic_do_xrange:w ##1##2##3\tl_use:N \g__celtic_colon_tl ##4\exp_not:N \q_stop##5
+ {
+ \exp_not:N \int_step_inline:nnnn {##3} {2} {##4}
+ {
+ \exp_not:N \celtic_maybe_yrange:nnnn {##1}{##2} {####1}{##5}
+ }
+ }
+ \exp_not:N \cs_new_nopar:Npn \exp_not:N \celtic_do_yrange:w ##1##2##3##4\tl_use:N \g__celtic_colon_tl ##5\exp_not:N \q_stop
+ {
+ \exp_not:N \int_step_inline:nnnn {##4} {2} {##5}
+ {
+ \exp_not:N \celtic_maybe_symmetric:nnnn {##1}{##2}{##3}{####1}
+ }
+ }
+}
+\tl_use:N \l_tmpa_tl
+\cs_new_nopar:Npn \celtic_ignore_crossings:w #1,#2\q_stop
+{
+ \celtic_maybe_xrange:nnnn {}{}{#1}{#2}
+}
+\cs_new_nopar:Npn \celtic_ignore_symmetric_crossings:w #1,#2\q_stop
+{
+ \celtic_maybe_xrange:nnnn {s}{}{#1}{#2}
+}
+\cs_new_nopar:Npn \celtic_set_crossings:w #1,#2,#3\q_stop
+{
+ \celtic_maybe_xrange:nnnn {}{#3}{#1}{#2}
+}
+\cs_new_nopar:Npn \celtic_set_symmetric_crossings:w #1,#2,#3\q_stop
+{
+ \celtic_maybe_xrange:nnnn {s}{#3}{#1}{#2}
+}
+\cs_new_nopar:Npn \celtic_next_crossing:
+{
+ \int_zero:N \l__celtic_cross_int
+ \tl_clear:N \l__celtic_crossing_tl
+ \tl_clear:N \l__celtic_path_tl
+ \bool_set_false:N \l__celtic_bounce_tl
+ \tl_put_right:Nx \l__celtic_path_tl {(\int_use:N \l__celtic_x, \int_use:N \l__celtic_y)}
+ \int_set:Nn \l__celtic_lout {(90 - \l__celtic_dx * 45) * \l__celtic_dy}
+ \bool_do_until:nn {\int_compare_p:n {\l__celtic_cross_int > 1}}
+ {
+ \bool_set_eq:NN \l__celtic_pbounce_bool \l__celtic_bounce_bool
+ \bool_set_false:N \l__celtic_bounce_bool
+ \int_add:Nn \l__celtic_x {\l__celtic_dx}
+ \int_add:Nn \l__celtic_y {\l__celtic_dy}
+ \tl_if_exist:cT {crossing \int_use:N \l__celtic_x - \int_use:N \l__celtic_y}
+ {
+ \tl_if_eq:cNTF {crossing \int_use:N \l__celtic_x - \int_use:N \l__celtic_y} \l__celtic_bar_tl
+ {
+ \bool_if:NTF \l__celtic_pbounce_bool
+ {
+ \tl_put_right:Nn \l__celtic_path_tl { -| }
+ }
+ {
+ \tl_put_right:Nx \l__celtic_path_tl { to[out=\int_eval:n
+{(90 - 45*\l__celtic_dx)*\l__celtic_dy}, in=\int_eval:n
+{-90*\l__celtic_dy}] }
+ }
+ \int_set:Nn \l__celtic_lout {90*\l__celtic_dy}
+ \int_set:Nn \l__celtic_dx {-\l__celtic_dx}
+ \tl_put_right:Nx \l__celtic_path_tl {(\fp_eval:n {\int_use:N \l__celtic_x + .5 * \int_use:N \l__celtic_dx}, \int_use:N \l__celtic_y)}
+ \bool_set_true:N \l__celtic_bounce_bool
+ }
+ {
+ \bool_if:NTF \l__celtic_pbounce_bool
+ {
+ \tl_put_right:Nn \l__celtic_path_tl { |- }
+ }
+ {
+ \tl_put_right:Nx \l__celtic_path_tl { to[out=\int_eval:n {(90 - 45*\l__celtic_dx)*\l__celtic_dy}, in=\int_eval:n {90 + 90*\l__celtic_dx}] }
+ }
+ \int_set:Nn \l__celtic_lout {90-90*\l__celtic_dx}
+ \int_set:Nn \l__celtic_dy {-\l__celtic_dy}
+ \tl_put_right:Nx \l__celtic_path_tl {(\int_use:N \l__celtic_x, \fp_eval:n {\int_use:N \l__celtic_y + .5 * \int_use:N \l__celtic_dy})}
+ \bool_set_true:N \l__celtic_bounce_bool
+ }
+ }
+ \int_compare:nT {\l__celtic_x == 0}
+ {
+ \bool_if:NTF \l__celtic_pbounce_bool
+ {
+ \tl_put_right:Nn \l__celtic_path_tl { -| }
+ }
+ {
+ \tl_put_right:Nx \l__celtic_path_tl { to[out=\int_eval:n {(90 - 45*\l__celtic_dx)*\l__celtic_dy}, in=\int_eval:n {-90*\l__celtic_dy}] }
+ }
+ \int_set:Nn \l__celtic_lout {90*\l__celtic_dy}
+ \int_set:Nn \l__celtic_dx {-\l__celtic_dx}
+ \tl_put_right:Nx \l__celtic_path_tl {(\fp_eval:n {\int_use:N \l__celtic_x + .5 * \int_use:N \l__celtic_dx}, \int_use:N \l__celtic_y)}
+ \bool_set_true:N \l__celtic_bounce_bool
+ }
+ \int_compare:nT {\l__celtic_x == \l__celtic_width_int}
+ {
+ \bool_if:NTF \l__celtic_pbounce_bool
+ {
+ \tl_put_right:Nn \l__celtic_path_tl { -| }
+ }
+ {
+ \tl_put_right:Nx \l__celtic_path_tl { to[out=\int_eval:n {(90 - 45*\l__celtic_dx)*\l__celtic_dy}, in=\int_eval:n {-90*\l__celtic_dy}] }
+ }
+ \int_set:Nn \l__celtic_lout {90*\l__celtic_dy}
+ \int_set:Nn \l__celtic_dx {-\l__celtic_dx}
+ \tl_put_right:Nx \l__celtic_path_tl {(\fp_eval:n {\int_use:N \l__celtic_x + .5 * \int_use:N \l__celtic_dx}, \int_use:N \l__celtic_y)}
+ \bool_set_true:N \l__celtic_bounce_bool
+ }
+ \int_compare:nT {\l__celtic_y == 0}
+ {
+ \bool_if:NTF \l__celtic_pbounce_bool
+ {
+ \tl_put_right:Nn \l__celtic_path_tl { |- }
+ }
+ {
+ \tl_put_right:Nx \l__celtic_path_tl { to[out=\int_eval:n {(90 - 45*\l__celtic_dx)*\l__celtic_dy}, in=\int_eval:n {90 + 90*\l__celtic_dx}] }
+ }
+ \int_set:Nn \l__celtic_lout {90-90*\l__celtic_dx}
+ \int_set:Nn \l__celtic_dy {-\l__celtic_dy}
+ \tl_put_right:Nx \l__celtic_path_tl {(\int_use:N \l__celtic_x, \fp_eval:n {\int_use:N \l__celtic_y + .5 * \int_use:N \l__celtic_dy})}
+ \bool_set_true:N \l__celtic_bounce_bool
+ }
+ \int_compare:nT {\l__celtic_y == \l__celtic_height_int}
+ {
+ \bool_if:NTF \l__celtic_pbounce_bool
+ {
+ \tl_put_right:Nn \l__celtic_path_tl { |- }
+ }
+ {
+ \tl_put_right:Nx \l__celtic_path_tl { to[out=\int_eval:n {(90 - 45*\l__celtic_dx)*\l__celtic_dy}, in=\int_eval:n {90 + 90*\l__celtic_dx}] }
+ }
+ \int_set:Nn \l__celtic_lout {-90+90*\l__celtic_dx}
+ \int_set:Nn \l__celtic_dy {-\l__celtic_dy}
+ \tl_put_right:Nx \l__celtic_path_tl {(\int_use:N \l__celtic_x, \fp_eval:n {\int_use:N \l__celtic_y + .5 * \int_use:N \l__celtic_dy})}
+ \bool_set_true:N \l__celtic_bounce_bool
+ }
+ \bool_if:NF \l__celtic_bounce_bool
+ {
+ \bool_if:NTF \l__celtic_pbounce_bool
+ {
+ \tl_put_right:Nx \l__celtic_path_tl { to[out=\int_use:N \l__celtic_lout,in=\int_eval:n {(-90 - 45 * \l__celtic_dx)*\l__celtic_dy}] }
+ }
+ {
+ \tl_put_right:Nn \l__celtic_path_tl { -- }
+ }
+ \tl_put_right:Nx \l__celtic_path_tl { (\int_use:N \l__celtic_x, \int_use:N \l__celtic_y)}
+ \tl_if_empty:NTF \l__celtic_crossing_tl
+ {
+ \tl_set:Nx \l__celtic_crossing_tl {(\int_use:N \l__celtic_x, \int_use:N \l__celtic_y)}
+ }
+ {
+ \tl_clear:c {crossing used \int_use:N \l__celtic_x - \int_use:N \l__celtic_y}
+ }
+ \int_incr:N \l__celtic_cross_int
+ \int_set:Nn \l__celtic_lout {(90 - \l__celtic_dx * 45) * \l__celtic_dy}
+ }
+ }
+}
+\keys_define:nn { celtic }
+{
+ max~ steps .int_set:N = \l__celtic_max_steps_int,
+ flip .code:n = {
+ \int_set:Nn \l__celtic_flip_int {-1}
+ },
+ width .int_set:N = \l__celtic_width_int,
+ height .int_set:N = \l__celtic_height_int,
+ size .code:n = {
+ \clist_set:Nn \l__celtic_tmpa_clist {#1}
+ \clist_pop:NN \l__celtic_tmpa_clist \l__celtic_tmpa_tl
+ \int_set:Nn \l__celtic_width_int {\l__celtic_tmpa_tl}
+ \clist_pop:NN \l__celtic_tmpa_clist \l__celtic_tmpa_tl
+ \int_set:Nn \l__celtic_height_int {\l__celtic_tmpa_tl}
+ },
+ width .groups:n = { size },
+ height .groups:n = { size },
+ size .groups:n = { size },
+ crossings .code:n = {
+ \seq_set_split:Nnn \l__celtic_tmpa_seq {;} {#1}
+ \seq_map_inline:Nn \l__celtic_tmpa_seq {
+ \tl_if_empty:nF {##1}
+ {
+ \celtic_set_crossings:w ##1 \q_stop
+ }
+ }
+ },
+ symmetric~ crossings .code:n = {
+ \seq_set_split:Nnn \l__celtic_tmpa_seq {;} {#1}
+ \seq_map_inline:Nn \l__celtic_tmpa_seq {
+ \tl_if_empty:nF {##1}
+ {
+ \celtic_set_symmetric_crossings:w ##1 \q_stop
+ }
+ }
+ },
+ ignore~ crossings .code:n ={
+ \seq_set_split:Nnn \l__celtic_tmpa_seq {;} {#1}
+ \seq_map_inline:Nn \l__celtic_tmpa_seq {
+ \tl_if_empty:nF {##1}
+ {
+ \celtic_ignore_crossings:w ##1 \q_stop
+ }
+ }
+ },
+ ignore~ symmetric~ crossings .code:n ={
+ \seq_set_split:Nnn \l__celtic_tmpa_seq {;} {#1}
+ \seq_map_inline:Nn \l__celtic_tmpa_seq {
+ \tl_if_empty:nF {##1}
+ {
+ \celtic_ignore_symmetric_crossings:w ##1 \q_stop
+ }
+ }
+ },
+ style .code:n = {
+ \tikzset {#1}
+ },
+ at .code:n = {
+ \celtic_shift:n {#1}
+ },
+ inner~ clip .fp_set:N = \l__celtic_inner_fp,
+ outer~ clip .fp_set:N = \l__celtic_outer_fp,
+}
+\DeclareDocumentCommand \CelticDrawPath { m }
+{
+ \group_begin:
+ \pgfscope
+ \seq_clear:N \l__celtic_path_seq
+ \seq_clear:N \l__celtic_component_seq
+ \seq_clear:N \l__celtic_crossing_seq
+ \int_set:Nn \l__celtic_flip_int {1}
+\int_compare:nT {\char_value_catcode:n {`\|} = 13}
+{
+ \tl_set_eq:NN \l__celtic_bar_tl \l__celtic_active_bar_tl
+}
+ \int_step_inline:nnnn {1} {1} {\l__celtic_height_int-1}
+ {
+ \int_step_inline:nnnn {1 + \int_mod:nn {##1}{2}} {2} {\l__celtic_width_int-1}
+{
+ \tl_clear_new:c {crossing used ####1 - ##1}
+ \tl_set:cn {crossing used ####1 - ##1} {X}
+}
+ }
+ \keys_set_groups:nnn { celtic } { size } {#1}
+ \keys_set_filter:nnn { celtic } { size } {#1}
+ \path[celtic~ bar/.try, celtic~ surround/.try] (0,0) rectangle (\int_use:N \l__celtic_width_int, \int_use:N \l__celtic_height_int);
+ \int_step_inline:nnnn {1} {1} {\l__celtic_height_int-1}
+ {
+ \int_step_inline:nnnn {1 + \int_mod:nn {##1}{2}} {2} {\l__celtic_width_int-1}
+{
+ \tl_if_exist:cT {crossing ####1 - ##1}
+ {
+ \tl_if_eq:cNTF {crossing ####1 - ##1} \l__celtic_bar_tl
+ {
+ \path[celtic~ bar/.try] (####1,##1-1) -- (####1,##1+1);
+ }
+ {
+ \path[celtic~ bar/.try] (####1-1,##1) -- (####1+1,##1);
+ }
+ }
+}
+ }
+ \int_step_inline:nnnn {1} {1} {\l__celtic_height_int-1}
+ {
+ \int_step_inline:nnnn {1 + \int_mod:nn {##1}{2}} {2} {\l__celtic_width_int-1}
+{
+ \celtic_generate_path:nnx {####1}{##1}{\int_eval:n {\l__celtic_flip_int*(2*\int_mod:nn{####1}{2} - 1)}}
+ }
+ }
+ \celtic_render_path:
+ \endpgfscope
+ \group_end:
+}
+\cs_new_nopar:Npn \celtic_generate_path:nnn #1#2#3
+{
+ \bool_if:nF {
+ \tl_if_exist_p:c {crossing #1 - #2}
+ ||
+ \tl_if_empty_p:c {crossing used #1 - #2}
+ }
+ {
+ \tl_clear:c {crossing used #1 - #2}
+ \int_incr:N \l__celtic_component_int
+ \int_set:Nn \l__celtic_x {#1}
+ \int_set:Nn \l__celtic_y {#2}
+ \int_set_eq:NN \l__celtic_ox \l__celtic_x
+ \int_set_eq:NN \l__celtic_oy \l__celtic_y
+ \int_set:Nn \l__celtic_dx {#3}
+ \int_set:Nn \l__celtic_dy {1}
+ \int_zero:N \l__celtic_int
+ \bool_do_until:nn
+ {
+ (\int_compare_p:n {\l__celtic_x == \l__celtic_ox}
+ &&
+ \int_compare_p:n {\l__celtic_y == \l__celtic_oy}
+ )
+ || \int_compare_p:n {\l__celtic_int > \l__celtic_max_steps_int}
+ }
+ {
+ \int_incr:N \l__celtic_int
+ \celtic_next_crossing:
+ \seq_put_left:NV \l__celtic_path_seq \l__celtic_path_tl
+ \seq_put_left:NV \l__celtic_crossing_seq \l__celtic_crossing_tl
+ \seq_put_left:NV \l__celtic_component_seq \l__celtic_component_int
+ }
+ \int_compare:nT {\l__celtic_int > \l__celtic_max_steps_int}
+ {
+ \msg_warning:nn {celtic} { max~ steps }
+ }
+ }
+}
+\cs_generate_variant:Nn \celtic_generate_path:nnn {nnx}
+\cs_new_nopar:Npn \celtic_render_path:
+{
+ \seq_map_inline:Nn \l__celtic_path_seq
+ {
+ \seq_pop:NN \l__celtic_component_seq \l__celtic_tmpa_tl
+ \seq_put_right:NV \l__celtic_component_seq \l__celtic_tmpa_tl
+ \path[celtic~ path/.try, celtic~ path~ \tl_use:N \l__celtic_tmpa_tl/.try] ##1;
+ }
+ \group_begin:
+ \pgfscope
+ \tikzset{celtic~ path/.try}
+ \tl_use:c {tikz@double@setup}
+ \tl_set:Nn \l__celtic_tmpa_tl
+ {
+ \endpgfscope
+ \group_end:
+ \fp_set:Nn \l__celtic_clip_fp
+ }
+ \tl_put_right:Nx \l__celtic_tmpa_tl {{\dim_use:N \pgflinewidth}}
+ \tl_use:N \l__celtic_tmpa_tl
+ \fp_set:Nn \l__celtic_inner_clip_fp {sqrt(2) * (\l__celtic_clip_fp + \l__celtic_inner_fp)}
+ \fp_set:Nn \l__celtic_clip_fp {sqrt(2) * (\l__celtic_clip_fp + \l__celtic_outer_fp)}
+ \seq_map_inline:Nn \l__celtic_path_seq
+ {
+ \seq_pop:NN \l__celtic_crossing_seq \l__celtic_crossing_tl
+ \seq_pop:NN \l__celtic_component_seq \l__celtic_tmpa_tl
+ \seq_put_right:NV \l__celtic_component_seq \l__celtic_tmpa_tl
+ \pgfscope
+ \clip \l__celtic_crossing_tl +(-\fp_to_dim:N \l__celtic_inner_clip_fp,0) -- +(0,\fp_to_dim:N \l__celtic_inner_clip_fp) -- +(\fp_to_dim:N \l__celtic_inner_clip_fp,0) -- +(0,-\fp_to_dim:N \l__celtic_inner_clip_fp) -- +(-\fp_to_dim:N \l__celtic_inner_clip_fp,0);
+ \path[celtic~ path/.try, celtic~ path~ \tl_use:N \l__celtic_tmpa_tl/.try, double~ background] ##1;
+ \endpgfscope
+ \pgfscope
+ \clip \l__celtic_crossing_tl +(-\fp_to_dim:N \l__celtic_clip_fp,0) -- +(0,\fp_to_dim:N \l__celtic_clip_fp) -- +(\fp_to_dim:N \l__celtic_clip_fp,0) -- +(0,-\fp_to_dim:N \l__celtic_clip_fp) -- +(-\fp_to_dim:N \l__celtic_clip_fp,0);
+ \path[celtic~ path/.try, celtic~ path~ \tl_use:N \l__celtic_tmpa_tl/.try,double~ foreground] ##1;
+ \endpgfscope
+ }
+}
+\ExplSyntaxOff
+\tikzset{
+ double background/.code={%
+ \begingroup
+ \tikz@double@setup
+ \global\pgf@xa=\pgflinewidth
+ \endgroup
+ \expandafter\tikz@semiaddlinewidth\expandafter{\the\pgf@xa}%
+ \tikz@addmode{\tikz@mode@doublefalse}%
+ },
+ double foreground/.code={%
+ \begingroup
+ \tikz@double@setup
+ \global\pgf@xa=\pgfinnerlinewidth
+ \endgroup
+ \expandafter\tikz@semiaddlinewidth\expandafter{\the\pgf@xa}%
+ \tikz@addmode{\tikz@mode@doublefalse}%
+ \tikzset{color=\pgfinnerstrokecolor}%
+ },
+}
+%%
+%% Copyright (C) 2014 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
+%% 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 celtic.dtx
+%% celtic_doc.tex
+%% and the derived files celtic.ins
+%% celtic_code.pdf
+%% tikzlibraryceltic.code.tex
+%% celtic.pdf
+%% README
+%%
+%%
+%% End of file `tikzlibraryceltic.code.tex'.