From a16eced7ce206f6c49ce7fe3cb15235d019f7a4a Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Thu, 2 Sep 2021 03:03:14 +0000
Subject: CTAN sync 202109020303

---
 .../latex/contrib/tabularray/tabularray-2021.sty   | 955 ++++++++++++++-------
 1 file changed, 641 insertions(+), 314 deletions(-)

(limited to 'macros/latex/contrib/tabularray/tabularray-2021.sty')

diff --git a/macros/latex/contrib/tabularray/tabularray-2021.sty b/macros/latex/contrib/tabularray/tabularray-2021.sty
index 90ddaadd34..8e5c2b9369 100644
--- a/macros/latex/contrib/tabularray/tabularray-2021.sty
+++ b/macros/latex/contrib/tabularray/tabularray-2021.sty
@@ -12,7 +12,7 @@
 
 \NeedsTeXFormat{LaTeX2e}
 \RequirePackage{expl3}
-\ProvidesExplPackage{tabularray}{2021-05-25}{2021J}
+\ProvidesExplPackage{tabularray}{2021-06-05}{2021K}
   {Typeset tabulars and arrays with LaTeX3}
 
 \RequirePackage{xparse}
@@ -97,60 +97,78 @@
 \box_new:N \l__tblr_c_box % for cell box
 \box_new:N \l__tblr_d_box
 
+%% Some counters for row and column numbering
+\newcounter{rownum}
+\newcounter{colnum}
+\newcounter{rowcount}
+\newcounter{colcount}
+
 %%% --------------------------------------------------------
 %%  \section{Data Structures Based on Property Lists}
 %%% --------------------------------------------------------
 
 \int_new:N \g_tblr_level_int % store table nesting level
 
