From e31f816419026769ef215c1054c17ca9352c31cd Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Tue, 6 Jun 2023 20:05:50 +0000
Subject: tilings (6jun23)

git-svn-id: svn://tug.org/texlive/trunk@67292 c570f23f-e606-0410-a88d-b1316a301751
---
 .../tex/latex/tilings/tikzlibrarytilings.code.tex  | 1139 ++++++++++++++++++++
 1 file changed, 1139 insertions(+)
 create mode 100644 Master/texmf-dist/tex/latex/tilings/tikzlibrarytilings.code.tex

(limited to 'Master/texmf-dist/tex/latex/tilings/tikzlibrarytilings.code.tex')

diff --git a/Master/texmf-dist/tex/latex/tilings/tikzlibrarytilings.code.tex b/Master/texmf-dist/tex/latex/tilings/tikzlibrarytilings.code.tex
new file mode 100644
index 00000000000..d79e42d965a
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/tilings/tikzlibrarytilings.code.tex
@@ -0,0 +1,1139 @@
+%%
+%% This is file `tikzlibrarytilings.code.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tilings_code.dtx  (with options: `tilings')
+%% ----------------------------------------------------------------
+%% tilings --- TikZ library for producing tilings
+%% E-mail: loopspace@mathforge.org
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See http://www.latex-project.org/lppl.txt
+%% ----------------------------------------------------------------
+%% 
+\ProvidesExplFile
+      {tikzlibrarytilings.code.tex}
+      {2023/06/01}
+      {2.0}
+      {TikZ pics for tilings such as Penrose tiles}
+\RequirePackage{tikz}
+\usetikzlibrary{spath3}
+\ExplSyntaxOn
+\tl_new:N \g__tilings_side_a_tl
+\tl_new:N \g__tilings_side_b_tl
+\tl_new:N \g__tilings_side_c_tl
+\tl_new:N \g__tilings_side_d_tl
+\tl_new:N \g__tilings_side_e_tl
+\tl_new:N \g__tilings_side_A_tl
+\tl_new:N \g__tilings_side_B_tl
+\tl_new:N \g__tilings_side_C_tl
+\tl_new:N \g__tilings_side_D_tl
+\tl_new:N \g__tilings_side_E_tl
+\tl_new:c {g__tilings_side_1_tl}
+\tl_new:c {g__tilings_side_2_tl}
+\tl_new:c {g__tilings_side_3_tl}
+\tl_gset:Nn \g__tilings_side_a_tl
+{
+  \pgfsyssoftpath@movetotoken{0pt}{0pt}
+  \pgfsyssoftpath@linetotoken{1pt}{0pt}
+}
+\tl_gset_eq:NN \g__tilings_side_b_tl \g__tilings_side_a_tl
+\tl_gset_eq:NN \g__tilings_side_c_tl \g__tilings_side_a_tl
+\tl_gset_eq:NN \g__tilings_side_d_tl \g__tilings_side_a_tl
+\tl_gset_eq:NN \g__tilings_side_e_tl \g__tilings_side_a_tl
+\tl_gset_eq:NN \g__tilings_side_A_tl \g__tilings_side_a_tl
+\tl_gset_eq:NN \g__tilings_side_B_tl \g__tilings_side_a_tl
+\tl_gset_eq:NN \g__tilings_side_C_tl \g__tilings_side_a_tl
+\tl_gset_eq:NN \g__tilings_side_D_tl \g__tilings_side_a_tl
+\tl_gset_eq:NN \g__tilings_side_E_tl \g__tilings_side_a_tl
+\tl_gset_eq:cN {g__tilings_side_1_tl} \g__tilings_side_a_tl
+\tl_gset_eq:cN {g__tilings_side_2_tl} \g__tilings_side_a_tl
+\tl_gset_eq:cN {g__tilings_side_3_tl} \g__tilings_side_a_tl
+\fp_new:N \l__tilings_tmpa_fp
+\fp_new:N \l__tilings_tmpb_fp
+\fp_new:N \l__tilings_tmpc_fp
+\fp_new:N \l__tilings_saved_x_fp
+\fp_new:N \l__tilings_saved_y_fp
+\str_new:N \l__tilings_tmpa_str
+\str_new:N \l__tilings_tmpb_str
+\seq_new:N \l__tilings_tmpa_seq
+\tl_new:N \l__tilings_tmpa_tl
+\tl_new:N \l__tilings_tmpb_tl
+\tl_new:N \l__tilings_tmpc_tl
+\tl_new:N \l__tilings_tmpd_tl
+\tl_new:N \l__tilings_tmp_tile_path_tl
+\tl_new:N \l__tilings_action_lms_tl
+\tl_new:N \l__tilings_parameters_lms_tl
+\int_new:N \l__tilings_tmpa_int
+\int_new:N \l__tilings_tmpb_int
+\fp_new:N \l__tilings_xa_fp
+\fp_new:N \l__tilings_ya_fp
+\fp_new:N \l__tilings_xb_fp
+\fp_new:N \l__tilings_yb_fp
+\dim_new:N \l__tilings_xa_dim
+\dim_new:N \l__tilings_ya_dim
+\dim_new:N \l__tilings_xb_dim
+\dim_new:N \l__tilings_yb_dim
+\dim_new:N \g__tilings_xa_dim
+\dim_new:N \g__tilings_ya_dim
+\dim_new:N \g__tilings_xb_dim
+\dim_new:N \g__tilings_yb_dim
+\prop_new:N \l__tilings_tmpa_prop
+\bool_new:N \l__tilings_cw_bool
+\bool_new:N \l__tilings_update_saved_bool
+\bool_new:N \l__tilings_relative_bool
+\bool_new:N \l__tilings_edge_bool
+\str_const:Nn \c__tilings_colon_str {:}
+\str_const:Nn \c__tilings_comma_str {,}
+\fp_const:Nn \c__tilings_cm_fp {\dim_to_fp:n {1cm}}
+\tl_new:N \g__tilings_output_tl
+\fp_new:N \g__tilings_output_a_fp
+\fp_new:N \g__tilings_output_b_fp
+\prop_new:N \g__tilings_tilenames_prop
+\regex_const:Nn \c__tilings_anchor_regex {\s\w+\Z}
+\cs_generate_variant:Nn \seq_set_split:Nnn {NVV}
+\cs_generate_variant:Nn \regex_extract_once:NnNTF {NVNTF}
+\cs_generate_variant:Nn \tl_if_eq:nnT {nVT}
+\cs_generate_variant:Nn \tl_if_in:NnT {NVT}
+\cs_generate_variant:Nn \prop_item:Nn {cV}
+\cs_generate_variant:Nn \tl_if_head_is_group_p:n {V}
+\msg_new:nnn { tilings }{ not baked }
+{ Tile~ #1~ has~ not~ been~ baked. }
+\msg_new:nnn { tilings }{ no tile }
+{ Tile~ #1~ has~ not~ been~ defined. }
+\msg_new:nnn { tilings }{ no side }
+{ Tile~ side~ #1~ has~ not~ been~ defined,~ using~ default. }
+\msg_new:nnn { tilings }{ tile no edge }
+{ Tile~ #1~ doesn't~ have~ an~ edge~ labelled~ #2;
+  ~ available~ edges~ are~ #3.}
+\msg_new:nnn { tilings }{ no edge }
+{ Either~ tile~ #1~ doesn't~ exist
+  ~ or~ it~ doesn't~ have~ an~ edge~ labelled~ #2.}
+\cs_new_nopar:Npn \__tilings_normalise_path:Nn #1#2
+{
+  \group_begin:
+  \spath_initialpoint:Nn \l__tilings_tmpa_tl {#2}
+  \fp_set:Nn \l__tilings_tmpa_fp {\tl_head:N \l__tilings_tmpa_tl}
+  \tl_set:Nx \l__tilings_tmpa_tl {\tl_tail:N \l__tilings_tmpa_tl}
+  \fp_set:Nn \l__tilings_tmpb_fp {\tl_head:N \l__tilings_tmpa_tl}
+  \spath_finalpoint:Nn \l__tilings_tmpa_tl {#2}
+  \fp_set:Nn \l__tilings_tmpa_fp
+  {\tl_head:N \l__tilings_tmpa_tl - \l__tilings_tmpa_fp}
+  \tl_set:Nx \l__tilings_tmpa_tl {\tl_tail:N \l__tilings_tmpa_tl}
+  \fp_set:Nn \l__tilings_tmpb_fp
+  {\tl_head:N \l__tilings_tmpa_tl - \l__tilings_tmpb_fp}
+  \fp_set:Nn \l__tilings_tmpc_fp
+  {\l__tilings_tmpa_fp^2 + \l__tilings_tmpb_fp^2}
+  \fp_set:Nn \l__tilings_tmpa_fp {\l__tilings_tmpa_fp/\l__tilings_tmpc_fp}
+  \fp_set:Nn \l__tilings_tmpb_fp {\l__tilings_tmpb_fp/\l__tilings_tmpc_fp}
+  \fp_set:Nn \l__tilings_tmpc_fp {-\l__tilings_tmpb_fp}
+  \tl_set:Nx \l__tilings_tmpb_tl
+  {
+    {\fp_use:N \l__tilings_tmpa_fp}
+    {\fp_use:N \l__tilings_tmpc_fp} % swapped
+    {\fp_use:N \l__tilings_tmpb_fp} % swapped
+    {\fp_use:N \l__tilings_tmpa_fp}
+  }
+  \spath_initialpoint:Nn \l__tilings_tmpa_tl {#2}
+  \fp_set:Nn \l__tilings_tmpa_fp
+  {
+    (-1) * \l__tilings_tmpa_fp * \tl_head:N \l__tilings_tmpa_tl
+    + (-1) * \l__tilings_tmpb_fp * \tl_tail:N \l__tilings_tmpa_tl
+  }
+  \fp_set:Nn \l__tilings_tmpb_fp
+  {
+    (-1) * \l__tilings_tmpa_fp * \tl_tail:N \l__tilings_tmpa_tl
+    +  \l__tilings_tmpb_fp * \tl_head:N \l__tilings_tmpa_tl
+  }
+  \tl_put_right:Nx \l__tilings_tmpb_tl {
+    {\fp_to_dim:N \l__tilings_tmpa_fp}
+    {\fp_to_dim:N \l__tilings_tmpb_fp}
+  }
+  \spath_transform:NnV \l__tilings_tmpa_tl {#2} \l__tilings_tmpb_tl
+  \tl_gset_eq:NN \g__tilings_output_tl \l__tilings_tmpa_tl
+  \group_end:
+  \tl_set_eq:NN #1 \g__tilings_output_tl
+  \tl_gclear:N \g__tilings_output_tl
+}
+\cs_generate_variant:Nn \__tilings_normalise_path:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \__tilings_normalise_path:N #1
+{
+  \__tilings_normalise_path:NV #1#1
+}
+\cs_generate_variant:Nn \__tilings_normalise_path:N {c}
+\cs_new_protected_nopar:Npn \__tilings_set_tiling_path:n #1
+{
+  \group_begin:
+  \pgfsyssoftpath@getcurrentpath\l__tilings_tmpa_tl
+  \__tilings_normalise_path:N \l__tilings_tmpa_tl
+  \tl_gset_eq:cN {g__tilings_side_#1_tl} \l__tilings_tmpa_tl
+  \group_end:
+}
+
+\NewDocumentCommand \SetTilingPath { m }
+{
+  \__tilings_set_tiling_path:n {#1}
+}
+\cs_new_nopar:Npn \tikz_scan_point:n #1
+{
+  \tikz@scan@one@point\pgfutil@firstofone#1\relax
+}
+\cs_generate_variant:Nn \tikz_scan_point:n {V}
+\prg_new_conditional:Npnn \tikz_node_if_defined:n #1 {p,T,F,TF}
+{
+  \tl_if_exist:cTF {pgf@sh@ns@\use:c{tikz@pp@name}{#1}}
+  {
+    \prg_return_true:
+  }{
+    \tl_if_exist:cTF
+    {pgf@sh@ns@not yet positionedPGFINTERNAL\use:c{tikz@pp@name}{#1}}
+    {
+      \pgf_return_true:
+    }
+    {
+      \prg_return_false:
+    }
+  }
+}
+\cs_new_nopar:Npn \__tilings_keys_get:Nn #1#2
+{
+  \pgfkeysgetvalue{/tikz/tiling/#2}{#1}
+}
+\cs_new_nopar:Npn \__tilings_keys_get:n #1
+{
+  \pgfkeysvalueof{/tikz/tiling/#1}
+}
+\cs_new_nopar:Npn \__tilings_tikz_keys_get:Nn #1#2
+{
+  \pgfkeysgetvalue{/tikz/#2}{#1}
+}
+\cs_new_nopar:Npn \__tilings_tikz_keys_get:n #1
+{
+  \pgfkeysvalueof{/tikz/#1}
+}
+\cs_new_nopar:Npn \__tilings_pgf_keys_get:Nn #1#2
+{
+  \pgfkeysgetvalue{#2}{#1}
+}
+\cs_new_nopar:Npn \__tilings_pgf_keys_get:n #1
+{
+  \pgfkeysvalueof{#1}
+}
+\cs_new_nopar:Npn \__tilings_make_tile:nnn #1#2#3
+{
+  \group_begin:
+  \tl_set:Nn \l__tilings_tmpa_tl {#3}
+  \tl_set:Nx \l__tilings_tmpb_tl {\tl_head:N \l__tilings_tmpa_tl}
+  \tl_set:Nn \l__tilings_tmpa_tl {\pgfsyssoftpath@movetotoken}
+  \tl_put_right:Nx \l__tilings_tmpa_tl
+  {
+    {
+      \fp_to_dim:n
+      {(\tl_item:Nn \l__tilings_tmpb_tl {1}) * \c__tilings_cm_fp}
+    }
+    {
+      \fp_to_dim:n
+      {(\tl_item:Nn \l__tilings_tmpb_tl {2}) * \c__tilings_cm_fp}
+    }
+  }
+  \tl_set_eq:NN \l__tilings_tmp_tile_path_tl \l__tilings_tmpa_tl
+  \tl_set:Nn \l__tilings_tmpa_tl {#3}
+  \tl_put_right:Nx \l__tilings_tmpa_tl {{\tl_head:N \l__tilings_tmpa_tl}}
+  \tl_map_inline:nn {#2} {
+    \tl_set:Nx \l__tilings_tmpc_tl {\tl_head:n {##1}}
+    \tl_if_exist:cF {g__tilings_side_ \tl_use:N \l__tilings_tmpc_tl _tl}
+    {
+      \msg_error:nnx { tilings }{ no side } { \tl_use:N \l__tilings_tmpc_tl }
+      \tl_gset_eq:cc
+      {g__tilings_side_ \tl_use:N \l__tilings_tmpc_tl _tl}
+      {g__tilings_side_a_tl}
+    }
+    \tl_set_eq:Nc \l__tilings_tmpd_tl
+    {g__tilings_side_ \tl_use:N \l__tilings_tmpc_tl _tl}
+    \tl_set:Nx \l__tilings_tmpb_tl {\tl_head:N \l__tilings_tmpa_tl}
+    \tl_set:Nx \l__tilings_tmpa_tl {\tl_tail:N \l__tilings_tmpa_tl}
+    \fp_set:Nn \l__tilings_tmpa_fp
+    { \tl_item:Nn \l__tilings_tmpb_tl {1} }
+    \fp_set:Nn \l__tilings_tmpb_fp
+    { \tl_item:Nn \l__tilings_tmpb_tl {2} }
+    \tl_set:Nx \l__tilings_tmpb_tl {\tl_head:N \l__tilings_tmpa_tl}
+    \fp_set:Nn \l__tilings_tmpa_fp
+    {\tl_item:Nn \l__tilings_tmpb_tl {1} - \l__tilings_tmpa_fp}
+    \fp_set:Nn \l__tilings_tmpb_fp
+    {\tl_item:Nn \l__tilings_tmpb_tl {2} - \l__tilings_tmpb_fp}
+    \fp_set:Nn \l__tilings_tmpc_fp {-\l__tilings_tmpb_fp}
+    \tl_set:Nx \l__tilings_tmpb_tl
+    {
+      {\fp_to_dim:n { \l__tilings_tmpa_fp * \c__tilings_cm_fp }}
+      {\fp_to_dim:n { \l__tilings_tmpb_fp * \c__tilings_cm_fp }}% not swapped
+      {\fp_to_dim:n { \l__tilings_tmpc_fp * \c__tilings_cm_fp }}% not swapped
+      {\fp_to_dim:n { \l__tilings_tmpa_fp * \c__tilings_cm_fp }}
+      {0}
+      {0}
+    }
+    \spath_transform:NV \l__tilings_tmpd_tl \l__tilings_tmpb_tl
+    \spath_weld:NV \l__tilings_tmp_tile_path_tl \l__tilings_tmpd_tl
+  }
+  \spath_close:N \l__tilings_tmp_tile_path_tl
+  \tl_gset_eq:NN \g__tilings_output_tl \l__tilings_tmp_tile_path_tl
+  \group_end:
+  \tl_gclear_new:c {g__tilings_tile_#1_tl}
+  \tl_gset_eq:cN {g__tilings_tile_#1_tl} \g__tilings_output_tl
+  \tl_gclear:N \g__tilings_output_tl
+}
+\cs_new_nopar:Npn \__tilings_make_tile:nn #1#2
+{
+  \__tilings_make_tile:nnn {#1} #2
+}
+\cs_generate_variant:Nn \__tilings_make_tile:nn {nV}
+\prop_new:N \g__tilings_tiles_prop
+\cs_new_nopar:Npn \__tilings_add_coordinate:Nnn #1#2#3 {
+  \group_begin:
+  \fp_set:Nn \l__tilings_tmpa_fp {#2}
+  \fp_set:Nn \l__tilings_tmpb_fp {#3}
+  \bool_if:NT \l__tilings_relative_bool
+  {
+    \fp_add:Nn \l__tilings_tmpa_fp {\l__tilings_saved_x_fp}
+    \fp_add:Nn \l__tilings_tmpb_fp {\l__tilings_saved_y_fp}
+  }
+  \fp_gset_eq:NN \g__tilings_output_a_fp \l__tilings_tmpa_fp
+  \fp_gset_eq:NN \g__tilings_output_b_fp \l__tilings_tmpb_fp
+  \group_end:
+  \tl_put_right:Nx #1
+  {
+    {{\fp_use:N \g__tilings_output_a_fp}{\fp_use:N \g__tilings_output_b_fp}}
+  }
+  \bool_if:NT \l__tilings_update_saved_bool
+  {
+    \fp_set_eq:NN \l__tilings_saved_x_fp \g__tilings_output_a_fp
+    \fp_set_eq:NN \l__tilings_saved_y_fp \g__tilings_output_b_fp
+  }
+  \fp_gzero:N \g__tilings_output_a_fp
+  \fp_gzero:N \g__tilings_output_b_fp
+}
+\cs_new_nopar:Npn \__tilings_add_xy_coordinate:w #1#2,#3 \q_stop
+{
+  \__tilings_add_coordinate:Nnn #1 {#2}{#3}
+}
+\cs_new_nopar:Npn \__tilings_add_rth_coordinate:w #1#2:#3 \q_stop
+{
+  \__tilings_add_coordinate:Nnn #1 {(#3) * cosd(#2)}{(#3) * sind(#2)}
+}
+\cs_new_nopar:Npn \__tilings_transform_side_to_axis:Nnn #1#2#3
+{
+  \group_begin:
+  \prop_get:NnNTF \g__tilings_tiles_prop {#2} \l__tilings_tmpa_tl
+  {
+  \int_zero:N \l__tilings_tmpb_int
+  \int_incr:N \l__tilings_tmpb_int
+  \tl_set:Nx \l__tilings_tmpc_tl {\tl_head:N \l__tilings_tmpa_tl}
+    \bool_set_false:N \l__tilings_edge_bool
+    \tl_map_inline:Nn \l__tilings_tmpc_tl {
+      \str_if_eq:nnT {##1} {#3} {
+        \bool_set_true:N \l__tilings_edge_bool
+        \tl_map_break:
+      }
+      \int_incr:N \l__tilings_tmpb_int
+    }
+    \bool_if:NTF \l__tilings_edge_bool
+    {
+      \tl_set:Nx \l__tilings_tmpc_tl {\tl_tail:N \l__tilings_tmpa_tl}
+      \tl_set:Nx \l__tilings_tmpc_tl {\tl_item:Nn \l__tilings_tmpc_tl {1}}
+      \tl_put_right:Nx \l__tilings_tmpc_tl
+      {{\tl_item:Nn \l__tilings_tmpc_tl {1}}}
+      \tl_set:Nx \l__tilings_tmpa_tl
+      {\tl_item:Nn \l__tilings_tmpc_tl {\int_use:N \l__tilings_tmpb_int}}
+      \tl_set:Nx \l__tilings_tmpb_tl
+      {\tl_item:Nn \l__tilings_tmpc_tl {\int_use:N \l__tilings_tmpb_int + 1}}
+      \bool_if:NT #1
+      {
+        \tl_set:NV \l__tilings_tmpc_tl \l__tilings_tmpa_tl
+        \tl_set:NV \l__tilings_tmpa_tl \l__tilings_tmpb_tl
+        \tl_set:NV \l__tilings_tmpb_tl \l__tilings_tmpc_tl
+      }
+      \fp_set:Nn \l__tilings_xa_fp {\tl_item:Nn \l__tilings_tmpb_tl {1}}
+      \fp_set:Nn \l__tilings_ya_fp {\tl_item:Nn \l__tilings_tmpb_tl {2}}
+      \fp_set:Nn \l__tilings_xb_fp
+      {\tl_item:Nn \l__tilings_tmpa_tl {1} - \l__tilings_xa_fp}
+      \fp_set:Nn \l__tilings_yb_fp
+      {\tl_item:Nn \l__tilings_tmpa_tl {2} - \l__tilings_ya_fp}
+      \fp_set:Nn \l__tilings_tmpa_fp
+      {(\l__tilings_xb_fp)^2 + (\l__tilings_yb_fp)^2}
+      \fp_set:Nn \l__tilings_xb_fp { \l__tilings_xb_fp / \l__tilings_tmpa_fp}
+      \fp_set:Nn \l__tilings_yb_fp { \l__tilings_yb_fp / \l__tilings_tmpa_fp}
+      \tl_gset:Nx \g__tilings_output_tl
+      {
+        \exp_not:N \pgftransformtriangle
+        {
+          \exp_not:N \pgfpoint{0pt}{0pt}
+        }
+        {
+          \exp_not:N \pgfpoint
+          {\fp_to_dim:N \l__tilings_xb_fp}{\fp_to_dim:n {-\l__tilings_yb_fp}}
+        }
+        {
+          \exp_not:N \pgfpoint
+          {\fp_to_dim:N \l__tilings_yb_fp}{\fp_to_dim:N \l__tilings_xb_fp}
+        }
+        \exp_not:N \pgftransformshift
+        {
+          \exp_not:N \pgfpoint
+          {
+            \fp_to_dim:n {-\l__tilings_xa_fp * \c__tilings_cm_fp}
+          }
+          {
+            \fp_to_dim:n {-\l__tilings_ya_fp * \c__tilings_cm_fp}
+          }
+        }
+      }
+    }
+    {
+      \msg_error:nnxxx {tilings} {tile no edge} {#2} {#3}
+      {\tl_use:N  \l__tilings_tmpc_tl }
+      \tl_gclear:N \g__tilings_output_tl
+    }
+  }
+  {
+    \msg_error:nnn {tilings} {no tile} {#2}
+    \tl_gclear:N \g__tilings_output_tl
+  }
+  \group_end:
+  \tl_use:N \g__tilings_output_tl
+  \tl_gclear:N \g__tilings_output_tl
+}
+\cs_generate_variant:Nn
+\__tilings_transform_side_to_axis:Nnn {Nnx,NnV,NVV}
+\cs_new_nopar:Npn \__tilings_translate_vertex_to_origin:Nnn #1#2#3
+{
+  \group_begin:
+  \prop_get:NnNTF \g__tilings_tiles_prop {#2} \l__tilings_tmpa_tl
+  {
+  \int_zero:N \l__tilings_tmpb_int
+  \int_incr:N \l__tilings_tmpb_int
+  \tl_set:Nx \l__tilings_tmpc_tl {\tl_head:N \l__tilings_tmpa_tl}
+    \bool_set_false:N \l__tilings_edge_bool
+    \tl_map_inline:Nn \l__tilings_tmpc_tl {
+      \str_if_eq:nnT {##1} {#3} {
+        \bool_set_true:N \l__tilings_edge_bool
+        \tl_map_break:
+      }
+      \int_incr:N \l__tilings_tmpb_int
+    }
+    \bool_if:NTF \l__tilings_edge_bool
+    {
+      \tl_set:Nx \l__tilings_tmpc_tl {\tl_tail:N \l__tilings_tmpa_tl}
+      \tl_set:Nx \l__tilings_tmpc_tl {\tl_item:Nn \l__tilings_tmpc_tl {1}}
+      \tl_put_right:Nx \l__tilings_tmpc_tl
+      {{\tl_item:Nn \l__tilings_tmpc_tl {1}}}
+      \tl_set:Nx \l__tilings_tmpa_tl
+      {\tl_item:Nn \l__tilings_tmpc_tl {\int_use:N \l__tilings_tmpb_int}}
+      \tl_set:Nx \l__tilings_tmpb_tl
+      {\tl_item:Nn \l__tilings_tmpc_tl {\int_use:N \l__tilings_tmpb_int + 1}}
+      \bool_if:NT #1
+      {
+        \tl_set:NV \l__tilings_tmpc_tl \l__tilings_tmpa_tl
+        \tl_set:NV \l__tilings_tmpa_tl \l__tilings_tmpb_tl
+        \tl_set:NV \l__tilings_tmpb_tl \l__tilings_tmpc_tl
+      }
+      \fp_set:Nn \l__tilings_xa_fp {\tl_item:Nn \l__tilings_tmpb_tl {1}}
+      \fp_set:Nn \l__tilings_ya_fp {\tl_item:Nn \l__tilings_tmpb_tl {2}}
+      \tl_gset:Nx \g__tilings_output_tl
+      {
+        \exp_not:N \pgftransformshift
+        {
+          \exp_not:N \pgfpoint
+          {
+            \fp_to_dim:n {-\l__tilings_xa_fp * \c__tilings_cm_fp}
+          }
+          {
+            \fp_to_dim:n {-\l__tilings_ya_fp * \c__tilings_cm_fp}
+          }
+        }
+      }
+    }
+    {
+      \msg_error:nnxxx {tilings} {tile no edge} {#2} {#3}
+      {\tl_use:N  \l__tilings_tmpc_tl }
+      \tl_gclear:N \g__tilings_output_tl
+    }
+  }
+  {
+    \msg_error:nnn {tilings} {no tile} {#2}
+    \tl_gclear:N \g__tilings_output_tl
+  }
+  \group_end:
+  \tl_use:N \g__tilings_output_tl
+  \tl_gclear:N \g__tilings_output_tl
+}
+\cs_generate_variant:Nn
+\__tilings_translate_vertex_to_origin:Nnn {Nnx,NnV,NVV}
+\DeclareDocumentCommand \TransformAlongSide {s m m}
+{
+  \IfBooleanTF {#1}
+  {
+    \bool_set_true:N \l__tilings_cw_bool
+  }
+  {
+    \bool_set_false:N \l__tilings_cw_bool
+  }
+  \__tilings_transform_side_to_axis:Nnx \l__tilings_cw_bool {#2}{#3}
+}
+\cs_new_nopar:Npn \__tilings_coordinates_at_vertices:n #1
+{
+  \group_begin:
+  \prop_get:NnN \g__tilings_tiles_prop {#1} \l__tilings_tmpa_tl
+  \tl_set:Nx \l__tilings_tmpb_tl {\tl_head:N \l__tilings_tmpa_tl}
+  \tl_set:Nx \l__tilings_tmpc_tl {\tl_tail:N \l__tilings_tmpa_tl}
+  \tl_set:Nx \l__tilings_tmpc_tl
+  {\tl_item:Nn \l__tilings_tmpc_tl {1}}
+  \tl_put_right:Nx \l__tilings_tmpc_tl
+  {{\tl_item:Nn \l__tilings_tmpc_tl {1}}}
+  \tl_set:Nx \l__tilings_tmpa_tl {\tl_head:N \l__tilings_tmpc_tl}
+  \tl_set:Nx \l__tilings_tmpc_tl {\tl_tail:N \l__tilings_tmpc_tl}
+  \tl_map_inline:Nn \l__tilings_tmpb_tl {
+    \tl_set:Nx \l__tilings_tmpd_tl {
+      \exp_not:N \coordinate
+      (-edge~ ##1~ start)~
+      at (
+      \tl_item:Nn \l__tilings_tmpa_tl {1},
+      \tl_item:Nn \l__tilings_tmpa_tl {2}
+      );
+    }
+    \tl_use:N \l__tilings_tmpd_tl
+    \tl_set:Nx \l__tilings_tmpa_tl {\tl_head:N \l__tilings_tmpc_tl}
+    \tl_set:Nx \l__tilings_tmpc_tl {\tl_tail:N \l__tilings_tmpc_tl}
+    \tl_set:Nx \l__tilings_tmpd_tl {
+      \exp_not:N \coordinate
+      (-edge~ ##1~ end)~
+      at (
+      \tl_item:Nn \l__tilings_tmpa_tl {1},
+      \tl_item:Nn \l__tilings_tmpa_tl {2}
+      );
+    }
+    \tl_use:N \l__tilings_tmpd_tl
+  }
+  \group_end:
+}
+\DeclareDocumentCommand \CoordinatesAtVertices {m}
+{
+  \__tilings_coordinates_at_vertices:n {#1}
+}
+\tikzset{
+  transform~ to~ tile/.code~ args={#1~ along~ #2}{%
+    \group_begin:
+    \tl_if_in:nnTF {#1} {back}
+    {
+      \tikzset{
+        tiling/alignment~ set~ location=#1,
+        tiling/alignment~ direction={backwards}
+      }
+    }
+    {
+      \tikzset{
+        tiling/alignment~ location=#1,
+        tiling/alignment~ direction={forewards}
+      }
+    }
+    \tl_if_in:nnTF {#2} {using}
+    {
+      \tikzset{
+        tiling/alignment~ set~ edges=#2,
+      }
+    }
+    {
+      \tikzset{
+        tiling/alignment~ edge=#2,
+      }
+    }
+    \tikz_scan_point:n {
+      (\__tilings_keys_get:n {alignment~ location}
+      -edge~ \__tilings_keys_get:n {alignment~ edge}~ start)
+    }
+    \dim_set_eq:Nc \l__tilings_xa_dim {pgf@x}
+    \dim_set_eq:Nc \l__tilings_ya_dim {pgf@y}
+    \tikz_scan_point:n {
+      (\__tilings_keys_get:n {alignment~ location}
+      -edge~ \__tilings_keys_get:n {alignment~ edge}~ end)
+    }
+    \dim_set_eq:Nc \l__tilings_xb_dim {pgf@x}
+    \dim_set_eq:Nc \l__tilings_yb_dim {pgf@y}
+    \__tilings_keys_get:Nn \l__tilings_tmpb_tl {alignment~ direction}
+    \tl_if_eq:NnTF \l__tilings_tmpb_tl {forewards}
+    {
+      \dim_gset_eq:NN \g__tilings_xa_dim \l__tilings_xa_dim
+      \dim_gset_eq:NN \g__tilings_ya_dim \l__tilings_ya_dim
+      \dim_gset_eq:NN \g__tilings_xb_dim \l__tilings_xb_dim
+      \dim_gset_eq:NN \g__tilings_yb_dim \l__tilings_yb_dim
+    }
+    {
+      \dim_gset_eq:NN \g__tilings_xa_dim \l__tilings_xb_dim
+      \dim_gset_eq:NN \g__tilings_ya_dim \l__tilings_yb_dim
+      \dim_gset_eq:NN \g__tilings_xb_dim \l__tilings_xa_dim
+      \dim_gset_eq:NN \g__tilings_yb_dim \l__tilings_ya_dim
+    }
+    \dim_gsub:Nn \g__tilings_xb_dim {\g__tilings_xa_dim}
+    \dim_gsub:Nn \g__tilings_yb_dim {\g__tilings_ya_dim}
+    \dim_gset:Nn \g__tilings_xb_dim
+    {\g__tilings_xb_dim * \dim_ratio:nn {1pt}{1cm}}
+    \dim_gset:Nn \g__tilings_yb_dim
+    {\g__tilings_yb_dim * \dim_ratio:nn {1pt}{1cm}}
+    \group_end:
+    \pgftransformshift{\pgfpoint{\g__tilings_xa_dim}{\g__tilings_ya_dim}}
+    \pgftransformtriangle
+    {\pgfpoint{0pt}{0pt}}
+    {\pgfpoint{\g__tilings_xb_dim}{\g__tilings_yb_dim}}
+    {\pgfpoint{-\g__tilings_yb_dim}{\g__tilings_xb_dim}}
+  },
+  align~ with/.code~ args={#1~ along~ #2}{%
+    \tl_if_in:nnTF {#1} {back}
+    {
+      \tikzset{
+        tiling/alignment~ set~ location=#1,
+        tiling/alignment~ direction={backwards}
+      }
+    }
+    {
+      \tikzset{
+        tiling/alignment~ location=#1,
+        tiling/alignment~ direction={forewards}
+      }
+    }
+    \tl_if_in:nnTF {#2} {using}
+    {
+      \tikzset{
+        tiling/alignment~ set~ edges=#2,
+      }
+    }
+    {
+      \tikzset{
+        tiling/alignment~ edge=#2,
+      }
+    }
+    \tikz_node_if_defined:nTF
+    {
+      \__tilings_keys_get:n {alignment~ location}
+      -edge~ \__tilings_keys_get:n {alignment~ edge}~ start
+    }
+    {
+      \tikzset{
+        tiling/alignment~ start/.expanded={
+          (\__tilings_keys_get:n {alignment~ location}
+          -edge~ \__tilings_keys_get:n {alignment~ edge}~ start)
+        },
+        tiling/alignment~ end/.expanded={
+          (\__tilings_keys_get:n {alignment~ location}
+          -edge~ \__tilings_keys_get:n {alignment~ edge}~ end)
+        },
+      }
+    }
+    {
+      \__tilings_keys_get:Nn \l__tilings_tmpa_tl {alignment~ location}
+      \tl_set:Nx \l__tilings_tmpa_tl {\tl_use:N \l__tilings_tmpa_tl}
+      \prop_get:NVNTF \g__tilings_tilenames_prop
+      \l__tilings_tmpa_tl \l__tilings_tmpb_tl
+      {
+        \prop_get:NVN \g__tilings_tiles_prop
+        \l__tilings_tmpb_tl \l__tilings_tmpc_tl
+        \msg_error:nnxxx { tilings }{ tile no edge }
+        {
+          \tl_use:N \l__tilings_tmpa_tl \c_space_tl
+          (type~ \tl_use:N \l__tilings_tmpb_tl)
+        }
+        {\__tilings_keys_get:n {alignment~ edge} }
+        { \tl_item:Nn \l__tilings_tmpc_tl {1} }
+      }
+      {
+        \msg_error:nnx { tilings }{ no tile }
+        {\__tilings_keys_get:n {alignment~ location} }
+      }
+    }
+  },
+  tiling/.is~ family,
+  tiling/alignment~ set~ location/.code~ args={#1~ back}{
+    \tikzset{
+      tiling/alignment~ location=#1,
+    }
+  },
+  tiling/alignment~ set~ edges/.code~ args={#1~ using~ #2}{
+    \tikzset{
+      tiling/alignment~ edge=#1,
+      tiling/alignment~ new~ edge=#2
+    }
+  },
+  align~ between/.code~ args={#1~ and~ #2~ using~ #3}{
+    \tikzset{
+      tiling/alignment~ start={#1},
+      tiling/alignment~ end={#2},
+    }
+    \str_set:Nn \l__tilings_tmpa_str {#3}
+    \str_set:Nx \l__tilings_tmpb_str {\str_tail:N \l__tilings_tmpa_str}
+    \tikzset{
+      tiling/alignment~ new~ edge/.expanded={\str_use:N \l__tilings_tmpb_str}
+    }
+    \str_set:Nx \l__tilings_tmpa_str {\str_head:N \l__tilings_tmpa_str}
+    \str_set:Nx \l__tilings_tmpb_str {\str_lowercase:f { \l__tilings_tmpa_str}}
+    \str_if_eq:NNT \l__tilings_tmpa_str \l__tilings_tmpb_str
+    {
+      \str_set:Nx \l__tilings_tmpb_str
+      {\str_uppercase:f { \l__tilings_tmpa_str}}
+    }
+    \tikzset{
+      tiling/alignment~ edge/.expanded={\str_use:N \l__tilings_tmpb_str},
+    }
+  },
+  tiling/alignment~ location/.initial={},
+  tiling/alignment~ edge/.initial=a,
+  tiling/alignment~ new~ edge/.initial={},
+  tiling/alignment~ direction/.initial={forewards},
+  tiling/alignment~ start/.initial={},
+  tiling/alignment~ end/.initial={},
+  tiling/anchor/.initial={},
+  every~ tile~ clip/.style={clip}
+}
+\DeclareDocumentCommand \DefineTile { s m m m }
+{
+  \tl_clear:N \l__tilings_tmpa_tl
+  \int_zero:N \l__tilings_tmpa_int
+  \fp_zero:N \l__tilings_saved_x_fp
+  \fp_zero:N \l__tilings_saved_y_fp
+  \tl_map_inline:nn {#4} {
+    \str_set:Nn \l__tilings_tmpa_str {##1}
+    \str_if_eq:VnTF \l__tilings_tmpa_str {+}
+    {
+      \int_incr:N \l__tilings_tmpa_int
+    }
+    {
+      \int_case:nn {\l__tilings_tmpa_int}
+      {
+        {0} {
+          \bool_set_false:N \l__tilings_relative_bool
+          \bool_set_true:N \l__tilings_update_saved_bool
+        }
+        {1} {
+          \bool_set_true:N \l__tilings_relative_bool
+          \bool_set_false:N \l__tilings_update_saved_bool
+        }
+        {2} {
+          \bool_set_true:N \l__tilings_relative_bool
+          \bool_set_true:N \l__tilings_update_saved_bool
+        }
+
+      }
+      \str_if_in:NnTF \l__tilings_tmpa_str {:}
+      {
+        \seq_set_split:NVV \l__tilings_tmpa_seq \c__tilings_colon_str \l__tilings_tmpa_str
+        \__tilings_add_coordinate:Nnn \l__tilings_tmpa_tl
+        {
+          (\seq_item:Nn \l__tilings_tmpa_seq {2}) * cosd (\seq_item:Nn \l__tilings_tmpa_seq {1})
+        }
+        {
+          (\seq_item:Nn \l__tilings_tmpa_seq {2}) * sind (\seq_item:Nn \l__tilings_tmpa_seq {1})
+        }
+      }
+      {
+        \seq_set_split:NVV \l__tilings_tmpa_seq \c__tilings_comma_str \l__tilings_tmpa_str
+        \__tilings_add_coordinate:Nnn \l__tilings_tmpa_tl
+        {
+          (\seq_item:Nn \l__tilings_tmpa_seq {1})
+        }
+        {
+          (\seq_item:Nn \l__tilings_tmpa_seq {2})
+        }
+      }
+      \int_zero:N \l__tilings_tmpa_int
+    }
+  }
+  \prop_clear:N \l__tilings_tmpa_prop
+  \tl_map_inline:nn {#3} {
+    \prop_if_in:NnTF \l__tilings_tmpa_prop {##1}
+    {
+      \prop_put:Nnn \l__tilings_tmpa_prop {##1} {1}
+    }
+    {
+      \prop_put:Nnn \l__tilings_tmpa_prop {##1} {0}
+    }
+  }
+  \tl_clear:N \l__tilings_tmpb_tl
+  \tl_map_inline:nn {#3}
+  {
+    \tl_clear:N \l__tilings_tmpc_tl
+    \tl_put_right:Nn \l__tilings_tmpc_tl {##1}
+    \int_compare:nF {\prop_item:Nn \l__tilings_tmpa_prop {##1} == 0} {
+      \tl_put_right:Nx \l__tilings_tmpc_tl
+      {\prop_item:Nn \l__tilings_tmpa_prop {##1}}
+      \prop_put:Nnx \l__tilings_tmpa_prop {##1}
+      {\int_eval:n {\prop_item:Nn \l__tilings_tmpa_prop {##1} + 1}}
+    }
+    \tl_put_right:Nx \l__tilings_tmpb_tl {{ \l__tilings_tmpc_tl }}
+  }
+  \prop_gput:Nnx \g__tilings_tiles_prop {#2}
+  {{\tl_use:N \l__tilings_tmpb_tl} {\tl_use:N \l__tilings_tmpa_tl}}
+  \tikzset{
+    #2/.pic={
+      \begin{scope}[
+        every~ tile~ scope/.try,
+        every~ #2~ scope/.try,
+        this~ tile~ scope/.try
+      ]
+      \tikz@fig@mustbenamed
+      \prop_gput:NVn \g__tilings_tilenames_prop \tikz@fig@name {#2}
+      \__tilings_keys_get:Nn \l__tilings_tmpa_tl {alignment~ start}
+      \tl_if_empty:NTF \l__tilings_tmpa_tl
+      {
+        \prop_get:NnN \g__tilings_tiles_prop {#2} \l__tilings_tmpa_tl
+        \tl_set:Nx \l__tilings_tmpc_tl {\tl_head:N \l__tilings_tmpa_tl}
+        \__tilings_keys_get:Nn \l__tilings_tmpa_tl {anchor}
+        \tl_if_empty:NTF \l__tilings_tmpa_tl
+        {
+          \bool_if:NT \l__tilings_cw_bool
+          {
+            \pgftransformxscale {-1}
+          }
+        }
+        {
+          \regex_extract_once:NVNTF
+          \c__tilings_anchor_regex \l__tilings_tmpa_tl \l__tilings_tmpb_tl
+          {
+            \regex_replace_once:NnN \c__tilings_anchor_regex {} \l__tilings_tmpa_tl
+            \tl_if_eq:NnTF \l__tilings_tmpb_tl {~end}
+            {
+              \bool_set_true:N \l__tilings_cw_bool
+            }
+            {
+              \bool_set_false:N \l__tilings_cw_bool
+            }
+          }
+          {
+            \bool_set_false:N \l__tilings_cw_bool
+          }
+          \tl_set:Nx \l__tilings_tmpb_tl {{\tl_use:N \l__tilings_tmpa_tl}}
+          \tl_if_in:NVT \l__tilings_tmpc_tl \l__tilings_tmpb_tl
+          {
+            \__tilings_translate_vertex_to_origin:NnV
+            \l__tilings_cw_bool {#2} \l__tilings_tmpa_tl
+          }
+        }
+      }
+      {
+        \group_begin:
+        \tikzset{
+          name~ prefix~ ..
+        }
+        \tikz_scan_point:n {
+          \__tilings_keys_get:n {alignment~ start}
+        }
+        \dim_set_eq:Nc \l__tilings_xa_dim {pgf@x}
+        \dim_set_eq:Nc \l__tilings_ya_dim {pgf@y}
+        \tikz_scan_point:n {
+          \__tilings_keys_get:n {alignment~ end}
+        }
+        \dim_set_eq:Nc \l__tilings_xb_dim {pgf@x}
+        \dim_set_eq:Nc \l__tilings_yb_dim {pgf@y}
+        \__tilings_keys_get:Nn \l__tilings_tmpb_tl {alignment~ direction}
+        \tl_if_eq:NnTF \l__tilings_tmpb_tl {forewards}
+        {
+          \dim_gset_eq:NN \g__tilings_xa_dim \l__tilings_xa_dim
+          \dim_gset_eq:NN \g__tilings_ya_dim \l__tilings_ya_dim
+          \dim_gset_eq:NN \g__tilings_xb_dim \l__tilings_xb_dim
+          \dim_gset_eq:NN \g__tilings_yb_dim \l__tilings_yb_dim
+        }
+        {
+          \dim_gset_eq:NN \g__tilings_xa_dim \l__tilings_xb_dim
+          \dim_gset_eq:NN \g__tilings_ya_dim \l__tilings_yb_dim
+          \dim_gset_eq:NN \g__tilings_xb_dim \l__tilings_xa_dim
+          \dim_gset_eq:NN \g__tilings_yb_dim \l__tilings_ya_dim
+        }
+        \dim_gsub:Nn \g__tilings_xb_dim {\g__tilings_xa_dim}
+        \dim_gsub:Nn \g__tilings_yb_dim {\g__tilings_ya_dim}
+        \dim_gset:Nn \g__tilings_xb_dim {\g__tilings_xb_dim * \dim_ratio:nn {1pt}{1cm}}
+        \dim_gset:Nn \g__tilings_yb_dim {\g__tilings_yb_dim * \dim_ratio:nn {1pt}{1cm}}
+        \group_end:
+        \pgftransformshift{\pgfpoint{\g__tilings_xa_dim}{\g__tilings_ya_dim}}
+        \pgftransformtriangle
+        {\pgfpoint{0pt}{0pt}}
+        {\pgfpoint{\g__tilings_xb_dim}{\g__tilings_yb_dim}}
+        {\pgfpoint{-\g__tilings_yb_dim}{\g__tilings_xb_dim}}
+        \str_set:Nx \l__tilings_tmpa_str
+        {\__tilings_keys_get:n {alignment~ edge}}
+        \str_set:Nx \l__tilings_tmpa_str {\str_head:N \l__tilings_tmpa_str}
+        \str_put_right:Nx \l__tilings_tmpa_str
+        {\__tilings_keys_get:n {alignment~ new~ edge}}
+        \str_set:Nx \l__tilings_tmpb_str {\str_lowercase:f { \l__tilings_tmpa_str}}
+        \str_if_eq:NNT \l__tilings_tmpa_str \l__tilings_tmpb_str
+        {
+          \str_set:Nx \l__tilings_tmpb_str
+          {\str_uppercase:f { \l__tilings_tmpa_str}}
+        }
+
+        \IfBooleanT {#1}
+        {
+          \bool_set:Nn \l__tilings_cw_bool {!\l__tilings_cw_bool}
+        }
+        \bool_if:NT \l__tilings_cw_bool
+        {
+          \pgftransformyscale {-1}
+        }
+        \__tilings_transform_side_to_axis:NnV \l__tilings_cw_bool {#2} \l__tilings_tmpb_str
+      }
+      \__tilings_coordinates_at_vertices:n {#2}
+      \coordinate[alias=-center] (-centre) at (0,0);
+      \UseTile[
+        every~ tile~ clip/.try,
+        every~ #2~ clip/.try,
+        this~ tile~ clip/.try
+      ]{#2}
+      \tikzset{
+        every~ tile~ before~ path/.try,
+        every~ #2~ before~ path/.try,
+        this~ tile~ before~ path/.try
+      }
+      \UseTile[
+        every~ tile/.try,
+        every~ #2/.try,
+        this~ tile/.try,
+        pic~ actions
+      ]{#2}
+      \tikzset{
+        every~ tile~ after~ path/.try,
+        every~ #2~ after~ path/.try,
+        this~ tile~ after~ path/.try
+      }
+      \end{scope}
+    },
+    #2/.style={
+      every~ tile~ pic/.try,
+      every~ #2~ pic/.try,
+      pic~ type=#2,
+    }
+  }
+}
+\cs_new_protected_nopar:Npn \__tilings_bake_tile:n #1
+{
+  \prop_get:NnN \g__tilings_tiles_prop {#1} \l__tilings_tmpa_tl
+  \__tilings_make_tile:nV {#1} \l__tilings_tmpa_tl
+}
+
+\NewDocumentCommand \BakeTile {m}
+{
+  \__tilings_bake_tile:n {#1}
+}
+\cs_new_protected_nopar:Npn \__tilings_use_tile:nn #1#2
+{
+  \tl_if_exist:cTF {g__tilings_tile_#2_tl}
+  {
+    \tl_set_eq:Nc \l__tilings_tmp_tile_path_tl {g__tilings_tile_#2_tl}
+    \pgfgettransform \l__tilings_tmpa_tl
+    \spath_transform:NV \l__tilings_tmp_tile_path_tl \l__tilings_tmpa_tl
+    \spath_tikz_path:nV {#1} \l__tilings_tmp_tile_path_tl
+  }
+  {
+    \msg_error:nnn { tilings }{ not baked }{#2}
+  }
+}
+
+\NewDocumentCommand \UseTile {O{} m}
+{
+  \__tilings_use_tile:nn {#1}{#2}
+}
+\tikzset{
+  save~ tiling~ path/.code={
+    \tikz@addmode{
+      \pgfsyssoftpath@getcurrentpath\l__tilings_tmpa_tl
+      \__tilings_normalise_path:N \l__tilings_tmpa_tl
+      \tl_gclear_new:c {g__tilings_side_#1_tl}
+      \tl_gset_eq:cN {g__tilings_side_#1_tl} \l__tilings_tmpa_tl
+      \tl_set:Nx \l__tilings_tmpb_tl {\str_uppercase:n {#1}}
+      \spath_reverse:N \l__tilings_tmpa_tl
+      \spath_transform:Nnnnnnn \l__tilings_tmpa_tl {-1} {0} {0} {-1} {1} {0}
+      \tl_gclear_new:c {g__tilings_side_ \tl_use:N \l__tilings_tmpb_tl _tl}
+      \tl_gset_eq:cN {g__tilings_side_ \tl_use:N \l__tilings_tmpb_tl _tl} \l__tilings_tmpa_tl
+    }
+  },
+  clone~ tiling~ side~ path/.style~ 2~ args={
+    spath/set~ name=tiling~ side,
+    spath/clone~ global={#1}{#2}
+  },
+  flip~ tile/.code={
+    \tl_set:Nn \l__tilings_tmpa_tl {#1}
+    \tl_set:Nn \l__tilings_tmpb_tl {true}
+    \bool_set:Nn \l__tilings_cw_bool {\tl_if_eq_p:NN \l__tilings_tmpa_tl \l__tilings_tmpb_tl}
+  },
+  flip~ tile/.default={true},
+  spath/prefix/tiling~side/.style={
+    spath/set~ prefix=g__tilings_side_,
+  },
+  spath/suffix/tiling~side/.style={
+    spath/set~ suffix=_tl,
+  },
+  clone~ tile~ path/.style~ 2~ args={
+    spath/set~ name=tiling~tile,
+    spath/clone~ global={#1}{#2}
+  },
+  spath/prefix/tiling~tile/.style={
+    spath/set~ prefix=g__tilings_tile_,
+  },
+  spath/suffix/tiling~tile/.style={
+    spath/set~ suffix=_tl,
+  },
+  expand~ key/.code={
+    \exp_args:NV \pgfkeysalso #1
+  }
+}
+\cs_new_nopar:Npn \__tilings_make_lms:Nnnn #1#2#3#4
+{
+  \group_begin:
+  \tl_set:Nn \l__tilings_tmpb_tl {#4}
+  \prg_replicate:nn {#3} {
+    \tl_set_eq:NN \l__tilings_tmpa_tl \l__tilings_tmpb_tl
+    \tl_clear:N \l__tilings_tmpb_tl
+    \tl_map_inline:Nn \l__tilings_tmpa_tl
+    {
+      \tl_set:Nx \l__tilings_action_lms_tl {\tl_head:n {##1}}
+      \tl_set:Nx \l__tilings_parameters_lms_tl {\tl_tail:n {##1}}
+      \prop_if_in:cVTF {g__tilings_#2_lms_rule_prop} \l__tilings_action_lms_tl
+      {
+        \prop_get:cVN {g__tilings_#2_lms_rule_prop} \l__tilings_action_lms_tl \l__tilings_tmpc_tl
+        \tl_put_right:Nx \l__tilings_tmpb_tl {\tl_use:N \l__tilings_tmpc_tl}
+      }
+      {
+        \tl_if_single:nTF {##1}
+        {
+          \tl_put_right:Nn \l__tilings_tmpb_tl {##1}
+        }
+        {
+          \tl_put_right:Nn \l__tilings_tmpb_tl {{##1}}
+        }
+      }
+    }
+  }
+  \tl_set:Nn \l__tilings_tmpa_tl {
+    \group_end:
+    \tl_set:Nn #1
+  }
+  \tl_put_right:Nx \l__tilings_tmpa_tl {{\tl_use:N \l__tilings_tmpb_tl}}
+  \tl_use:N \l__tilings_tmpa_tl
+}
+\cs_generate_variant:Nn \__tilings_make_lms:Nnnn {Nnnx}
+\cs_new_nopar:Npn \__tilings_invoke_lms:nn #1#2
+{
+  \group_begin:
+  \tl_map_inline:nn {#1} {
+    \tl_set:Nx \l__tilings_action_lms_tl {\tl_head:n {##1}}
+    \tl_set:Nx \l__tilings_parameters_lms_tl {\tl_tail:n {##1}}
+    \prop_if_in:cVTF {g__tilings_#2_lms_action_prop} \l__tilings_action_lms_tl
+    {
+      \prop_item:cV {g__tilings_#2_lms_action_prop} \l__tilings_action_lms_tl
+    }
+    {
+      \prop_if_in:cVT {g__tilings_default_lms_action_prop} \l__tilings_action_lms_tl
+      {
+        \prop_item:cV {g__tilings_default_lms_action_prop} \l__tilings_action_lms_tl
+      }
+    }
+  }
+  \group_end:
+}
+\cs_generate_variant:Nn \__tilings_invoke_lms:nn {Vn}
+\dim_new:N \l__tilings_step_dim
+\dim_set:Nn \l__tilings_step_dim {1cm}
+\prop_new:N \g__tilings_default_lms_action_prop
+\prop_gput:Nnn \g__tilings_default_lms_action_prop {[} {\group_begin:}
+\prop_gput:Nnn \g__tilings_default_lms_action_prop {]} {\group_end:}
+\prop_gput:Nnn \g__tilings_default_lms_action_prop {f}
+{\pgftransformxshift{\l__tilings_step_dim}}
+\prop_gput:Nnn \g__tilings_default_lms_action_prop {b}
+{\pgftransformxshift{-\l__tilings_step_dim}}
+\prop_new:N \g__tilings_drawables_lms_prop
+\int_new:N \g__tilings_tile_int
+\int_new:N \g__tilings_tiles_int
+\cs_new_protected_nopar:Npn \__tilings_tiling_decomposition:nnnn #1#2#3#4
+{
+  \group_begin:
+  \tikzset{
+    every~ #2~ decomposition/.try,
+    #1
+  }
+  \__tilings_make_lms:Nnnx \l__tilings_tmpa_tl {#2} {#3} {#4}
+  \__tilings_count_lms:Vn \l__tilings_tmpa_tl {#2}
+  \int_gzero:N \g__tilings_tile_int
+  \__tilings_invoke_lms:Vn \l__tilings_tmpa_tl {#2}
+  \group_end:
+}
+\cs_new_protected_nopar:Npn \__tilings_tiling_decomposition:nnn #1#2#3
+{
+  \__tilings_tiling_decomposition:nnnn {}{#1}{#2}{#3}
+}
+\cs_generate_variant:Nn \__tilings_tiling_decomposition:nnn {VVV}
+
+\NewDocumentCommand \TilingDecomposition { O{} m m m }
+{
+ \__tilings_tiling_decomposition:nnnn {#1}{#2}{#3}{#4}
+}
+
+\tikzset{
+  pics/decomposition/.style~ n~ args={3}{
+    code={
+      \__tilings_tiling_decomposition:nnn {#1}{#2}{#3}
+    }
+  }
+}
+\cs_new_nopar:Npn \__tilings_count_lms:nn #1#2
+{
+  \group_begin:
+  \int_gzero:N \g__tilings_tiles_int
+  \prop_get:NnNT \g__tilings_drawables_lms_prop {#2} \l__tilings_tmpa_tl
+  {
+    \tl_map_variable:nNn {#1} \l__tilings_tmpb_tl
+    {
+      \tl_set:Nx \l__tilings_tmpb_tl {\tl_head:N \l__tilings_tmpb_tl}
+      \bool_do_while:nn
+      {
+        !\tl_if_empty_p:N \l__tilings_tmpb_tl
+        &&
+        \tl_if_head_is_group_p:V \l__tilings_tmpb_tl
+      }
+      {
+        \tl_set:Nx \l__tilings_tmpb_tl {\tl_head:N \l__tilings_tmpb_tl}
+      }
+      \tl_if_in:NVT \l__tilings_tmpa_tl \l__tilings_tmpb_tl
+      {
+        \int_gincr:N \g__tilings_tiles_int
+      }
+    }
+  }
+  \group_end:
+}
+\cs_generate_variant:Nn \__tilings_count_lms:nn {Vn}
+\tikzset{
+  tiling~ step/.code={
+    \dim_set:Nn \l__tilings_step_dim {#1}
+  }
+}
+\ExplSyntaxOff
+%% 
+%% Copyright (C) 2014-2023 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  penrose_code.dtx
+%%                                  penrose.tex
+%% and the derived files            penrose.ins
+%%                                  penrose_code.pdf
+%%                                  penrose.pdf
+%%                                  tikzlibrarytilings.code.tex
+%%                                  tikzlibrarytilings.penrose.code.tex
+%%                                  tikzlibrarytilings.polykite.code.tex
+%%                                  tikzlibrarypenrose.code.tex
+%%                                  README.txt
+%% 
+%%
+%% End of file `tikzlibrarytilings.code.tex'.
-- 
cgit v1.2.3

