From a0ec6c4d3c2dc5ee28fce9fff1c114a2cccfe2dd Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 20 Jul 2014 22:17:56 +0000 Subject: celtic (20jul14) git-svn-id: svn://tug.org/texlive/trunk@34676 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/latex/celtic/tikzlibraryceltic.code.tex | 508 +++++++++++++++++++++ 1 file changed, 508 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/celtic/tikzlibraryceltic.code.tex (limited to 'Master/texmf-dist/tex/latex/celtic') 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 +%% +%% 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'. -- cgit v1.2.3