+\cs_new_protected:Npn \__tblr_clear_prop_lists:
+  {
+    \prop_gclear_new:c { g__tblr_text_ \int_use:N \g_tblr_level_int _prop }
+    \prop_gclear_new:c { g__tblr_command_ \int_use:N \g_tblr_level_int _prop }
+    \prop_gclear_new:c { g__tblr_table_ \int_use:N \g_tblr_level_int _prop }
+    \prop_gclear_new:c { g__tblr_row_ \int_use:N \g_tblr_level_int _prop }
+    \prop_gclear_new:c { g__tblr_column_ \int_use:N \g_tblr_level_int _prop }
+    \prop_gclear_new:c { g__tblr_cell_ \int_use:N \g_tblr_level_int _prop }
+    \prop_gclear_new:c { g__tblr_hline_ \int_use:N \g_tblr_level_int _prop }
+    \prop_gclear_new:c { g__tblr_vline_ \int_use:N \g_tblr_level_int _prop }
+  }
+
 \cs_new_protected:Npn \__tblr_prop_gput:nnn #1 #2 #3
   {
     \prop_gput:cnn
-      { g_tblr_#1_ \int_use:N \g_tblr_level_int _prop } { #2 } { #3 }
+      { g__tblr_#1_ \int_use:N \g_tblr_level_int _prop } { #2 } { #3 }
   }
 \cs_generate_variant:Nn \__tblr_prop_gput:nnn { nnx, nnV, nxn, nxx, nxV }
 
 \cs_new:Npn \__tblr_prop_item:nn #1 #2
   {
-    \prop_item:cn { g_tblr_#1_ \int_use:N \g_tblr_level_int _prop } { #2 }
+    \prop_item:cn { g__tblr_#1_ \int_use:N \g_tblr_level_int _prop } { #2 }
   }
 \cs_generate_variant:Nn \__tblr_prop_item:nn { ne }
 
 \cs_new_protected:Npn \__tblr_prop_if_in:nnT #1
   {
-    \prop_if_in:cnT { g_tblr_#1_ \int_use:N \g_tblr_level_int _prop }
+    \prop_if_in:cnT { g__tblr_#1_ \int_use:N \g_tblr_level_int _prop }
   }
 \cs_new_protected:Npn \__tblr_prop_if_in:nnF #1
   {
-    \prop_if_in:cnF { g_tblr_#1_ \int_use:N \g_tblr_level_int _prop }
+    \prop_if_in:cnF { g__tblr_#1_ \int_use:N \g_tblr_level_int _prop }
   }
 \cs_new_protected:Npn \__tblr_prop_if_in:nnTF #1
   {
-    \prop_if_in:cnTF { g_tblr_#1_ \int_use:N \g_tblr_level_int _prop }
+    \prop_if_in:cnTF { g__tblr_#1_ \int_use:N \g_tblr_level_int _prop }
   }
 \prg_generate_conditional_variant:Nnn \__tblr_prop_if_in:nn { nx } { T, F, TF }
 
 \cs_new_protected:Npn \__tblr_prop_log:n #1
   {
-    \prop_log:c { g_tblr_#1_ \int_use:N \g_tblr_level_int _prop }
+    \prop_log:c { g__tblr_#1_ \int_use:N \g_tblr_level_int _prop }
   }
 
 \cs_new_protected:Npn \__tblr_prop_map_inline:nn #1 #2
   {
-    \prop_map_inline:cn { g_tblr_#1_ \int_use:N \g_tblr_level_int _prop } {#2}
+    \prop_map_inline:cn { g__tblr_#1_ \int_use:N \g_tblr_level_int _prop } {#2}
   }
 
 \cs_new_protected:Npn \__tblr_prop_gput_if_larger:nnn #1 #2 #3
   {
     \__tblr_gput_if_larger:cnn
-      { g_tblr_#1_ \int_use:N \g_tblr_level_int _prop } { #2 } { #3 }
+      { g__tblr_#1_ \int_use:N \g_tblr_level_int _prop } { #2 } { #3 }
   }
 \cs_generate_variant:Nn \__tblr_prop_gput_if_larger:nnn { nnx, nnV, nxn, nxx, nxV }
 
 \cs_new_protected:Npn \__tblr_prop_gadd_dimen_value:nnn #1 #2 #3
   {
     \__tblr_gadd_dimen_value:cnn
-      { g_tblr_#1_ \int_use:N \g_tblr_level_int _prop } { #2 } { #3 }
+      { g__tblr_#1_ \int_use:N \g_tblr_level_int _prop } { #2 } { #3 }
   }
 \cs_generate_variant:Nn \__tblr_prop_gadd_dimen_value:nnn { nnx, nnV, nxn, nxx }
 
@@ -193,27 +211,90 @@
   }
 \cs_generate_variant:Nn \__tblr_gadd_dimen_value:Nnn { cnn }
 
-%% Some counters for row and column numbering
-\newcounter{rownum}
-\newcounter{colnum}
-\newcounter{rowcount}
-\newcounter{colcount}
+%%% --------------------------------------------------------
+%%  \section{Data Structures Based on Token Lists}
+%%% --------------------------------------------------------
+
+\cs_new_protected:Npn \__tblr_clear_text_lists:
+  {
+    \__tblr_clear_one_text_lists:n { text }
+    \__tblr_clear_one_text_lists:n { hline }
+    \__tblr_clear_one_text_lists:n { vline }
+  }
+
+\cs_new_protected:Npn \__tblr_clear_one_text_lists:n #1
+  {
+    \clist_if_exist:cTF { g__tblr_#1_ \int_use:N \g_tblr_level_int _clist }
+      {
+        \clist_map_inline:cn { g__tblr_#1_ \int_use:N \g_tblr_level_int _clist }
+          {
+            \tl_gclear:c { g__tblr_text_ \int_use:N \g_tblr_level_int _#1_##1_tl }
+          }
+      }
+      { \clist_new:c { g__tblr_#1_ \int_use:N \g_tblr_level_int _clist } }
+  }
+
+\cs_new_protected:Npn \__tblr_text_gput:nnn #1 #2 #3
+  {
+    \tl_gset:cn
+      { g__tblr_text_ \int_use:N \g_tblr_level_int _#1_#2_tl } {#3}
+    \clist_gput_right:cx { g__tblr_#1_ \int_use:N \g_tblr_level_int _clist } {#2}
+  }
+\cs_generate_variant:Nn \__tblr_text_gput:nnn { nne, nnV, nen, nee, neV }
+
+\cs_new:Npn \__tblr_text_item:nn #1 #2
+  {
+    \tl_if_exist:cT { g__tblr_text_ \int_use:N \g_tblr_level_int _#1_#2_tl }
+      {
+        \exp_args:Nv \exp_not:n
+          { g__tblr_text_ \int_use:N \g_tblr_level_int _#1_#2_tl }
+      }
+  }
+\cs_generate_variant:Nn \__tblr_text_item:nn { ne }
+
+\cs_new_protected:Npn \__tblr_text_gput_if_larger:nnn #1 #2 #3
+  {
+    \tl_set:Nx \l__tblr_put_if_larger_tl { \__tblr_text_item:nn {#1} {#2} }
+    \bool_lazy_or:nnT
+      { \tl_if_empty_p:N \l__tblr_put_if_larger_tl }
+      { \dim_compare_p:nNn {#3} > { \l__tblr_put_if_larger_tl } }
+      { \__tblr_text_gput:nnn {#1} {#2} {#3} }
+  }
+\cs_generate_variant:Nn \__tblr_text_gput_if_larger:nnn { nne, nnV, nen, nee, neV }
+
+\cs_new_protected:Npn \__tblr_text_log:n #1
+  {
+    \clist_gremove_duplicates:c
+      { g__tblr_#1_ \int_use:N \g_tblr_level_int _clist }
+    \tl_log:n { ----------~----------~----------~----------~---------- }
+    \clist_map_inline:cn { g__tblr_#1_ \int_use:N \g_tblr_level_int _clist }
+      {
+        \tl_log:x
+          {
+            \space { #1 ##1 } ~\space=>~\space { \__tblr_text_item:nn {#1} {##1} }
+          }
+      }
+  }
 
 %%% --------------------------------------------------------
 %%  \section{Data Structures Based on Integer Arrays}
 %%% --------------------------------------------------------
 
-\int_new:N \g__tblr_array_int
+\msg_new:nnn { tabularray } { intarray-beyond-bound }
+  { Position ~ #2 ~ is ~ beyond ~ the ~ bound ~ of ~ intarray ~ #1.}
 
-\cs_new_protected:Npn \__tblr_initial_table_data:
+\cs_new_protected:Npn \__tblr_intarray_gset:Nnn #1 #2 #3
   {
-    \int_gincr:N \g__tblr_array_int
-    \intarray_new:cn { g__tblr_row_ \int_use:N \g__tblr_array_int _intarray }
-      { \g__tblr_data_row_key_count_int * \c@rowcount }
-    \cs_set_eq:cc { g__tblr_row_ \int_use:N \g_tblr_level_int _intarray }
-      { g__tblr_row_ \int_use:N \g__tblr_array_int _intarray }
-    %\intarray_log:c { g__tblr_row_ \int_use:N \g_tblr_level_int _intarray }
+    \bool_lazy_or:nnTF
+      { \int_compare_p:nNn {#2} < {0} }
+      { \int_compare_p:nNn {#2} > {\intarray_count:N #1} }
+      {
+        \bool_if:NT \g__tblr_tracing_intarray_bool
+          { \msg_warning:nnnn { tabularray } { intarray-beyond-bound } {#1} {#2} }
+      }
+      { \intarray_gset:Nnn #1 {#2} {#3} }
   }
+\cs_generate_variant:Nn \__tblr_intarray_gset:Nnn { cnn }
 
 %% #1: data name; #2: key name; #3: value type
 \cs_new_protected:Npn \__tblr_data_new_key:nnn #1 #2 #3
@@ -231,7 +312,6 @@
   }
 
 \int_new:N \g__tblr_data_row_key_count_int
-
 \__tblr_data_new_key:nnn { row } { height }      { dim }
 \__tblr_data_new_key:nnn { row } { coefficient } { dec }
 \__tblr_data_new_key:nnn { row } { abovesep }    { dim }
@@ -242,6 +322,52 @@
 \__tblr_data_new_key:nnn { row } { @row-upper }  { dim }
 \__tblr_data_new_key:nnn { row } { @row-lower }  { dim }
 
+\int_new:N \g__tblr_data_column_key_count_int
+\__tblr_data_new_key:nnn { column } { width }       { dim }
+\__tblr_data_new_key:nnn { column } { coefficient } { dec }
+\__tblr_data_new_key:nnn { column } { leftsep }     { dim }
+\__tblr_data_new_key:nnn { column } { rightsep }    { dim }
+\__tblr_data_new_key:nnn { column } { @col-width }  { dim }
+
+\int_new:N \g__tblr_data_cell_key_count_int
+\__tblr_data_new_key:nnn { cell } { width }        { dim }
+\__tblr_data_new_key:nnn { cell } { rowspan }      { int }
+\__tblr_data_new_key:nnn { cell } { colspan }      { int }
+\__tblr_data_new_key:nnn { cell } { halign }       { str }
+\__tblr_data_new_key:nnn { cell } { valign }       { str }
+\__tblr_data_new_key:nnn { cell } { background }   { str }
+\__tblr_data_new_key:nnn { cell } { omit }         { int }
+\__tblr_data_new_key:nnn { cell } { @cell-width }  { dim }
+\__tblr_data_new_key:nnn { cell } { @cell-height } { dim }
+\__tblr_data_new_key:nnn { cell } { @cell-depth }  { dim }
+
+\clist_const:Nn \g__tblr_data_clist { row, column, cell }
+\tl_const:Nn \g__tblr_data_row_count_tl { \c@rowcount }
+\tl_const:Nn \g__tblr_data_column_count_tl { \c@colcount }
+\tl_const:Nn \g__tblr_data_cell_count_tl { \c@rowcount * \c@colcount }
+\tl_const:Nn \g__tblr_data_row_index_number_tl {1}
+\tl_const:Nn \g__tblr_data_column_index_number_tl {1}
+\tl_const:Nn \g__tblr_data_cell_index_number_tl {2}
+\int_new:N \g__tblr_array_int
+
+\cs_new_protected:Npn \__tblr_initial_table_data:
+  {
+    \clist_map_function:NN \g__tblr_data_clist \__tblr_initial_one_data:n
+  }
+
+\cs_new_protected:Npn \__tblr_initial_one_data:n #1
+  {
+    \int_gincr:N \g__tblr_array_int
+    \intarray_new:cn { g__tblr_#1_ \int_use:N \g__tblr_array_int _intarray }
+      {
+        \int_use:c { g__tblr_data_#1_key_count_int }
+          * \tl_use:c { g__tblr_data_#1_count_tl }
+      }
+    \cs_set_eq:cc { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
+      { g__tblr_#1_ \int_use:N \g__tblr_array_int _intarray }
+    %\intarray_log:c { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
+  }
+
 %% #1: data name; #2: data index; #3: key name
 \cs_new:Npn \__tblr_data_key_to_int:nnn #1 #2 #3
   {
@@ -249,8 +375,17 @@
       + \tl_use:c { g__tblr_data_#1_key_number_#3_tl }
   }
 
+%% #1: data name; #2: data index 1; #3: data index 2; #4: key name
+\cs_new:Npn \__tblr_data_key_to_int:nnnn #1 #2 #3 #4
+  {
+    ( #2 - 1 ) * \c@colcount * \int_use:c { g__tblr_data_#1_key_count_int }
+      + ( #3 - 1 ) * \int_use:c { g__tblr_data_#1_key_count_int }
+      + \tl_use:c { g__tblr_data_#1_key_number_#4_tl }
+  }
+
 \int_new:N \l__tblr_key_count_int
 \int_new:N \l__tblr_key_quotient_int
+\int_new:N \l__tblr_key_quotient_two_int
 \int_new:N \l__tblr_key_remainder_int
 
 %% #1: data name; #2: array position;
@@ -275,11 +410,50 @@
       { g__tblr_data_#1_key_name_ \int_use:N \l__tblr_key_remainder_int _tl }
   }
 
+%% #1: data name; #2: array position;
+%% #3: returning tl with index 1; #4: returning tl with index 2;
+%% #5: returning tl with key name
+\cs_new:Npn \__tblr_data_int_to_key:nnNNN #1 #2 #3 #4 #5
+  {
+    \int_set_eq:Nc \l__tblr_key_count_int { g__tblr_data_#1_key_count_int }
+    \int_set:Nn \l__tblr_key_quotient_int
+      {
+        \int_div_truncate:nn
+          { #2 + \l__tblr_key_count_int - 1 } { \l__tblr_key_count_int }
+      }
+    \int_set:Nn \l__tblr_key_remainder_int
+      {
+        #2 + \l__tblr_key_count_int
+          - \l__tblr_key_quotient_int * \l__tblr_key_count_int
+      }
+    \int_compare:nNnT { \l__tblr_key_remainder_int } = { 0 }
+      { \int_set_eq:NN \l__tblr_key_remainder_int \l__tblr_key_count_int }
+    \tl_set_eq:Nc #5
+      { g__tblr_data_#1_key_name_ \int_use:N \l__tblr_key_remainder_int _tl }
+    \int_set:Nn \l__tblr_key_quotient_two_int
+      {
+        \int_div_truncate:nn
+          { \l__tblr_key_quotient_int + \c@colcount - 1 } { \c@colcount }
+      }
+    \int_set:Nn \l__tblr_key_remainder_int
+      {
+        \l__tblr_key_quotient_int + \c@colcount
+          - \l__tblr_key_quotient_two_int * \c@colcount
+      }
+    \int_compare:nNnT { \l__tblr_key_remainder_int } = { 0 }
+      { \int_set_eq:NN \l__tblr_key_remainder_int \c@colcount }
+    \tl_set:Nx #4 { \int_use:N \l__tblr_key_remainder_int }
+    \tl_set:Nx #3 { \int_use:N \l__tblr_key_quotient_two_int }
+  }
+
+\tl_new:N \g__tblr_data_int_from_value_tl
+
 %% #1: data name; #2: key name; #3: value
-\cs_new:Npn \__tblr_data_value_to_int:nnn #1 #2 #3
+%% The result will be stored in \g__tblr_data_int_from_value_tl
+\cs_new_protected:Npn \__tblr_data_int_from_value:nnn #1 #2 #3
   {
     \cs:w
-      __tblr_data_ \tl_use:c { g__tblr_data_#1_key_type_#2_tl } _to_int:n
+      __tblr_data_int_from_ \tl_use:c { g__tblr_data_#1_key_type_#2_tl } :n
     \cs_end:
     {#3}
   }
@@ -294,9 +468,19 @@
   }
 \cs_generate_variant:Nn \__tblr_data_int_to_value:nnn { nne, nVe }
 
-\cs_new:Npn \__tblr_data_dim_to_int:n #1
+\cs_new_protected:Npn \__tblr_data_int_from_int:n #1
   {
-    \dim_to_decimal_in_sp:n {#1}
+    \tl_gset:Nn \g__tblr_data_int_from_value_tl {#1}
+  }
+
+\cs_new:Npn \__tblr_data_int_to_int:n #1
+  {
+    #1
+  }
+
+\cs_new_protected:Npn \__tblr_data_int_from_dim:n #1
+  {
+    \tl_gset:Nx \g__tblr_data_int_from_value_tl { \dim_to_decimal_in_sp:n {#1} }
   }
 
 %% Return a dimension in pt so that it's easier to understand in tracing messages
@@ -307,9 +491,10 @@
     \dim_to_decimal:n { #1 sp } pt
   }
 
-\cs_new:Npn \__tblr_data_dec_to_int:n #1
+\cs_new_protected:Npn \__tblr_data_int_from_dec:n #1
   {
-    \dim_to_decimal_in_sp:n {#1 pt}
+    \tl_gset:Nx \g__tblr_data_int_from_value_tl
+      { \dim_to_decimal_in_sp:n {#1 pt} }
   }
 
 \cs_new:Npn \__tblr_data_int_to_dec:n #1
@@ -317,17 +502,57 @@
     \dim_to_decimal:n {#1 sp}
   }
 
+\int_new:N \g__tblr_data_str_value_count_int
+\tl_set:cn { g__tblr_data_0_to_str_tl } { }
+
+\cs_new_protected:Npn \__tblr_data_int_from_str:n #1
+  {
+    \tl_if_exist:cTF { g__tblr_data_#1_to_int_tl }
+      {
+        \tl_gset_eq:Nc \g__tblr_data_int_from_value_tl
+          { g__tblr_data_#1_to_int_tl }
+      }
+      {
+        \int_gincr:N \g__tblr_data_str_value_count_int
+        \tl_gset:cx { g__tblr_data_#1_to_int_tl }
+          { \int_use:N \g__tblr_data_str_value_count_int }
+        \tl_gset:cx
+          { g__tblr_data_ \int_use:N \g__tblr_data_str_value_count_int _to_str_tl }
+          { #1 }
+        \tl_gset:Nx \g__tblr_data_int_from_value_tl
+          { \int_use:N \g__tblr_data_str_value_count_int }
+      }
+  }
+
+\cs_new:Npn \__tblr_data_int_to_str:n #1
+  {
+    \tl_use:c { g__tblr_data_#1_to_str_tl }
+  }
+
 %% #1: data name; #2: data index; #3: key; #4: value
 \cs_new_protected:Npn \__tblr_data_gput:nnnn #1 #2 #3 #4
   {
-    \intarray_gset:cnn
+    \__tblr_data_int_from_value:nnn {#1} {#3} {#4}
+    \__tblr_intarray_gset:cnn
       { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
       { \__tblr_data_key_to_int:nnn {#1} {#2} {#3} }
-      { \__tblr_data_value_to_int:nnn {#1} {#3} {#4} }
+      { \g__tblr_data_int_from_value_tl }
   }
 \cs_generate_variant:Nn \__tblr_data_gput:nnnn
   { nnne, nnnV, nenn, nene, nenV, nVnn }
 
+%% #1: data name; #2: data index 1; #3: data index 2; #4: key; #5: value
+\cs_new_protected:Npn \__tblr_data_gput:nnnnn #1 #2 #3 #4 #5
+  {
+    \__tblr_data_int_from_value:nnn {#1} {#4} {#5}
+    \__tblr_intarray_gset:cnn
+      { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
+      { \__tblr_data_key_to_int:nnnn {#1} {#2} {#3} {#4} }
+      { \g__tblr_data_int_from_value_tl }
+  }
+\cs_generate_variant:Nn \__tblr_data_gput:nnnnn
+  { nnnne, nnnnV, neenn, neene, neenV, neeen, nVVnn }
+
 %% #1: data name; #2: data index; #3: key
 \cs_new:Npn \__tblr_data_item:nnn #1 #2 #3
   {
@@ -339,13 +564,32 @@
   }
 \cs_generate_variant:Nn \__tblr_data_item:nnn { nen }
 
+%% #1: data name; #2: data index 1; #3: data index 2; #4: key
+\cs_new:Npn \__tblr_data_item:nnnn #1 #2 #3 #4
+  {
+    \__tblr_data_int_to_value:nne {#1} {#4}
+      {
+        \intarray_item:cn { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
+          { \__tblr_data_key_to_int:nnnn {#1} {#2} {#3} {#4} }
+      }
+  }
+\cs_generate_variant:Nn \__tblr_data_item:nnnn { neen }
+
 \tl_new:N \l__tblr_data_key_tl
 \tl_new:N \l__tblr_data_index_tl
+\tl_new:N \l__tblr_data_index_two_tl
 
 \cs_new_protected:Npn \__tblr_data_log:n #1
+  {
+    \use:c { __tblr_data_log_ \use:c { g__tblr_data_#1_index_number_tl } :n } {#1}
+    \__tblr_prop_log:n {#1}
+  }
+
+\cs_new_protected:cpn { __tblr_data_log_1:n } #1
   {
     %\intarray_log:c { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
     \tl_set:Nx \l_tmpa_tl { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
+    \tl_log:n { ----------~----------~----------~----------~---------- }
     \int_step_inline:nn
       { \intarray_count:c { \l_tmpa_tl } }
       {
@@ -353,52 +597,80 @@
           \l__tblr_data_index_tl \l__tblr_data_key_tl
         \tl_log:x
           {
+            \space
             { #1 [\l__tblr_data_index_tl] / \l__tblr_data_key_tl }
-            \space = \space
+            ~\space => ~\space
+            {
+              \__tblr_data_int_to_value:nVe {#1} \l__tblr_data_key_tl
+                { \intarray_item:cn { \l_tmpa_tl } {##1} }
+            }
+          }
+      }
+  }
+
+\cs_new_protected:cpn { __tblr_data_log_2:n } #1
+  {
+    %\intarray_log:c { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
+    \tl_set:Nx \l_tmpa_tl { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
+    \tl_log:n { ----------~----------~----------~----------~---------- }
+    \int_step_inline:nn
+      { \intarray_count:c { \l_tmpa_tl } }
+      {
+        \__tblr_data_int_to_key:nnNNN {#1} {##1}
+          \l__tblr_data_index_tl \l__tblr_data_index_two_tl \l__tblr_data_key_tl
+        \tl_log:x
+          {
+            \space
+            {
+              #1 [\l__tblr_data_index_tl][\l__tblr_data_index_two_tl]
+                 / \l__tblr_data_key_tl
+            }
+            ~\space => ~\space
             {
               \__tblr_data_int_to_value:nVe {#1} \l__tblr_data_key_tl
                 { \intarray_item:cn { \l_tmpa_tl } {##1} }
             }
           }
       }
-    \__tblr_prop_log:n {#1}
   }
 
 %% #1: data name; #2: row index; #3: key; #4: value
 \cs_new_protected:Npn \__tblr_data_gput_if_larger:nnnn #1 #2 #3 #4
   {
+    \__tblr_data_int_from_value:nnn {#1} {#3} {#4}
     \__tblr_array_gput_if_larger:cnn
       { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
       { \__tblr_data_key_to_int:nnn {#1} {#2} {#3} }
-      { \__tblr_data_value_to_int:nnn {#1} {#3} {#4} }
+      { \g__tblr_data_int_from_value_tl }
   }
 \cs_generate_variant:Nn \__tblr_data_gput_if_larger:nnnn { nnne, nnnV, nene, nenV }
 
 \cs_new_protected:Npn \__tblr_array_gput_if_larger:Nnn #1 #2 #3
   {
     \int_compare:nNnT {#3} > { \intarray_item:Nn #1 {#2} }
-      { \intarray_gset:Nnn #1 {#2} {#3} }
+      { \__tblr_intarray_gset:Nnn #1 {#2} {#3} }
   }
 \cs_generate_variant:Nn \__tblr_array_gput_if_larger:Nnn { cnn }
 
 %% #1: data name; #2: data index; #3: key; #4: value
 \cs_new_protected:Npn \__tblr_data_gadd_dimen_value:nnnn #1 #2 #3 #4
   {
+    \__tblr_data_int_from_value:nnn {#1} {#3} {#4}
     \__tblr_array_gadd_value:cnn
       { g__tblr_#1_ \int_use:N \g_tblr_level_int _intarray }
       { \__tblr_data_key_to_int:nnn {#1} {#2} {#3} }
-      { \__tblr_data_value_to_int:nnn {#1} {#3} {#4} }
+      { \g__tblr_data_int_from_value_tl }
   }
 \cs_generate_variant:Nn \__tblr_data_gadd_dimen_value:nnnn { nnne, nnnV, nene }
 
 \cs_new_protected:Npn \__tblr_array_gadd_value:Nnn #1 #2 #3
   {
-    \intarray_gset:Nnn #1 {#2} { \intarray_item:Nn #1 {#2} + #3 }
+    \__tblr_intarray_gset:Nnn #1 {#2} { \intarray_item:Nn #1 {#2} + #3 }
   }
 \cs_generate_variant:Nn \__tblr_array_gadd_value:Nnn { cnn }
 
 \bool_new:N \g__tblr_use_intarray_bool
-%\bool_set_true:N \g__tblr_use_intarray_bool
+\bool_set_true:N \g__tblr_use_intarray_bool
 
 \AtBeginDocument
   {
@@ -408,10 +680,18 @@
           {
             \__tblr_prop_gput:nnn {#1} { [#2] / #3 } {#4}
           }
+        \cs_set_protected:Npn \__tblr_data_gput:nnnnn #1 #2 #3 #4 #5
+          {
+            \__tblr_prop_gput:nnn {#1} { [#2][#3] / #4 } {#5}
+          }
         \cs_set:Npn \__tblr_data_item:nnn #1 #2 #3
           {
             \__tblr_prop_item:nn {#1} { [#2] / #3 }
           }
+        \cs_set:Npn \__tblr_data_item:nnnn #1 #2 #3 #4
+          {
+            \__tblr_prop_item:nn {#1} { [#2][#3] / #4 }
+          }
         \cs_set_protected:Npn \__tblr_data_log:n #1
           {
             \__tblr_prop_log:n {#1}
@@ -420,10 +700,18 @@
           {
             \__tblr_prop_gput_if_larger:nnn {#1} { [#2] / #3 } {#4}
           }
+        \cs_set_protected:Npn \__tblr_data_gput_if_larger:nnnnn #1 #2 #3 #4 #5
+          {
+            \__tblr_prop_gput_if_larger:nnn {#1} { [#2][#3] / #4 } {#5}
+          }
         \cs_set_protected:Npn \__tblr_data_gadd_dimen_value:nnnn #1 #2 #3 #4
           {
             \__tblr_prop_gadd_dimen_value:nnn {#1} { [#2] / #3 } {#4}
           }
+        \cs_set_protected:Npn \__tblr_data_gadd_dimen_value:nnnnn #1 #2 #3 #4 #5
+          {
+            \__tblr_prop_gadd_dimen_value:nnn {#1} { [#2][#3] / #4 } {#5}
+          }
       }
   }
 
@@ -490,7 +778,6 @@
 \regex_const:Nn \c__tblr_split_selector_name_regex { ^ ( [A-Za-z] {2,} ) ( . * ) }
 \seq_new:N \l__tblr_childs_split_seq
 \seq_new:N \l__tblr_childs_regex_seq
-\tl_new:N \l__tblr_childs_end_tl
 \tl_new:N \l__tblr_childs_selector_tl
 
 %% #1, child specifications; #2, total number.
@@ -524,15 +811,16 @@
   {
     \seq_set_split:Nnn \l__tblr_childs_split_seq {,} {#1}
     \seq_map_inline:Nn \l__tblr_childs_split_seq
-      { \__tblr_get_childs_normal_aux:w ##1 - s \scan_stop }
+      {
+        \tl_if_in:nnTF {##1} {-}
+          { \__tblr_get_childs_normal_aux:w ##1 \scan_stop }
+          { \__tblr_get_childs_normal_aux:w ##1 - ##1 \scan_stop }
+      }
   }
 
-\cs_new_protected_nopar:Npn \__tblr_get_childs_normal_aux:w #1 - #2 #3 \scan_stop
+\cs_new_protected_nopar:Npn \__tblr_get_childs_normal_aux:w #1 - #2 \scan_stop
   {
-    \tl_if_eq:nnTF {#2} {s}
-      { \tl_set:Nn \l__tblr_childs_end_tl {#1} }
-      { \tl_set:Nn \l__tblr_childs_end_tl {#2} }
-    \int_step_inline:nnn {#1} { \l__tblr_childs_end_tl }
+    \int_step_inline:nnn {#1} {#2}
       { \clist_put_right:Nn \l_tblr_childs_clist {##1} }
   }
 
@@ -780,11 +1068,12 @@
   {
     \tl_clear:N \l__tblr_hline_num_tl
     \tl_set:Nx \l__tblr_hline_count_tl
-      { \__tblr_prop_item:ne { hline } { [\int_use:N \c@rownum] / @hline-count } }
-    \tl_if_empty:NTF \l__tblr_hline_count_tl
+      { \__tblr_text_item:ne { hline } { [\int_use:N \c@rownum] / @hline-count } }
+    %% \l__tblr_hline_count_tl may be empty when rowspec has extra |'s
+    \int_compare:nNnTF { \l__tblr_hline_count_tl + 0 } = {0}
       {
         \tl_set:Nx \l__tblr_hline_num_tl { 1 }
-        \__tblr_prop_gput:nxx { hline }
+        \__tblr_text_gput:nen { hline }
           { [\int_use:N \c@rownum] / @hline-count } { 1 }
       }
       {
@@ -806,7 +1095,7 @@
   {
     \tl_set:Nx \l__tblr_hline_count_tl
       { \int_eval:n { \l__tblr_hline_count_tl + 1 } }
-    \__tblr_prop_gput:nxx { hline }
+    \__tblr_text_gput:nee { hline }
       { [\int_use:N \c@rownum] / @hline-count } { \l__tblr_hline_count_tl }
     \tl_set_eq:NN \l__tblr_hline_num_tl \l__tblr_hline_count_tl
   }
@@ -842,18 +1131,18 @@
     \__tblr_get_childs:nx {#1} { \int_use:N \c@colcount }
     \clist_map_inline:Nn \l_tblr_childs_clist
       {
-        \__tblr_prop_gput:nxx { hline }
+        \__tblr_text_gput:nee { hline }
           { [\int_use:N \c@rownum][##1](\l__tblr_hline_num_tl) / @dash }
           { \l__tblr_hline_dash_tl }
         \tl_if_empty:NF \l__tblr_hline_wd_tl
           {
-            \__tblr_prop_gput:nxx { hline }
+            \__tblr_text_gput:nee { hline }
               { [\int_use:N \c@rownum][##1](\l__tblr_hline_num_tl) / wd }
               { \l__tblr_hline_wd_tl }
           }
         \tl_if_empty:NF \l__tblr_hline_fg_tl
           {
-            \__tblr_prop_gput:nxx { hline }
+            \__tblr_text_gput:nee { hline }
               { [\int_use:N \c@rownum][##1](\l__tblr_hline_num_tl) / fg }
               { \l__tblr_hline_fg_tl }
           }
@@ -978,11 +1267,12 @@
   {
     \tl_clear:N \l__tblr_vline_num_tl
     \tl_set:Nx \l__tblr_vline_count_tl
-      { \__tblr_prop_item:ne { vline } { [\int_use:N \c@colnum] / @vline-count } }
-    \tl_if_empty:NTF \l__tblr_vline_count_tl
+      { \__tblr_text_item:ne { vline } { [\int_use:N \c@colnum] / @vline-count } }
+    %% \l__tblr_vline_count_tl may be empty when colspec has extra |'s
+    \int_compare:nNnTF { \l__tblr_vline_count_tl + 0 } = {0}
       {
         \tl_set:Nx \l__tblr_vline_num_tl { 1 }
-        \__tblr_prop_gput:nxx { vline }
+        \__tblr_text_gput:nen { vline }
           { [\int_use:N \c@colnum] / @vline-count } { 1 }
       }
       {
@@ -1004,7 +1294,7 @@
   {
     \tl_set:Nx \l__tblr_vline_count_tl
       { \int_eval:n { \l__tblr_vline_count_tl + 1 } }
-    \__tblr_prop_gput:nxx { vline }
+    \__tblr_text_gput:nee { vline }
       { [\int_use:N \c@colnum] / @vline-count } { \l__tblr_vline_count_tl }
     \tl_set_eq:NN \l__tblr_vline_num_tl \l__tblr_vline_count_tl
   }
@@ -1039,18 +1329,18 @@
     \__tblr_get_childs:nx {#1} { \int_use:N \c@rowcount }
     \clist_map_inline:Nn \l_tblr_childs_clist
       {
-        \__tblr_prop_gput:nxx { vline }
+        \__tblr_text_gput:nee { vline }
           { [##1][\int_use:N \c@colnum](\l__tblr_vline_num_tl) / @dash }
           { \l__tblr_vline_dash_tl }
         \tl_if_empty:NF \l__tblr_vline_wd_tl
           {
-            \__tblr_prop_gput:nxx { vline }
+            \__tblr_text_gput:nee { vline }
               { [##1][\int_use:N \c@colnum](\l__tblr_vline_num_tl) / wd }
               { \l__tblr_vline_wd_tl }
           }
         \tl_if_empty:NF \l__tblr_vline_fg_tl
           {
-            \__tblr_prop_gput:nxx { vline }
+            \__tblr_text_gput:nee { vline }
               { [##1][\int_use:N \c@colnum](\l__tblr_vline_num_tl) / fg }
               { \l__tblr_vline_fg_tl }
           }
@@ -1150,42 +1440,77 @@
 
 \keys_define:nn { tblr-cell-spec }
   {
-    l .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / halign} {l},
-    c .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / halign} {c},
-    r .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / halign} {r},
-    t .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / valign} {t},
-    p .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / valign} {t},
-    m .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / valign} {m},
-    b .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / valign} {b},
-    h .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / valign} {h},
-    f .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / valign} {f},
-    wd .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / width} {#1},
-    bg .code:n = \__tblr_prop_gput:nxx {cell}
-                  {[\int_use:N \c@rownum][\int_use:N \c@colnum] / background} {#1},
+    l .code:n = \__tblr_data_gput:neenn { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { halign } {l},
+    c .code:n = \__tblr_data_gput:neenn { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { halign } {c},
+    r .code:n = \__tblr_data_gput:neenn { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { halign } {r},
+    t .code:n = \__tblr_data_gput:neenn { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { valign} {t},
+    p .code:n = \__tblr_data_gput:neenn { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { valign} {t},
+    m .code:n = \__tblr_data_gput:neenn { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { valign} {m},
+    b .code:n = \__tblr_data_gput:neenn { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { valign} {b},
+    h .code:n = \__tblr_data_gput:neenn { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { valign} {h},
+    f .code:n = \__tblr_data_gput:neenn { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { valign} {f},
+    wd .code:n = \__tblr_data_gput:neene { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum } { width } {#1},
+    bg .code:n = \__tblr_data_gput:neene { cell }
+                  { \int_use:N \c@rownum } { \int_use:N \c@colnum }
+                  { background } {#1},
+    preto .code:n = \__tblr_cell_preto_text:n {#1},
+    appto .code:n = \__tblr_cell_appto_text:n {#1},
+    fg .code:n = \__tblr_cell_preto_text:n { \color{#1} },
+    font .code:n = \__tblr_cell_preto_text:n { #1 \selectfont },
     unknown .code:n = \__tblr_cell_unknown_key:V \l_keys_key_str,
   }
 
+\tl_new:N \l__tblr_cell_text_tl
+
+\cs_new_protected:Npn \__tblr_cell_preto_text:n #1
+  {
+    \__tblr_cell_preto_text:een
+      { \int_use:N \c@rownum } { \int_use:N \c@colnum } {#1}
+  }
+
+\cs_new_protected:Npn \__tblr_cell_preto_text:nnn #1 #2 #3
+  {
+    \tl_set:Nx \l__tblr_cell_text_tl { \__tblr_text_item:nn { text } { [#1][#2] } }
+    \tl_put_left:Nn \l__tblr_cell_text_tl {#3}
+    \__tblr_text_gput:nnV { text } { [#1][#2] } \l__tblr_cell_text_tl
+  }
+\cs_generate_variant:Nn \__tblr_cell_preto_text:nnn { nen, enn, een }
+
+\cs_new_protected:Npn \__tblr_cell_appto_text:n #1
+  {
+    \__tblr_cell_appto_text:een
+      { \int_use:N \c@rownum } { \int_use:N \c@colnum } {#1}
+  }
+
+\cs_new_protected:Npn \__tblr_cell_appto_text:nnn #1 #2 #3
+  {
+    \tl_set:Nx \l__tblr_cell_text_tl { \__tblr_text_item:ne { text } { [#1][#2] } }
+    \tl_put_right:Nn \l__tblr_cell_text_tl {#3}
+    \__tblr_text_gput:neV { text } { [#1][#2] } \l__tblr_cell_text_tl
+  }
+\cs_generate_variant:Nn \__tblr_cell_appto_text:nnn { nen, enn, een }
+
 \cs_new_protected:Npn \__tblr_cell_unknown_key:n #1
   {
     \regex_match:NnTF \c__tblr_is_color_key_regex {#1}
       {
-        \__tblr_prop_gput:nxx {cell}
-          {[\int_use:N \c@rownum][\int_use:N \c@colnum] / background} {#1}
+        \__tblr_data_gput:neene { cell }
+          { \int_use:N \c@rownum } { \int_use:N \c@colnum } { background } {#1}
       }
       {
         \tl_set_rescan:Nnn \l__tblr_v_tl {} {#1}
-        \__tblr_prop_gput:nxx {cell}
-          { [\int_use:N \c@rownum][\int_use:N \c@colnum] / width }
+        \__tblr_data_gput:neene { cell }
+          { \int_use:N \c@rownum } { \int_use:N \c@colnum } { width }
           { \dim_eval:n { \l__tblr_v_tl } }
       }
   }
@@ -1196,14 +1521,14 @@
     \int_compare:nNnT { #1 } > { 1 }
       {
         \__tblr_prop_gput:nnn {table} {rowspan} {true}
-        \__tblr_prop_gput:nxn {cell}
-          { [\int_use:N \c@rownum][\int_use:N \c@colnum] / rowspan } { #1 }
+        \__tblr_data_gput:neenn { cell }
+          { \int_use:N \c@rownum } { \int_use:N \c@colnum } { rowspan } {#1}
       }
     \int_compare:nNnT { #2 } > { 1 }
       {
         \__tblr_prop_gput:nnn {table} {colspan} {true}
-        \__tblr_prop_gput:nxn {cell}
-          { [\int_use:N \c@rownum][\int_use:N \c@colnum] / colspan } { #2 }
+        \__tblr_data_gput:neenn { cell }
+          { \int_use:N \c@rownum } { \int_use:N \c@colnum } { colspan } {#2}
       }
     \int_step_variable:nnNn
       { \int_use:N \c@rownum } { \int_eval:n { \c@rownum + #1 - 1 } } \l__tblr_i_tl
@@ -1216,17 +1541,17 @@
               { \int_compare_p:nNn { \l__tblr_i_tl } = { \c@rownum } }
               { \int_compare_p:nNn { \l__tblr_j_tl } = { \c@colnum } }
               {
-                \__tblr_prop_gput:nxx {cell}
-                  { [\l__tblr_i_tl][\l__tblr_j_tl] / omit } {true}
+                \__tblr_data_gput:neenn { cell }
+                  { \l__tblr_i_tl } { \l__tblr_j_tl } { omit } {1}
               }
             \int_compare:nNnF { \l__tblr_i_tl } = { \c@rownum }
               {
-                \__tblr_prop_gput:nxx {hline}
+                \__tblr_text_gput:nen { hline }
                   { [\l__tblr_i_tl][\l__tblr_j_tl] / omit } {true}
               }
             \int_compare:nNnF { \l__tblr_j_tl } = { \c@colnum }
               {
-                \__tblr_prop_gput:nxx {vline}
+                \__tblr_text_gput:nee { vline }
                   { [\l__tblr_i_tl][\l__tblr_j_tl] / omit } {true}
               }
           }
@@ -1373,19 +1698,21 @@
                   { \int_use:N \c@colnum } { valign } {f},
     bg .code:n = \__tblr_set_key_for_every_column_cell:nnn
                   { \int_use:N \c@colnum } { background } {#1},
-    wd .code:n = \__tblr_prop_gput:nxx { column }
-                   { [\int_use:N \c@colnum] / width } { \dim_eval:n {#1} },
-    co .code:n = \__tblr_prop_gput:nxx { column }
-                   { [\int_use:N \c@colnum] / coefficient } {#1},
-    leftsep .code:n = \__tblr_prop_gput:nxx { column }
-                   { [\int_use:N \c@colnum] / leftsep } { \dim_eval:n {#1} },
-    rightsep .code:n = \__tblr_prop_gput:nxx { column }
-                   { [\int_use:N \c@colnum] / rightsep } { \dim_eval:n {#1} },
+    fg .code:n = \__tblr_preto_text_for_every_column_cell:n { \color{#1} },
+    font .code:n = \__tblr_preto_text_for_every_column_cell:n { #1 \selectfont },
+    wd .code:n = \__tblr_data_gput:nene { column }
+                   { \int_use:N \c@colnum } { width } { \dim_eval:n {#1} },
+    co .code:n = \__tblr_data_gput:nene { column }
+                   { \int_use:N \c@colnum } { coefficient } {#1},
+    leftsep .code:n = \__tblr_data_gput:nene { column }
+                   { \int_use:N \c@colnum } { leftsep } { \dim_eval:n {#1} },
+    rightsep .code:n = \__tblr_data_gput:nene { column }
+                   { \int_use:N \c@colnum } { rightsep } { \dim_eval:n {#1} },
     colsep .meta:n = { leftsep = #1, rightsep = #1},
-    leftsep+ .code:n = \__tblr_prop_gadd_dimen_value:nxx { column }
-                   { [\int_use:N \c@colnum] / leftsep } { \dim_eval:n {#1} },
-    rightsep+ .code:n = \__tblr_prop_gadd_dimen_value:nxx { column }
-                   { [\int_use:N \c@colnum] / rightsep } { \dim_eval:n {#1} },
+    leftsep+ .code:n = \__tblr_data_gadd_dimen_value:nene { column }
+                   { \int_use:N \c@colnum } { leftsep } { \dim_eval:n {#1} },
+    rightsep+ .code:n = \__tblr_data_gadd_dimen_value:nene { column }
+                   { \int_use:N \c@colnum } { rightsep } { \dim_eval:n {#1} },
     colsep+ .meta:n = { leftsep+ = #1, rightsep+ = #1},
     unknown .code:n = \__tblr_column_unknown_key:V \l_keys_key_str,
   }
@@ -1395,7 +1722,23 @@
   {
     \int_step_inline:nn { \c@rowcount }
       {
-        \__tblr_prop_gput:nxn {cell} { [##1][#1] / #2 } {#3}
+        \__tblr_data_gput:neenn { cell } {##1} {#1} {#2} {#3}
+      }
+  }
+
+\cs_new_protected:Npn \__tblr_preto_text_for_every_column_cell:n #1
+  {
+    \int_step_inline:nn { \c@rowcount }
+      {
+        \__tblr_cell_preto_text:nen {##1} { \int_use:N \c@colnum } {#1}
+      }
+  }
+
+\cs_new_protected:Npn \__tblr_appto_text_for_every_column_cell:n #1
+  {
+    \int_step_inline:nn { \c@rowcount }
+      {
+        \__tblr_cell_appto_text:nen {##1} { \int_use:N \c@colnum } {#1}
       }
   }
 
@@ -1405,8 +1748,8 @@
   {
     \regex_match:NnTF \c__tblr_is_number_key_regex {#1}
       {
-        \__tblr_prop_gput:nxx { column }
-          { [\int_use:N \c@colnum] / coefficient } {#1}
+        \__tblr_data_gput:nene { column }
+          { \int_use:N \c@colnum } { coefficient } {#1}
       }
       {
         \regex_match:NnTF \c__tblr_is_color_key_regex {#1}
@@ -1416,8 +1759,8 @@
           }
           {
             \tl_set_rescan:Nnn \l__tblr_v_tl {} {#1}
-            \__tblr_prop_gput:nxx { column }
-              { [\int_use:N \c@colnum] / width } { \dim_eval:n { \l__tblr_v_tl } }
+            \__tblr_data_gput:nene { column }
+              { \int_use:N \c@colnum } { width } { \dim_eval:n { \l__tblr_v_tl } }
           }
       }
   }
@@ -1507,6 +1850,8 @@
                   { \int_use:N \c@rownum } { valign } {f},
     bg .code:n = \__tblr_set_key_for_every_row_cell:nnn
                   { \int_use:N \c@rownum } { background } {#1},
+    fg .code:n = \__tblr_preto_text_for_every_row_cell:n { \color{#1} },
+    font .code:n = \__tblr_preto_text_for_every_row_cell:n { #1 \selectfont },
     ht .code:n = \__tblr_data_gput:nene { row } { \int_use:N \c@rownum }
                    { height } { \dim_eval:n {#1} },
     co .code:n = \__tblr_data_gput:nene { row } { \int_use:N \c@rownum }
@@ -1531,7 +1876,23 @@
   {
     \int_step_inline:nn { \c@colcount }
       {
-        \__tblr_prop_gput:nxn {cell} { [#1][##1] / #2 } {#3}
+        \__tblr_data_gput:neenn { cell } {#1} {##1} {#2} {#3}
+      }
+  }
+
+\cs_new_protected:Npn \__tblr_preto_text_for_every_row_cell:n #1
+  {
+    \int_step_inline:nn { \c@colcount }
+      {
+        \__tblr_cell_preto_text:enn { \int_use:N \c@rownum } {##1} {#1}
+      }
+  }
+
+\cs_new_protected:Npn \__tblr_appto_text_for_every_row_cell:n #1
+  {
+    \int_step_inline:nn { \c@colcount }
+      {
+        \__tblr_cell_appto_text:enn { \int_use:N \c@rownum } {##1} {#1}
       }
   }
 
@@ -1614,26 +1975,16 @@
 
 \exp_args:Nc \NewDocumentCommand { tblr_primitive_column_type_ > } { O{} m }
   {
-    \tl_if_blank:nF { #1 }
+    \tl_if_blank:nF {#1}
       {
-        \__tblr_prop_gput:nxx
+        \__tblr_data_gput:nene
           { column }
-          { [\int_use:N \c@colnum] / leftsep}
-          { \dim_eval:n { #1 } }
+          { \int_use:N \c@colnum } { leftsep }
+          { \dim_eval:n {#1} }
       }
-    \tl_if_blank:nF { #2 }
+    \tl_if_blank:nF {#2}
       {
-        \int_step_variable:nNn { \c@rowcount } \l__tblr_i_tl
-          {
-            \tl_set:Nx \l_tmpa_tl
-            {
-              \__tblr_prop_item:ne {text}
-                { [\l__tblr_i_tl][\int_use:N \c@colnum] }
-            }
-            \tl_put_left:Nn \l_tmpa_tl { #2 }
-            \__tblr_prop_gput:nxV {text}
-              { [\l__tblr_i_tl][\int_use:N \c@colnum] } \l_tmpa_tl
-          }
+        \__tblr_preto_text_for_every_column_cell:n {#2}
       }
     \__tblr_execute_colrow_spec_next:N
   }
@@ -1645,24 +1996,14 @@
 
 \exp_args:Nc \NewDocumentCommand { tblr_primitive_row_type_ > } { O{} m }
   {
-    \tl_if_blank:nF { #1 }
+    \tl_if_blank:nF {#1}
       {
         \__tblr_data_gput:nene { row } { \int_use:N \c@rownum }
           { abovesep } { \dim_eval:n { #1 } }
       }
-    \tl_if_blank:nF { #2 }
+    \tl_if_blank:nF {#2}
       {
-        \int_step_variable:nNn { \c@colcount } \l__tblr_j_tl
-          {
-            \tl_set:Nx \l_tmpa_tl
-            {
-              \__tblr_prop_item:ne {text}
-                { [\int_use:N \c@rownum][\l__tblr_j_tl] }
-            }
-            \tl_put_left:Nn \l_tmpa_tl { #2 }
-            \__tblr_prop_gput:nxV {text}
-              { [\int_use:N \c@rownum][\l__tblr_j_tl] } \l_tmpa_tl
-          }
+        \__tblr_preto_text_for_every_row_cell:n {#2}
       }
     \__tblr_execute_colrow_spec_next:N
   }
@@ -1674,26 +2015,17 @@
 
 \exp_args:Nc \NewDocumentCommand { tblr_primitive_column_type_ < } { O{} m }
   {
-    \tl_if_blank:nF { #1 }
+    \tl_if_blank:nF {#1}
       {
-        \__tblr_prop_gput:nxx
-          { column }
-          { [\int_eval:n {\c@colnum - 1}] / rightsep }
-          { \dim_eval:n { #1 } }
+        \__tblr_data_gput:nene { column }
+          { \int_eval:n {\c@colnum - 1} } { rightsep } { \dim_eval:n {#1} }
       }
-    \tl_if_blank:nF { #2 }
+    \tl_if_blank:nF {#2}
       {
-        \int_step_variable:nNn { \c@rowcount } \l__tblr_i_tl
-          {
-            \tl_set:Nx \l_tmpa_tl
-            {
-              \__tblr_prop_item:ne {text}
-                { [\l__tblr_i_tl][\int_eval:n {\c@colnum - 1}] }
-            }
-            \tl_put_right:Nn \l_tmpa_tl { #2 }
-            \__tblr_prop_gput:nxV {text}
-              { [\l__tblr_i_tl][\int_eval:n {\c@colnum - 1}] } \l_tmpa_tl
-          }
+        \group_begin:
+        \int_decr:N \c@colnum
+        \__tblr_appto_text_for_every_column_cell:n {#2}
+        \group_end:
       }
     \__tblr_execute_colrow_spec_next:N
   }
@@ -1705,24 +2037,17 @@
 
 \exp_args:Nc \NewDocumentCommand { tblr_primitive_row_type_ < } { O{} m }
   {
-    \tl_if_blank:nF { #1 }
+    \tl_if_blank:nF {#1}
       {
         \__tblr_data_gput:nene { row } { \int_eval:n {\c@rownum - 1} }
           { belowsep } { \dim_eval:n {#1} }
       }
-    \tl_if_blank:nF { #2 }
+    \tl_if_blank:nF {#2}
       {
-        \int_step_variable:nNn { \c@colcount } \l__tblr_j_tl
-          {
-            \tl_set:Nx \l_tmpa_tl
-            {
-              \__tblr_prop_item:ne {text}
-                { [\int_eval:n {\c@rownum - 1}][\l__tblr_j_tl] }
-            }
-            \tl_put_right:Nn \l_tmpa_tl { #2 }
-            \__tblr_prop_gput:nxV {text}
-              { [\int_eval:n {\c@rownum - 1}][\l__tblr_j_tl] } \l_tmpa_tl
-          }
+        \group_begin:
+        \int_decr:N \c@rownum
+        \__tblr_appto_text_for_every_row_cell:n {#2}
+        \group_end:
       }
     \__tblr_execute_colrow_spec_next:N
   }
@@ -1902,6 +2227,7 @@
     \mode_leave_vertical:
     \int_gincr:N \g_tblr_level_int
     \__tblr_clear_prop_lists:
+    \__tblr_clear_text_lists:
     \__tblr_enable_table_commands:
     \__tblr_split_table:n { #3 }
     \LogTblrTracing { command }
@@ -1916,18 +2242,6 @@
     \int_gdecr:N \g_tblr_level_int
   }
 
-\cs_new_protected:Npn \__tblr_clear_prop_lists:
-  {
-    \prop_gclear_new:c { g_tblr_text_ \int_use:N \g_tblr_level_int _prop }
-    \prop_gclear_new:c { g_tblr_command_ \int_use:N \g_tblr_level_int _prop }
-    \prop_gclear_new:c { g_tblr_table_ \int_use:N \g_tblr_level_int _prop }
-    \prop_gclear_new:c { g_tblr_row_ \int_use:N \g_tblr_level_int _prop }
-    \prop_gclear_new:c { g_tblr_column_ \int_use:N \g_tblr_level_int _prop }
-    \prop_gclear_new:c { g_tblr_cell_ \int_use:N \g_tblr_level_int _prop }
-    \prop_gclear_new:c { g_tblr_hline_ \int_use:N \g_tblr_level_int _prop }
-    \prop_gclear_new:c { g_tblr_vline_ \int_use:N \g_tblr_level_int _prop }
-  }
-
 %% Insert and remove braces for nesting environments inside cells
 %% These make line split and cell split workable
 %% We need to replace N times for N level nestings
@@ -2034,7 +2348,7 @@
         \__tblr_remove_braces:N \l_tmpa_tl
         \int_incr:N \c@colnum
         \__tblr_extract_table_commands:N \l_tmpa_tl
-        \__tblr_prop_gput:nxV {text} { [#1][\int_use:N \c@colnum] } \l_tmpa_tl
+        \__tblr_text_gput:neV { text } { [#1][\int_use:N \c@colnum] } \l_tmpa_tl
         \__tblr_add_multicolumn_empty_cell:
       }
     %% Decrease row count by 1 if the last row has only one empty cell text
@@ -2059,7 +2373,7 @@
     \int_step_inline:nn { \l__multicolumn_cell_number_int - 1 }
       {
         \int_incr:N \c@colnum
-        \__tblr_prop_gput:nxn {text}
+        \__tblr_text_gput:nen { text }
           { [\int_use:N \c@rownum][\int_use:N \c@colnum] } { }
       }
   }
@@ -2175,6 +2489,7 @@
 \prop_gset_from_keyval:Nn \g__tblr_default_tblr_table_prop
   {
     stretch = 1,
+    rulesep = 2pt,
   }
 
 \prop_gset_from_keyval:Nn \g__tblr_default_tblr_rows_prop
@@ -2192,6 +2507,8 @@
   {
     leftsep = 6pt,
     rightsep = 6pt,
+    width = -1pt, % column width unset
+    coefficient = 0, % column coefficient unset
     @col-width = 0pt,
   }
 
@@ -2199,16 +2516,20 @@
   {
     halign = l,
     valign = t,
+    width = -1pt, % cell width unset
+    rowspan = 1,
+    colspan = 1,
+    omit = 0,
   }
 
 \prop_gset_from_keyval:Nn \g__tblr_default_tblr_hlines_prop
   {
-    rulesep = 2pt,
+    @hline-count = 0,
   }
 
 \prop_gset_from_keyval:Nn \g__tblr_default_tblr_vlines_prop
   {
-    rulesep = 2pt,
+    @vline-count = 0,
   }
 
 \cs_new_protected:Npn \__tblr_initial_table_spec:
@@ -2225,37 +2546,37 @@
           }
         \prop_map_inline:cn { g__tblr_default_ \l__tblr_env_name_tl _hlines_prop }
           {
-            \__tblr_prop_gput:nxn { hline } { [\l__tblr_i_tl] / ##1 } {##2}
+            \__tblr_text_gput:nen { hline } { [\l__tblr_i_tl] / ##1 } {##2}
           }
         \int_step_variable:nNn { \c@colcount } \l__tblr_j_tl
           {
             \prop_map_inline:cn
               { g__tblr_default_ \l__tblr_env_name_tl _cells_prop }
               {
-                \__tblr_prop_gput:nxn { cell }
-                  { [\l__tblr_i_tl][\l__tblr_j_tl] / ##1 } {##2}
+                \__tblr_data_gput:neeen { cell }
+                  { \l__tblr_i_tl } { \l__tblr_j_tl } {##1} {##2}
               }
           }
       }
     \prop_map_inline:cn { g__tblr_default_ \l__tblr_env_name_tl _hlines_prop }
       {
-        \__tblr_prop_gput:nxn { hline }
+        \__tblr_text_gput:nen { hline }
           { [\int_eval:n { \c@rowcount + 1}] / ##1 } {##2}
       }
     \int_step_variable:nNn { \c@colcount } \l__tblr_j_tl
       {
         \prop_map_inline:cn { g__tblr_default_ \l__tblr_env_name_tl _columns_prop }
           {
-            \__tblr_prop_gput:nxn { column } { [\l__tblr_j_tl] / ##1 } {##2}
+            \__tblr_data_gput:nenn { column } { \l__tblr_j_tl } {##1} {##2}
           }
         \prop_map_inline:cn { g__tblr_default_ \l__tblr_env_name_tl _vlines_prop }
           {
-            \__tblr_prop_gput:nxn { vline } { [\l__tblr_j_tl] / ##1 } {##2}
+            \__tblr_text_gput:nen { vline } { [\l__tblr_j_tl] / ##1 } {##2}
           }
       }
     \prop_map_inline:cn { g__tblr_default_ \l__tblr_env_name_tl _vlines_prop }
       {
-        \__tblr_prop_gput:nxn { vline }
+        \__tblr_text_gput:nen { vline }
           { [\int_eval:n { \c@colcount + 1}] / ##1 } {##2}
       }
     \keys_set:nv { tblr } { l__tblr_default_ \l__tblr_env_name_tl _tl }
@@ -2279,7 +2600,7 @@
   {
     long, colspec, rowspec, width, hspan, stretch,
     column, row, cell, vline, hline, columns, rows, cells, vlines, hlines,
-    leftsep, rightsep, colsep, abovesep, belowsep, rowsep,
+    leftsep, rightsep, colsep, abovesep, belowsep, rowsep, rulesep,
   }
 
 \bool_new:N \l__tblr_long_table_bool
@@ -2303,6 +2624,7 @@
     abovesep .code:n = \tblr_set_every_row:nn { } { abovesep = #1 },
     belowsep .code:n = \tblr_set_every_row:nn { } { belowsep = #1 },
     rowsep .meta:n = { abovesep = #1, belowsep = #1 },
+    rulesep .code:n = \__tblr_keys_gput:nn { rulesep } {#1},
     unknown .code:n = \__tblr_table_special_key:Vn \l_keys_key_str {#1},
   }
 
@@ -2403,11 +2725,11 @@
   {
     \dim_zero:N \l__tblr_w_dim
     \tl_set:Nx \l__tblr_n_tl
-      { \__tblr_prop_item:ne { vline } { [#2] / @vline-count } }
-    \tl_if_empty:NF \l__tblr_n_tl
+      { \__tblr_text_item:ne { vline } { [#2] / @vline-count } }
+    \int_compare:nNnT { \l__tblr_n_tl } > {0}
       {
         \tl_set:Nx \l__tblr_s_tl
-          { \__tblr_prop_item:ne { vline } { [#2] / rulesep } }
+          { \__tblr_prop_item:ne { table } { rulesep } }
         \int_step_inline:nn { \l__tblr_n_tl }
           {
             \vbox_set_to_ht:Nnn \l__tblr_b_box {1pt}
@@ -2416,14 +2738,14 @@
                   {#1} {#2} {##1} {1pt} {1pt}
               }
             \tl_set:Nx \l__tblr_w_tl { \dim_eval:n { \box_wd:N \l__tblr_b_box } }
-            \__tblr_prop_gput_if_larger:nxx { vline }
+            \__tblr_text_gput_if_larger:nee { vline }
               { [#2](##1) / @vline-width } { \l__tblr_w_tl }
             \dim_add:Nn \l__tblr_w_dim { \l__tblr_w_tl }
             \dim_add:Nn \l__tblr_w_dim { \l__tblr_s_tl }
           }
         \dim_add:Nn \l__tblr_w_dim { - \l__tblr_s_tl }
       }
-    \__tblr_prop_gput_if_larger:nxx { vline }
+    \__tblr_text_gput_if_larger:nee { vline }
       { [#2]/ @vline-width } { \dim_use:N \l__tblr_w_dim }
   }
 
@@ -2434,10 +2756,10 @@
   {
     \group_begin:
     \tl_set:Nx \l__tblr_w_tl
-      { \__tblr_prop_item:ne { vline } { [#1][#2](#3) / wd } }
+      { \__tblr_text_item:ne { vline } { [#1][#2](#3) / wd } }
     \tl_if_empty:NF \l__tblr_w_tl { \dim_set:Nn \rulewidth { \l__tblr_w_tl } }
     \tl_set:Nx \l__tblr_d_tl
-      { \__tblr_prop_item:ne { vline } { [#1][#2](#3) / @dash } }
+      { \__tblr_text_item:ne { vline } { [#1][#2](#3) / @dash } }
     \tl_set:Nx \l__tblr_a_tl { \tl_head:N \l__tblr_d_tl }
     \tl_set:Nx \l__tblr_b_tl { \tl_tail:N \l__tblr_d_tl }
     \exp_args:NV \tl_if_eq:NNTF \l__tblr_a_tl \@tblr@dash
@@ -2461,11 +2783,11 @@
   {
     \dim_zero:N \l__tblr_h_dim
     \tl_set:Nx \l__tblr_n_tl
-      { \__tblr_prop_item:ne { hline } { [#1] / @hline-count } }
-    \tl_if_empty:NF \l__tblr_n_tl
+      { \__tblr_text_item:ne { hline } { [#1] / @hline-count } }
+    \int_compare:nNnT { \l__tblr_n_tl } > {0}
       {
         \tl_set:Nx \l__tblr_s_tl
-          { \__tblr_prop_item:ne { hline } { [#1] / rulesep } }
+          { \__tblr_prop_item:ne { table } { rulesep } }
         \int_step_inline:nn { \l__tblr_n_tl }
           {
             \hbox_set_to_wd:Nnn \l__tblr_b_box {1pt}
@@ -2475,14 +2797,14 @@
                 \dim_eval:n
                   { \box_ht:N \l__tblr_b_box + \box_dp:N \l__tblr_b_box }
               }
-            \__tblr_prop_gput_if_larger:nxx { hline }
+            \__tblr_text_gput_if_larger:nee { hline }
               { [#1](##1) / @hline-height } { \l__tblr_h_tl }
             \dim_add:Nn \l__tblr_h_dim { \l__tblr_h_tl }
             \dim_add:Nn \l__tblr_h_dim { \l__tblr_s_tl }
           }
         \dim_add:Nn \l__tblr_h_dim { - \l__tblr_s_tl }
       }
-    \__tblr_prop_gput_if_larger:nxx { hline }
+    \__tblr_text_gput_if_larger:nee { hline }
       { [#1] / @hline-height } { \dim_use:N \l__tblr_h_dim }
   }
 
@@ -2492,10 +2814,10 @@
   {
     \group_begin:
     \tl_set:Nx \l__tblr_w_tl
-      { \__tblr_prop_item:ne { hline } { [#1][#2](#3) / wd } }
+      { \__tblr_text_item:ne { hline } { [#1][#2](#3) / wd } }
     \tl_if_empty:NF \l__tblr_w_tl { \dim_set:Nn \rulewidth { \l__tblr_w_tl } }
     \tl_set:Nx \l__tblr_d_tl
-      { \__tblr_prop_item:ne { hline } { [#1][#2](#3) / @dash } }
+      { \__tblr_text_item:ne { hline } { [#1][#2](#3) / @dash } }
     \tl_set:Nx \l__tblr_a_tl { \tl_head:N \l__tblr_d_tl }
     \tl_set:Nx \l__tblr_b_tl { \tl_tail:N \l__tblr_d_tl }
     \exp_args:NV \tl_if_eq:NNTF \l__tblr_a_tl \@tblr@dash
@@ -2527,9 +2849,9 @@
   {
     \group_begin:
     \tl_gset:Nx \g__tblr_cell_halign_tl
-      { \__tblr_prop_item:ne { cell } { [#1][#2] / halign } }
+      { \__tblr_data_item:neen { cell } {#1} {#2} { halign } }
     \tl_set:Nx \l__tblr_v_tl
-      { \__tblr_prop_item:ne { cell } { [#1][#2] / valign } }
+      { \__tblr_data_item:neen { cell } {#1} {#2} { valign } }
     \tl_case:NnF \l__tblr_v_tl
       {
         \c__tblr_valign_t_tl
@@ -2607,7 +2929,7 @@
 %% #1: row number, #2: column number
 \cs_new_protected:Npn \__tblr_get_cell_text:nn #1 #2
   {
-    \__tblr_prop_if_in:nxTF {cell} { [#1][#2] / omit }
+    \int_compare:nNnTF { \__tblr_data_item:neen { cell } {#1} {#2} { omit } } > {0}
       {
         \dim_gzero:N \g__tblr_cell_wd_dim
         \dim_gzero:N \g__tblr_cell_ht_dim
@@ -2623,18 +2945,19 @@
 \cs_new_protected:Npn \__tblr_get_cell_text_real:nn #1 #2
   {
     \group_begin:
-    \tl_set:Nx \l__tblr_c_tl { \__tblr_prop_item:ne {text} {[#1][#2]} }
+    \tl_set:Nx \l__tblr_c_tl { \__tblr_text_item:ne { text } {[#1][#2]} }
     \tl_set:Nx \l__tblr_w_tl
-      { \__tblr_prop_item:ne { cell } { [#1][#2] / width } }
-    \tl_if_empty:NT \l__tblr_w_tl
+      { \__tblr_data_item:neen { cell } {#1} {#2} { width } }
+    \dim_compare:nNnT { \l__tblr_w_tl } < { 0pt } % cell width unset
       {
-        \__tblr_prop_if_in:nxF { cell } { [#1][#2] / colspan }
+        \int_compare:nNnT
+          { \__tblr_data_item:neen { cell } {#1} {#2} { colspan } } < {2}
           {
             \tl_set:Nx \l__tblr_w_tl
-              { \__tblr_prop_item:ne { column } { [#2] / width } }
+              { \__tblr_data_item:nen { column } {#2} { width } }
           }
       }
-    \tl_if_empty:NT \l__tblr_w_tl
+    \dim_compare:nNnT { \l__tblr_w_tl } < { 0pt } % column width unset
       {
         \bool_if:NTF \l__tblr_math_mode_bool
           {
@@ -2757,15 +3080,15 @@
   {
     \group_begin:
     \tl_set:Nx \l__tblr_c_tl
-      { \__tblr_prop_item:ne {cell} { [#1][#2] / colspan } }
-    \tl_if_empty:NF \l__tblr_c_tl
+      { \__tblr_data_item:neen { cell } {#1} {#2} { colspan } }
+    \int_compare:nNnT { \l__tblr_c_tl } > {1}
       {
-        \__tblr_prop_gput:nxx {cell} { [#1][#2] / @cell-width } { \dim_use:N #3 }
+        \__tblr_data_gput:neene { cell } {#1} {#2} { @cell-width } {\dim_use:N #3}
         \dim_gzero:N #3 % don't affect column width
       }
     \tl_set:Nx \l__tblr_r_tl
-      { \__tblr_prop_item:ne {cell} { [#1][#2] / rowspan } }
-    \tl_if_empty:NF \l__tblr_r_tl
+      { \__tblr_data_item:neen { cell } {#1} {#2} { rowspan } }
+    \int_compare:nNnT { \l__tblr_r_tl } > {1}
       {
         \tl_case:Nn \g__tblr_cell_valign_tl
           {
@@ -2794,8 +3117,8 @@
                   #4 #5 #6 \l__tblr_u_tl \l__tblr_v_tl
               }
           }
-        \__tblr_prop_gput:nxV {cell} { [#1][#2] / @cell-height } \l__tblr_u_tl
-        \__tblr_prop_gput:nxV {cell} { [#1][#2] / @cell-depth } \l__tblr_v_tl
+        \__tblr_data_gput:neenV { cell } {#1} {#2} { @cell-height } \l__tblr_u_tl
+        \__tblr_data_gput:neenV { cell } {#1} {#2} { @cell-depth } \l__tblr_v_tl
         %% Don't affect row sizes
         \dim_gzero:N #4
         \dim_gzero:N #5
@@ -2876,12 +3199,12 @@
 \cs_new_protected:Npn \__tblr_update_col_size:nN #1 #2
   {
     \tl_set:Nx \l_tmpb_tl
-      { \__tblr_prop_item:ne {column} { [#1] / @col-width } }
+      { \__tblr_data_item:nen { column } {#1} { @col-width } }
     \bool_lazy_or:nnT
       { \tl_if_empty_p:N \l_tmpb_tl }
       { \dim_compare_p:nNn { \dim_use:N #2 } > { \l_tmpb_tl } }
       {
-        \__tblr_prop_gput:nxx {column} { [#1] / @col-width } { \dim_use:N #2 }
+        \__tblr_data_gput:nene { column } {#1} { @col-width } { \dim_use:N #2 }
       }
   }
 
@@ -2925,14 +3248,14 @@
     \int_step_variable:nNn { \c@colcount } \l__tblr_j_tl
       {
         \tl_set:Nx \l__tblr_a_tl
-          { \__tblr_prop_item:ne {column} { [\l__tblr_j_tl] / width } }
+          { \__tblr_data_item:nen { column } { \l__tblr_j_tl } { width } }
         \tl_set:Nx \l__tblr_b_tl
-          { \__tblr_prop_item:ne {column} { [\l__tblr_j_tl] / coefficient } }
+          { \__tblr_data_item:nen { column } { \l__tblr_j_tl } { coefficient } }
         \tl_set:Nx \l__tblr_c_tl
-          { \__tblr_prop_item:ne {column} { [\l__tblr_j_tl] / @col-width } }
-        \tl_if_empty:NTF \l__tblr_a_tl
+          { \__tblr_data_item:nen  { column } { \l__tblr_j_tl } { @col-width } }
+        \dim_compare:nNnTF { \l__tblr_a_tl } < { 0pt } % column width unset
           {
-            \tl_if_empty:NTF \l__tblr_b_tl
+            \dim_compare:nNnTF { \l__tblr_b_tl pt } = { 0pt }
               { \dim_sub:Nn \l__column_target_dim { \l__tblr_c_tl } }
               {
                 \prop_put:Nxx \l__column_coefficient_prop
@@ -2948,17 +3271,17 @@
           }
           { \dim_sub:Nn \l__column_target_dim { \l__tblr_a_tl } }
         \tl_set:Nx \l__tblr_a_tl
-          { \__tblr_prop_item:ne {vline} { [\l__tblr_j_tl] / @vline-width } }
+          { \__tblr_text_item:ne { vline } { [\l__tblr_j_tl] / @vline-width } }
         \tl_set:Nx \l__tblr_b_tl
-          { \__tblr_prop_item:ne {column} { [\l__tblr_j_tl] / leftsep} }
+          { \__tblr_data_item:nen { column } { \l__tblr_j_tl } { leftsep } }
         \tl_set:Nx \l__tblr_c_tl
-          { \__tblr_prop_item:ne {column} { [\l__tblr_j_tl] / rightsep } }
+          { \__tblr_data_item:nen { column } { \l__tblr_j_tl } { rightsep } }
         \dim_set:Nn \l__column_target_dim
           { \l__column_target_dim - \l__tblr_a_tl - \l__tblr_b_tl - \l__tblr_c_tl }
       }
     \tl_set:Nx \l__tblr_a_tl
       {
-        \__tblr_prop_item:ne {vline}
+        \__tblr_text_item:ne { vline }
           { [\int_eval:n {\c@colcount + 1}] / @vline-width }
       }
     \tl_if_empty:NF \l__tblr_a_tl
@@ -2979,8 +3302,8 @@
       }
     \prop_map_inline:Nn \l__column_computed_width_prop
       {
-        \__tblr_prop_gput:nnx {column} { [##1] / width } { ##2 }
-        \__tblr_prop_gput:nnn {column} { [##1] / @col-width } { 0pt }
+        \__tblr_data_gput:nnne { column } {##1} { width } {##2}
+        \__tblr_data_gput:nnnn { column } {##1} { @col-width } { 0pt }
       }
     \__tblr_calculate_cell_sizes:
   }
@@ -3067,7 +3390,7 @@
             \__tblr_collect_span_widths:
             \__tblr_set_column_widths_from_span_widths:
           }
-        \LogTblrTracing {column}
+        \LogTblrTracing { column }
         \__tblr_calculate_cell_sizes:
       }
     \__tblr_prop_if_in:nnT {table} {rowspan}
@@ -3095,14 +3418,13 @@
               {
                 \dim_eval:n
                   {
-                    \__tblr_prop_item:ne {column}
-                      { [\int_eval:n { \l__tblr_j_tl - 1 }] / rightsep }
+                    \__tblr_data_item:nen { column }
+                      { \int_eval:n { \l__tblr_j_tl - 1 } } { rightsep }
                     +
-                    \__tblr_prop_item:ne {vline}
+                    \__tblr_text_item:ne { vline }
                       { [\l__tblr_j_tl] / @vline-width }
                     +
-                    \__tblr_prop_item:ne {column}
-                      { [\l__tblr_j_tl] / leftsep}
+                    \__tblr_data_item:nen { column } { \l__tblr_j_tl } { leftsep }
                   }
               }
           }
@@ -3111,7 +3433,7 @@
               { 0pt }
           }
         \prop_put:Nxx \l__tblr_col_item_skip_size_prop { item[\l__tblr_j_tl] }
-          { \__tblr_prop_item:ne {column} { [\l__tblr_j_tl] / @col-width } }
+          { \__tblr_data_item:nen { column } { \l__tblr_j_tl } { @col-width } }
       }
     \__tblr_do_if_tracing:nn { cellspan }
       { \prop_log:N \l__tblr_col_item_skip_size_prop }
@@ -3131,7 +3453,7 @@
                     \__tblr_data_item:nen { row }
                       { \int_eval:n {\l__tblr_i_tl - 1} } { belowsep }
                     +
-                    \__tblr_prop_item:ne {hline}
+                    \__tblr_text_item:ne { hline }
                       { [\l__tblr_i_tl] / @hline-height }
                     +
                     \__tblr_data_item:nen { row } { \l__tblr_i_tl } { abovesep }
@@ -3165,10 +3487,10 @@
           {
             \tl_set:Nx \l__tblr_a_tl
               {
-                \__tblr_prop_item:ne {cell}
-                  { [\l__tblr_i_tl][\l__tblr_j_tl] / colspan }
+                \__tblr_data_item:neen { cell }
+                  { \l__tblr_i_tl } { \l__tblr_j_tl } { colspan }
               }
-            \tl_if_empty:NF \l__tblr_a_tl
+            \int_compare:nNnT { \l__tblr_a_tl } > {1}
               {
                 \__tblr_put_if_larger:Nxx \l__tblr_col_span_size_prop
                   {
@@ -3176,8 +3498,8 @@
                       \int_eval:n {\l__tblr_j_tl + \l__tblr_a_tl - 1} )
                   }
                   {
-                    \__tblr_prop_item:ne {cell}
-                      { [\l__tblr_i_tl][\l__tblr_j_tl] / @cell-width }
+                    \__tblr_data_item:neen { cell }
+                      { \l__tblr_i_tl } { \l__tblr_j_tl } { @cell-width }
                   }
               }
           }
@@ -3198,15 +3520,15 @@
           {
             \tl_set:Nx \l__tblr_a_tl
               {
-                \__tblr_prop_item:ne {cell}
-                  { [\l__tblr_i_tl][\l__tblr_j_tl] / rowspan }
+                \__tblr_data_item:neen { cell }
+                  { \l__tblr_i_tl } { \l__tblr_j_tl } { rowspan }
               }
-            \tl_if_empty:NF \l__tblr_a_tl
+            \int_compare:nNnT { \l__tblr_a_tl } > {1}
               {
                 \tl_set:Nx \l__tblr_v_tl
                   {
-                    \__tblr_prop_item:ne {cell}
-                      { [\l__tblr_i_tl][\l__tblr_j_tl] / valign }
+                    \__tblr_data_item:neen { cell }
+                      { \l__tblr_i_tl } { \l__tblr_j_tl } { valign }
                   }
                 \tl_if_eq:NnT \l__tblr_v_tl { h }
                   {
@@ -3215,8 +3537,8 @@
                         \__tblr_data_item:nen { row }
                           { \l__tblr_i_tl } { @row-head }
                       }
-                    \__tblr_prop_gput:nxV {cell}
-                      { [\l__tblr_i_tl][\l__tblr_j_tl] / @cell-height }
+                    \__tblr_data_gput:neenV { cell }
+                      { \l__tblr_i_tl } { \l__tblr_j_tl } { @cell-height }
                       \l__tblr_h_tl
                   }
                 \tl_if_eq:NnT \l__tblr_v_tl { f }
@@ -3228,8 +3550,8 @@
                           { \int_eval:n { \l__tblr_i_tl + \l__tblr_a_tl - 1 } }
                           { @row-foot }
                       }
-                    \__tblr_prop_gput:nxV {cell}
-                      { [\l__tblr_i_tl][\l__tblr_j_tl] / @cell-depth }
+                    \__tblr_data_gput:neenV { cell }
+                      { \l__tblr_i_tl } { \l__tblr_j_tl } { @cell-depth }
                       \l__tblr_d_tl
                   }
                 \__tblr_put_if_larger:Nxx \l__tblr_row_span_size_prop
@@ -3240,11 +3562,11 @@
                   {
                     \dim_eval:n
                       {
-                        \__tblr_prop_item:ne {cell}
-                          { [\l__tblr_i_tl][\l__tblr_j_tl] / @cell-height }
+                        \__tblr_data_item:neen { cell }
+                          { \l__tblr_i_tl } { \l__tblr_j_tl } { @cell-height }
                         +
-                        \__tblr_prop_item:ne {cell}
-                          { [\l__tblr_i_tl][\l__tblr_j_tl] / @cell-depth }
+                        \__tblr_data_item:neen { cell }
+                          { \l__tblr_i_tl } { \l__tblr_j_tl } { @cell-depth }
                       }
                   }
                 \prop_put:Nxx \l__tblr_row_span_to_row_prop
@@ -3340,8 +3662,8 @@
   {
     \int_step_variable:nNn { \c@colcount } \l__tblr_j_tl
       {
-        \__tblr_prop_gput:nxx {column}
-          { [\l__tblr_j_tl] / @col-width }
+        \__tblr_data_gput:nene { column }
+          { \l__tblr_j_tl } { @col-width }
           { \prop_item:Ne \l__tblr_col_item_skip_size_prop { item[\l__tblr_j_tl] } }
       }
   }
@@ -3383,17 +3705,17 @@
           {
             \tl_set:Nx \l__tblr_a_tl
               {
-                \__tblr_prop_item:ne {cell}
-                  { [\l__tblr_i_tl][\l__tblr_j_tl] / colspan }
+                \__tblr_data_item:neen { cell }
+                  { \l__tblr_i_tl } { \l__tblr_j_tl } { colspan }
               }
-            \tl_if_empty:NF \l__tblr_a_tl
+            \int_compare:nNnT { \l__tblr_a_tl } > {1}
               {
                 \__tblr_calc_span_widths:xxN
                   { \l__tblr_j_tl }
                   { \int_eval:n { \l__tblr_j_tl + \l__tblr_a_tl - 1 } }
                   \l__tblr_w_dim
-                \__tblr_prop_gput:nxx {cell}
-                  { [\l__tblr_i_tl][\l__tblr_j_tl] / width }
+                \__tblr_data_gput:neene { cell }
+                  { \l__tblr_i_tl } { \l__tblr_j_tl } { width }
                   { \dim_use:N \l__tblr_w_dim }
               }
           }
@@ -3448,7 +3770,7 @@
       {
         \dim_set:Nn \l_tmpa_dim
           {
-            \__tblr_prop_item:ne { hline } { [\l__tblr_i_tl] / @hline-height }
+            \__tblr_text_item:ne { hline } { [\l__tblr_i_tl] / @hline-height }
             +
             \__tblr_data_item:nen { row } { \l__tblr_i_tl } { abovesep }
             +
@@ -3546,7 +3868,7 @@
 \cs_new_protected:Npn \__tblr_valign_whole_top:N #1
   {
     \tl_set:Nx \l__tblr_a_tl
-      { \__tblr_prop_item:ne { hline } { [1] / @hline-height } }
+      { \__tblr_text_item:ne { hline } { [1] / @hline-height } }
     %% Note that \l__tblr_b_tl may be empty
     \tl_set:Nx \l__tblr_b_tl
       { \__tblr_prop_item:ne { table } { baseline } }
@@ -3580,7 +3902,7 @@
   {
     \tl_set:Nx \l__tblr_a_tl
       {
-        \__tblr_prop_item:ne { hline }
+        \__tblr_text_item:ne { hline }
           { [\int_eval:n {\c@rowcount + 1}] / @hline-height }
       }
     %% Note that \l__tblr_b_tl may be empty
@@ -3630,14 +3952,14 @@
 \cs_new_protected:Npn \__tblr_build_hline_segment:nn #1 #2
   {
     \tl_set:Nx \l__tblr_n_tl
-      { \__tblr_prop_item:ne { hline } { [#1] / @hline-count } }
+      { \__tblr_text_item:ne { hline } { [#1] / @hline-count } }
     \tl_set:Nx \l__tblr_o_tl
-      { \__tblr_prop_item:ne { hline } { [#1][#2] / omit } }
+      { \__tblr_text_item:ne { hline } { [#1][#2] / omit } }
     \__tblr_get_col_outer_width_border_width:nNN {#2}
       \l__tblr_col_o_wd_dim \l__tblr_col_b_wd_dim
     \tl_if_empty:NTF \l__tblr_o_tl
       {
-        \tl_if_empty:NF \l__tblr_n_tl
+        \int_compare:nNnT { \l__tblr_n_tl } > {0}
           { \__tblr_build_hline_segment_real:nn {#1} {#2} }
       }
       { \__tblr_build_hline_segment_omit:nn {#1} {#2} }
@@ -3653,7 +3975,7 @@
 \cs_new_protected:Npn \__tblr_build_hline_segment_real:nn #1 #2
   {
     \tl_set:Nx \l__tblr_s_tl
-      { \__tblr_prop_item:ne { hline } { [#1] / rulesep } }
+      { \__tblr_prop_item:ne { table } { rulesep } }
     \vbox_set:Nn \l__tblr_c_box
       {
         %% add an empty hbox to support vbox width
@@ -3661,12 +3983,12 @@
         \int_step_inline:nn { \l__tblr_n_tl }
           {
             \tl_set:Nx \l__tblr_h_tl
-              { \__tblr_prop_item:ne { hline } { [#1](##1) / @hline-height } }
+              { \__tblr_text_item:ne { hline } { [#1](##1) / @hline-height } }
             \hrule height ~ 0pt % remove lineskip
             \hbox_set_to_wd:Nnn \l__tblr_b_box { \l__tblr_col_o_wd_dim }
               {
                 \tl_set:Nx \l__tblr_f_tl
-                  { \__tblr_prop_item:ne { hline } { [#1][#2](##1) / fg } }
+                  { \__tblr_text_item:ne { hline } { [#1][#2](##1) / fg } }
                 \tl_if_empty:NF \l__tblr_f_tl { \color{\l__tblr_f_tl} }
                 \__tblr_get_hline_segment_child:nnn {#1} {#2} {##1}
               }
@@ -3687,16 +4009,16 @@
 \cs_new_protected:Npn \__tblr_get_col_outer_width_border_width:nNN #1 #2 #3
   {
     \dim_set:Nn #3
-      { \__tblr_prop_item:ne {vline} { [\int_eval:n {#1 + 1}] / @vline-width } }
+      { \__tblr_text_item:ne { vline } { [\int_eval:n {#1 + 1}] / @vline-width } }
     \dim_set:Nn #2
       {
-        \__tblr_prop_item:ne {vline} { [#1] / @vline-width }
+        \__tblr_text_item:ne { vline } { [#1] / @vline-width }
         +
-        \__tblr_prop_item:ne {column} { [#1] / leftsep }
+        \__tblr_data_item:nen { column } {#1} { leftsep }
         +
-        \__tblr_prop_item:ne {column} { [#1] / @col-width }
+        \__tblr_data_item:nen { column } {#1} { @col-width }
         +
-        \__tblr_prop_item:ne {column} { [#1] / rightsep }
+        \__tblr_data_item:nen { column } {#1} { rightsep }
         +
         #3
       }
@@ -3756,12 +4078,12 @@
 \cs_new_protected:Npn \__tblr_build_vline_segment:nn #1 #2
   {
     \tl_set:Nx \l__tblr_n_tl
-      { \__tblr_prop_item:ne { vline } { [#2] / @vline-count } }
+      { \__tblr_text_item:ne { vline } { [#2] / @vline-count } }
     \tl_set:Nx \l__tblr_o_tl
-      { \__tblr_prop_item:ne { vline } { [#1][#2] / omit } }
+      { \__tblr_text_item:ne { vline } { [#1][#2] / omit } }
     \tl_if_empty:NTF \l__tblr_o_tl
       {
-        \tl_if_empty:NF \l__tblr_n_tl
+        \int_compare:nNnT { \l__tblr_n_tl } > {0}
           { \__tblr_build_vline_segment_real:nn {#1} {#2} }
       }
       { \__tblr_build_vline_segment_omit:nn {#1} {#2} }
@@ -3771,7 +4093,7 @@
 \cs_new_protected:Npn \__tblr_build_vline_segment_omit:nn #1 #2
   {
     \tl_set:Nx \l__tblr_w_tl
-      { \__tblr_prop_item:ne { vline } { [#2] / @vline-width } }
+      { \__tblr_text_item:ne { vline } { [#2] / @vline-width } }
     \skip_horizontal:N \l__tblr_w_tl
   }
 
@@ -3781,10 +4103,10 @@
 \cs_new_protected:Npn \__tblr_build_vline_segment_real:nn #1 #2
   {
     \tl_set:Nx \l__tblr_s_tl
-      { \__tblr_prop_item:ne { vline } { [#2] / rulesep } }
+      { \__tblr_prop_item:ne { table } { rulesep } }
     \tl_set:Nx \l__tblr_b_tl
       {
-        \__tblr_prop_item:ne { hline }
+        \__tblr_text_item:ne { hline }
           { [\int_eval:n{#1 + 1}](1) / @hline-height }
       }
     \tl_if_empty:NT \l__tblr_b_tl { \tl_set:Nn \l__tblr_b_tl { 0pt } }
@@ -3793,12 +4115,12 @@
         \int_step_inline:nn { \l__tblr_n_tl }
           {
             \tl_set:Nx \l__tblr_w_tl
-              { \__tblr_prop_item:ne { vline } { [#2](##1) / @vline-width } }
+              { \__tblr_text_item:ne { vline } { [#2](##1) / @vline-width } }
             \vbox_set_to_ht:Nnn \l__tblr_b_box
               { \dim_eval:n { \l__tblr_row_ht_dim + \l__tblr_row_dp_dim } }
               {
                 \tl_set:Nx \l__tblr_f_tl
-                  { \__tblr_prop_item:ne { vline } { [#1][#2](##1) / fg } }
+                  { \__tblr_text_item:ne { vline } { [#1][#2](##1) / fg } }
                 \tl_if_empty:NF \l__tblr_f_tl { \color{\l__tblr_f_tl} }
                 \__tblr_get_vline_segment_child:nnnxx {#1} {#2} {##1}
                   { \dim_eval:n { \l__tblr_row_ht_dim } }
@@ -3828,24 +4150,24 @@
     \int_set:Nn \c@colnum {#2}
     \group_begin:
     \tl_set:Nx \l__tblr_w_tl
-      { \__tblr_prop_item:ne { column } { [#2] / @col-width } }
+      { \__tblr_data_item:nen { column } {#2} { @col-width } }
     \tl_set:Nx \l__tblr_h_tl
       { \__tblr_data_item:nen { row } {#1} { @row-height } }
     \tl_set:Nx \l__tblr_x_tl
-      { \__tblr_prop_item:ne { column } { [#2] / leftsep} }
+      { \__tblr_data_item:nen { column } {#2} { leftsep} }
     \tl_set:Nx \l__tblr_y_tl
-      { \__tblr_prop_item:ne { column } { [#2] / rightsep } }
+      { \__tblr_data_item:nen { column } {#2} { rightsep } }
     \tl_set:Nx \l__tblr_cell_colspan_tl
-      { \__tblr_prop_item:ne { cell } { [#1][#2] / colspan } }
-    \tl_if_empty:NTF \l__tblr_cell_colspan_tl
+      { \__tblr_data_item:neen { cell } {#1} {#2} { colspan } }
+    \int_compare:nNnTF { \l__tblr_cell_colspan_tl } < {2}
       { \dim_set:Nn \l__tblr_cell_wd_dim { \l__tblr_w_tl } }
       {
         \__tblr_get_span_horizontal_sizes:NNNNN #1 #2
           \l__tblr_o_dim \l__tblr_cell_wd_dim \l__tblr_q_dim
       }
     \tl_set:Nx \l__tblr_cell_rowspan_tl
-      { \__tblr_prop_item:ne { cell } { [#1][#2] / rowspan } }
-    \tl_if_empty:NTF \l__tblr_cell_rowspan_tl
+      { \__tblr_data_item:neen { cell } {#1} {#2} { rowspan } }
+    \int_compare:nNnTF { \l__tblr_cell_rowspan_tl } < {2}
       { \dim_set:Nn \l__tblr_cell_ht_dim { \l__tblr_h_tl } }
       {
         \__tblr_get_span_vertical_sizes:NNNNN #1 #2
@@ -3872,7 +4194,7 @@
             \c__tblr_valign_m_tl
               {
                 \vfil
-                \tl_if_empty:NT \l__tblr_cell_rowspan_tl
+                \int_compare:nNnT { \l__tblr_cell_rowspan_tl } < {2}
                   {
                     \box_set_ht:Nn \l__tblr_a_box
                       { \__tblr_data_item:nen { row } {#1} { @row-upper } }
@@ -3892,7 +4214,7 @@
             \c__tblr_valign_f_tl
               {
                 \vfil
-                \tl_if_empty:NTF \l__tblr_cell_rowspan_tl
+                \int_compare:nNnTF { \l__tblr_cell_rowspan_tl } < {2}
                   {
                     \box_set_dp:Nn \l__tblr_a_box
                       { \__tblr_data_item:nen { row } {#1} { @row-foot } }
@@ -3924,11 +4246,11 @@
 
 \cs_new_protected:Npn \__tblr_build_cell_background:NN #1 #2
   {
-    \__tblr_prop_if_in:nxF {cell} { [#1][#2] / omit }
+    \int_compare:nNnT { \__tblr_data_item:neen { cell } {#1} {#2} { omit } } = {0}
       {
         \group_begin:
         \tl_set:Nx \l__tblr_b_tl
-          { \__tblr_prop_item:ne { cell } { [#1][#2] / background } }
+          { \__tblr_data_item:neen { cell } {#1} {#2} { background } }
         \tl_if_empty:NF \l__tblr_b_tl
           {
             \__tblr_get_cell_background_width:NNN #1 #2 \l_tmpa_dim
@@ -3946,7 +4268,7 @@
 %% #1: row number; #2: column number; #3 resulting dimension
 \cs_new_protected:Npn \__tblr_get_cell_background_width:NNN #1 #2 #3
   {
-    \tl_if_empty:NTF \l__tblr_cell_colspan_tl
+    \int_compare:nNnTF { \l__tblr_cell_colspan_tl } < {2}
       { \dim_set:Nn #3 { \l__tblr_x_tl + \l__tblr_w_tl + \l__tblr_y_tl } }
       {
         \dim_set:Nn #3 { \l__tblr_o_dim + \l__tblr_cell_wd_dim + \l__tblr_q_dim }
@@ -3956,7 +4278,7 @@
 %% #1: row number; #2: column number; #3 resulting dimension
 \cs_new_protected:Npn \__tblr_get_cell_background_depth:NNN #1 #2 #3
   {
-    \tl_if_empty:NTF \l__tblr_cell_rowspan_tl
+    \int_compare:nNnTF { \l__tblr_cell_rowspan_tl } < {2}
       { \dim_set_eq:NN #3 \l__tblr_row_dp_dim }
       {
         \dim_set:Nn #3
@@ -4014,7 +4336,7 @@
 \cs_new_protected:Npn \__tblr_get_span_horizontal_sizes:NNNNN #1 #2 #3 #4 #5
   {
     \dim_set:Nn #3
-      { \__tblr_prop_item:ne { column } { [#2] / leftsep} }
+      { \__tblr_data_item:nen { column } {#2} { leftsep } }
     \dim_zero:N #4
     \int_step_inline:nnn { #2 } { #2 + \l__tblr_cell_colspan_tl - 2 }
       {
@@ -4033,8 +4355,8 @@
       }
     \dim_set:Nn #5
       {
-        \__tblr_prop_item:ne { column }
-          { [\int_eval:n {#2 + \l__tblr_cell_colspan_tl - 1}] / rightsep }
+        \__tblr_data_item:nen { column }
+          { \int_eval:n {#2 + \l__tblr_cell_colspan_tl - 1} } { rightsep }
       }
     %\tl_log:x { cell[#1][#2] ~:~ \dim_use:N #3, \dim_use:N #4, \dim_use:N #5 }
   }
@@ -4061,6 +4383,7 @@
 \bool_new:N \g__tblr_tracing_rowspec_bool
 \bool_new:N \g__tblr_tracing_target_bool
 \bool_new:N \g__tblr_tracing_cellspan_bool
+\bool_new:N \g__tblr_tracing_intarray_bool
 
 \keys_define:nn { tblr-set-tracing }
   {
@@ -4088,6 +4411,8 @@
     -target .code:n = \bool_gset_false:N \g__tblr_tracing_target_bool,
     +cellspan .code:n = \bool_gset_true:N \g__tblr_tracing_cellspan_bool,
     -cellspan .code:n = \bool_gset_false:N \g__tblr_tracing_cellspan_bool,
+    +intarray .code:n = \bool_gset_true:N \g__tblr_tracing_intarray_bool,
+    -intarray .code:n = \bool_gset_false:N \g__tblr_tracing_intarray_bool,
     all .code:n = \__tblr_enable_all_tracings:,
     none .code:n = \__tblr_disable_all_tracings:,
   }
@@ -4106,6 +4431,7 @@
     \bool_gset_true:N \g__tblr_tracing_rowspec_bool
     \bool_gset_true:N \g__tblr_tracing_target_bool
     \bool_gset_true:N \g__tblr_tracing_cellspan_bool
+    \bool_gset_true:N \g__tblr_tracing_intarray_bool
   }
 
 \cs_new_protected_nopar:Npn \__tblr_disable_all_tracings:
@@ -4122,6 +4448,7 @@
     \bool_gset_false:N \g__tblr_tracing_rowspec_bool
     \bool_gset_false:N \g__tblr_tracing_target_bool
     \bool_gset_false:N \g__tblr_tracing_cellspan_bool
+    \bool_gset_false:N \g__tblr_tracing_intarray_bool
   }
 
 \NewDocumentCommand \LogTabularrayTracing { m }
@@ -4143,7 +4470,7 @@
 
 \cs_new_protected:Npn \__tblr_log_tracing_text:
   {
-    \__tblr_prop_log:n { text }
+    \__tblr_text_log:n { text }
   }
 
 \cs_new_protected:Npn \__tblr_log_tracing_command:
@@ -4158,7 +4485,7 @@
 
 \cs_new_protected:Npn \__tblr_log_tracing_column:
   {
-    \__tblr_prop_log:n { column }
+    \__tblr_data_log:n { column }
   }
 
 \cs_new_protected:Npn \__tblr_log_tracing_row:
@@ -4168,17 +4495,17 @@
 
 \cs_new_protected:Npn \__tblr_log_tracing_cell:
   {
-    \__tblr_prop_log:n { cell }
+    \__tblr_data_log:n { cell }
   }
 
 \cs_new_protected:Npn \__tblr_log_tracing_vline:
   {
-    \__tblr_prop_log:n { vline }
+    \__tblr_text_log:n { vline }
   }
 
 \cs_new_protected:Npn \__tblr_log_tracing_hline:
   {
-    \__tblr_prop_log:n { hline }
+    \__tblr_text_log:n { hline }
   }
 
 \cs_new_protected:Npn \__tblr_log_tracing_colspec:
-- 
cgit v1.2.3

