summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/tabularray/tabularray.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/tabularray/tabularray.sty')
-rw-r--r--macros/latex/contrib/tabularray/tabularray.sty247
1 files changed, 188 insertions, 59 deletions
diff --git a/macros/latex/contrib/tabularray/tabularray.sty b/macros/latex/contrib/tabularray/tabularray.sty
index 2e3fa4eb5d..db63c63a3c 100644
--- a/macros/latex/contrib/tabularray/tabularray.sty
+++ b/macros/latex/contrib/tabularray/tabularray.sty
@@ -12,7 +12,7 @@
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
-\ProvidesExplPackage{tabularray}{2021-09-01}{2021N}
+\ProvidesExplPackage{tabularray}{2021-10-01}{2021P}
{Typeset tabulars and arrays with LaTeX3}
\RequirePackage{xparse}
@@ -52,6 +52,7 @@
\cs_generate_variant:Nn \tl_const:Nn { ce }
\cs_generate_variant:Nn \tl_log:n { x }
\cs_generate_variant:Nn \tl_gput_right:Nn { Nf }
+\cs_generate_variant:Nn \tl_put_left:Nn { Nv }
\prg_generate_conditional_variant:Nnn \clist_if_in:Nn { Nx } { TF }
\prg_generate_conditional_variant:Nnn \prop_if_in:Nn { c } { T }
\prg_generate_conditional_variant:Nnn \str_if_eq:nn { xn } { TF }
@@ -105,11 +106,13 @@
\cs_new_eq:NN \__tblr_halign_command_c: \centering
\cs_new_eq:NN \__tblr_halign_command_r: \raggedleft
-%% Some counters for row and column numbering
-\newcounter{rownum}
-\newcounter{colnum}
-\newcounter{rowcount}
-\newcounter{colcount}
+%% Some counters for row and column numbering.
+%% We may need to restore all LaTeX counters in measuring and building cells,
+%% so we must not define these counters with \newcounter command.
+\int_new:N \c@rownum
+\int_new:N \c@colnum
+\int_new:N \c@rowcount
+\int_new:N \c@colcount
%% Some dimensions for row and column spacing
\dim_new:N \abovesep
@@ -369,7 +372,10 @@
\__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 } { foreground } { str }
\__tblr_data_new_key:nnn { cell } { font } { str }
+\__tblr_data_new_key:nnn { cell } { mode } { str }
+\__tblr_data_new_key:nnn { cell } { cmd } { 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 }
@@ -1634,11 +1640,14 @@
f .meta:n = { valign = f },
wd .code:n = \__tblr_cell_gput:ne { width } {#1},
bg .code:n = \__tblr_cell_gput:ne { background } {#1},
+ fg .code:n = \__tblr_cell_gput:ne { foreground } {#1},
+ font .code:n = \__tblr_cell_gput:nn { font } { #1 \selectfont },
+ mode .code:n = \__tblr_cell_gput:nn { mode } {#1},
+ $ .meta:n = { mode = math },
+ $$ .meta:n = { mode = dmath },
+ cmd .code:n = \__tblr_cell_gput:nn { cmd } {#1},
preto .code:n = \__tblr_cell_preto_text:n {#1},
appto .code:n = \__tblr_cell_appto_text:n {#1},
- cmd .code:n = \__tblr_cell_process_text:n {#1},
- fg .code:n = \__tblr_cell_preto_text:n { \color{#1} },
- font .code:n = \__tblr_cell_gput:nn { font } { #1 \selectfont },
unknown .code:n = \__tblr_cell_unknown_key:V \l_keys_key_str,
}
@@ -1686,23 +1695,6 @@
}
\cs_generate_variant:Nn \__tblr_cell_appto_text:nnn { nen, enn, een }
-\cs_new_protected:Npn \__tblr_cell_process_text:n #1
- {
- \__tblr_cell_process_text:een
- { \int_use:N \c@rownum } { \int_use:N \c@colnum } {#1}
- }
-
-\cs_new_protected:Npn \__tblr_cell_process_text:nnn #1 #2 #3
- {
- \tl_set:Nx \l__tblr_cell_text_tl
- {
- { \__tblr_spec_item:nn { text } { [#1][#2] } }
- }
- \tl_put_left:Nn \l__tblr_cell_text_tl {#3}
- \__tblr_spec_gput:nnV { text } { [#1][#2] } \l__tblr_cell_text_tl
- }
-\cs_generate_variant:Nn \__tblr_cell_process_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}
@@ -1911,13 +1903,16 @@
h .meta:n = { valign = h },
f .meta:n = { valign = f },
bg .code:n = \__tblr_column_gput_cell:nn { background } {#1},
- fg .code:n = \__tblr_preto_text_for_every_column_cell:n { \color{#1} },
+ fg .code:n = \__tblr_column_gput_cell:nn { foreground } {#1},
font .code:n = \__tblr_column_gput_cell:nn { font } { #1 \selectfont },
+ mode .code:n = \__tblr_column_gput_cell:nn { mode } {#1},
+ $ .meta:n = { mode = math },
+ $$ .meta:n = { mode = dmath },
+ cmd .code:n = \__tblr_column_gput_cell:nn { cmd } {#1},
wd .code:n = \__tblr_column_gput:ne { width } { \dim_eval:n {#1} },
co .code:n = \__tblr_column_gput:ne { coefficient } {#1},
preto .code:n = \__tblr_preto_text_for_every_column_cell:n {#1},
appto .code:n = \__tblr_appto_text_for_every_column_cell:n {#1},
- cmd .code:n = \__tblr_process_text_for_every_column_cell:n {#1},
leftsep .code:n = \__tblr_column_gput:ne { leftsep } { \dim_eval:n {#1} },
rightsep .code:n = \__tblr_column_gput:ne { rightsep } { \dim_eval:n {#1} },
colsep .meta:n = { leftsep = #1, rightsep = #1},
@@ -1969,14 +1964,6 @@
}
}
-\cs_new_protected:Npn \__tblr_process_text_for_every_column_cell:n #1
- {
- \int_step_inline:nn { \c@rowcount }
- {
- \__tblr_cell_process_text:nen {##1} { \int_use:N \c@colnum } {#1}
- }
- }
-
\regex_const:Nn \c__tblr_is_number_key_regex { ^[\+\-]? (\d+|\d*\.\d+)$ }
\cs_new_protected:Npn \__tblr_column_unknown_key:n #1
@@ -2071,13 +2058,16 @@
h .meta:n = { valign = h },
f .meta:n = { valign = f },
bg .code:n = \__tblr_row_gput_cell:nn { background } {#1},
- fg .code:n = \__tblr_preto_text_for_every_row_cell:n { \color{#1} },
+ fg .code:n = \__tblr_row_gput_cell:nn { foreground } {#1},
font .code:n = \__tblr_row_gput_cell:nn { font } { #1 \selectfont },
+ mode .code:n = \__tblr_row_gput_cell:nn { mode } {#1},
+ $ .meta:n = { mode = math },
+ $$ .meta:n = { mode = dmath },
+ cmd .code:n = \__tblr_row_gput_cell:nn { cmd } {#1},
ht .code:n = \__tblr_row_gput:ne { height } { \dim_eval:n {#1} },
co .code:n = \__tblr_row_gput:ne { coefficient } {#1},
preto .code:n = \__tblr_preto_text_for_every_row_cell:n {#1},
appto .code:n = \__tblr_appto_text_for_every_row_cell:n {#1},
- cmd .code:n = \__tblr_process_text_for_every_row_cell:n {#1},
abovesep .code:n = \__tblr_row_gput:ne { abovesep } { \dim_eval:n {#1} },
belowsep .code:n = \__tblr_row_gput:ne { belowsep } { \dim_eval:n {#1} },
rowsep .meta:n = { abovesep = #1, belowsep = #1},
@@ -2142,14 +2132,6 @@
}
}
-\cs_new_protected:Npn \__tblr_process_text_for_every_row_cell:n #1
- {
- \int_step_inline:nn { \c@colcount }
- {
- \__tblr_cell_process_text:enn { \int_use:N \c@rownum } {##1} {#1}
- }
- }
-
\cs_new_protected:Npn \__tblr_row_unknown_key:n #1
{
\regex_match:NnTF \c__tblr_is_number_key_regex {#1}
@@ -3397,7 +3379,9 @@
\cs_new_protected:Npn \__tblr_measure_cell_update_sizes:nnNNNN #1 #2 #3 #4 #5 #6
{
\__tblr_get_cell_alignments:nn {#1} {#2}
+ \__tblr_save_counters:n { trial }
\hbox_set:Nn \l_tmpa_box { \__tblr_get_cell_text:nn {#1} {#2} }
+ \__tblr_restore_counters:n { trial }
\__tblr_update_cell_size:nnNNNN {#1} {#2} #3 #4 #5 #6
\__tblr_update_row_size:nnNNN {#1} {#2} #4 #5 #6
\__tblr_update_col_size:nN {#2} #3
@@ -3416,13 +3400,45 @@
{ \__tblr_get_cell_text_real:nn { #1 } { #2 } }
}
+\tl_new:N \l__tblr_cell_fg_tl
+\tl_new:N \l__tblr_cell_cmd_tl
+\tl_new:N \l__tblr_cell_mode_tl
+\bool_new:N \l__tblr_cell_math_mode_bool
+\tl_const:Nn \l__tblr_cell_math_style_tl { \relax }
+\tl_const:Nn \l__tblr_cell_imath_style_tl { \textstyle }
+\tl_const:Nn \l__tblr_cell_dmath_style_tl { \displaystyle }
+
%% Get cell text, #1: row number, #2: column number
%% If the width of the cell is not set, split it with \\ and compute the width
%% Therefore we always get a vbox for any cell
\cs_new_protected:Npn \__tblr_get_cell_text_real:nn #1 #2
{
\group_begin:
- \tl_set:Nx \l__tblr_c_tl { \__tblr_spec_item:ne { text } {[#1][#2]} }
+ \tl_set:Nx \l__tblr_cell_cmd_tl
+ { \__tblr_data_item:neen { cell } {#1} {#2} { cmd } }
+ \tl_if_empty:NTF \l__tblr_cell_cmd_tl
+ { \tl_set:Nx \l__tblr_c_tl { \__tblr_spec_item:ne { text } {[#1][#2]} } }
+ {
+ \tl_set:Nx \l__tblr_c_tl { { \__tblr_spec_item:ne { text } {[#1][#2]} } }
+ \tl_put_left:NV \l__tblr_c_tl \l__tblr_cell_cmd_tl
+ }
+ \tl_set:Nx \l__tblr_cell_mode_tl
+ { \__tblr_data_item:neen { cell } {#1} {#2} { mode } }
+ \tl_if_empty:NT \l__tblr_cell_mode_tl
+ {
+ \bool_if:NTF \l__tblr_math_mode_bool
+ { \tl_set:Nn \l__tblr_cell_mode_tl { math } }
+ { \tl_set:Nn \l__tblr_cell_mode_tl { text } }
+ }
+ \tl_if_eq:NnTF \l__tblr_cell_mode_tl { text }
+ { \bool_set_false:N \l__tblr_cell_math_mode_bool }
+ {
+ \bool_set_true:N \l__tblr_cell_math_mode_bool
+ \tl_put_left:Nv \l__tblr_c_tl
+ { l__tblr_cell_ \l__tblr_cell_mode_tl _style_tl }
+ \tl_put_left:Nn \l__tblr_c_tl { $ }
+ \tl_put_right:Nn \l__tblr_c_tl { $ }
+ }
\tl_set:Nx \l__tblr_f_tl { \__tblr_data_item:neen { cell } {#1} {#2} { font } }
\tl_set:Nx \l__tblr_w_tl
{ \__tblr_data_item:neen { cell } {#1} {#2} { width } }
@@ -3437,15 +3453,17 @@
}
\dim_compare:nNnT { \l__tblr_w_tl } < { 0pt } % column width unset
{
- \bool_if:NTF \l__tblr_math_mode_bool
+ \bool_if:NTF \l__tblr_cell_math_mode_bool
{
- \hbox_set:Nn \l_tmpa_box { $\l__tblr_c_tl$ }
+ \hbox_set:Nn \l_tmpa_box { \l__tblr_c_tl }
\tl_set:Nx \l__tblr_w_tl { \box_wd:N \l_tmpa_box }
}
{
\__tblr_get_cell_size_with_box:
}
}
+ \tl_set:Nx \l__tblr_cell_fg_tl
+ { \__tblr_data_item:neen { cell } {#1} {#2} { foreground } }
\tl_put_left:NV \l__tblr_c_tl \l__tblr_f_tl
\__tblr_get_vcell_and_sizes:NN \l__tblr_c_tl \l__tblr_w_tl
\group_end:
@@ -3453,9 +3471,11 @@
\cs_new_protected:Npn \__tblr_get_cell_size_with_box:
{
+ \__tblr_save_counters:n { cell }
\tl_if_eq:NnTF \l__tblr_inner_spec_measure_tl { vbox }
{ \__tblr_get_cell_size_with_vbox: }
{ \__tblr_get_cell_size_with_hbox: }
+ \__tblr_restore_counters:n { cell }
}
%% Varwidth won't work as expected when \color command occurs in it,
@@ -3503,7 +3523,9 @@
\cs_new_protected:Npn \__tblr_get_vcell_and_sizes:NN #1 #2
{
\group_begin:
+ \__tblr_save_counters:n { cell }
\vbox_set_top:Nn \l_tmpa_box { \__tblr_make_vcell_text:NN #1 #2 }
+ \__tblr_restore_counters:n { cell }
\vbox_set:Nn \l_tmpb_box { \__tblr_make_vcell_text:NN #1 #2 }
\dim_gset:Nn \g__tblr_cell_wd_dim { \box_wd:N \l_tmpb_box }
\dim_gset:Nn \g__tblr_cell_ht_dim
@@ -3555,8 +3577,9 @@
\cs:w __tblr_halign_command_ \g__tblr_cell_halign_tl : \cs_end:
\mode_leave_vertical:
\box_use:N \l__tblr_strut_ht_box
- \bool_if:NTF \l__tblr_math_mode_bool
- { $#1$ }
+ \tl_if_empty:NF \l__tblr_cell_fg_tl { \exp_args:NV \color \l__tblr_cell_fg_tl }
+ \bool_if:NTF \l__tblr_cell_math_mode_bool
+ { #1 }
{ \__tblr_rescan_cell_tokens:N #1 }
\box_use:N \l__tblr_strut_dp_box
}
@@ -3571,6 +3594,8 @@
\tl_if_empty:NTF \l__tblr_inner_spec_verb_tl
{ #1 }
{
+ %% insert space characters after some control sequences first (issue #112)
+ \regex_replace_all:nnN { (\c{[A-Za-z]*}) ([A-Za-z]) } { \1 \ \2 } #1
\regex_replace_all:nnN { . } { \c{string} \0 } #1
\tl_set:Nx #1 { #1 \noexpand \empty }
\exp_args:NV \tex_scantokens:D #1
@@ -4644,7 +4669,7 @@
%% since we want a correct hangindent caption paragraph.
\DefTblrTemplate { caption-tag } { empty } { }
-\DefTblrTemplate { caption-tag } { normal } { Table \hspace{0.25em} \thetable }
+\DefTblrTemplate { caption-tag } { normal } { \tablename\hspace{0.25em}\thetable }
\SetTblrTemplate { caption-tag } { normal }
\DefTblrTemplate { caption-sep } { empty } { }
@@ -5386,11 +5411,7 @@
\vbox_set:Nn \l__tblr_table_box
{
\box_use:N \l__tblr_table_head_box
- \hrule height ~ 0pt
- \box_use:N \l__tblr_row_head_box
- \hrule height ~ 0pt
- \box_use:N \l__tblr_table_box
- \hrule height ~ 0pt
+ \__tblr_cover_two_vboxes:NN \l__tblr_row_head_box \l__tblr_table_box
\box_use:N \l__tblr_row_foot_box
\hrule height ~ 0pt
\box_use:N \l__tblr_table_foot_box
@@ -5399,6 +5420,22 @@
}
\cs_generate_variant:Nn \__tblr_build_page_table:nnn { nnx }
+%% To solve the problem of missing hlines of long tables in some PDF readers,
+%% We need to draw body rows before head rows (see issue #88).
+\cs_new_protected:Npn \__tblr_cover_two_vboxes:NN #1 #2
+ {
+ \dim_set:Nn \l_tmpa_dim { \box_ht:N #1 + \box_dp:N #1 }
+ \dim_set:Nn \l_tmpb_dim { \box_ht:N #2 + \box_dp:N #2 }
+ \skip_vertical:N \l_tmpa_dim
+ \hrule height ~ 0pt
+ \box_use:N #2
+ \skip_vertical:n { - \l_tmpa_dim - \l_tmpb_dim }
+ \hrule height ~ 0pt
+ \box_use:N #1
+ \skip_vertical:N \l_tmpb_dim
+ \hrule height ~ 0pt
+ }
+
\cs_new_protected:Npn \__tblr_halign_whole:Nn #1 #2
{
\noindent
@@ -6451,6 +6488,72 @@
\clist_map_inline:nn {#1} { \use:c { __tblr_use_lib_ ##1: } }
}
+%% Library amsmath and environments +array, +matrix, +cases, ...
+
+\NewTblrLibrary { amsmath }
+ {
+ \RequirePackage { amsmath, environ }
+ \NewTblrEnviron { +array }
+ \SetTblrInner[+array]{colsep = 5pt}
+ \NewEnviron { +matrix } [1] [] {
+ \begin{+array}[expand = \BODY]{
+ column{1} = {leftsep = 0pt}, column{Z} = {rightsep = 0pt},
+ cells = {c}, ##1
+ }
+ \BODY
+ \end{+array}
+ }
+ \NewEnviron { +bmatrix } [1] [] {
+ \left[\begin{+array}[expand = \BODY]{
+ column{1} = {leftsep = 0pt}, column{Z} = {rightsep = 0pt},
+ cells = {c}, ##1
+ }
+ \BODY
+ \end{+array}\right]
+ \ignorespacesafterend
+ }
+ \NewEnviron { +Bmatrix } [1] [] {
+ \left\lbrace\begin{+array}[expand = \BODY]{
+ column{1} = {leftsep = 0pt}, column{Z} = {rightsep = 0pt},
+ cells = {c}, ##1
+ }
+ \BODY
+ \end{+array}\right\rbrace
+ }
+ \NewEnviron { +pmatrix } [1] [] {
+ \left(\begin{+array}[expand = \BODY]{
+ column{1} = {leftsep = 0pt}, column{Z} = {rightsep = 0pt},
+ cells = {c}, ##1
+ }
+ \BODY
+ \end{+array}\right)
+ }
+ \NewEnviron { +vmatrix } [1] [] {
+ \left\lvert\begin{+array}[expand = \BODY]{
+ column{1} = {leftsep = 0pt}, column{Z} = {rightsep = 0pt},
+ cells = {c}, ##1
+ }
+ \BODY
+ \end{+array}\right\rvert
+ }
+ \NewEnviron { +Vmatrix } [1] [] {
+ \left\lVert\begin{+array}[expand = \BODY]{
+ column{1} = {leftsep = 0pt}, column{Z} = {rightsep = 0pt},
+ cells = {c}, ##1
+ }
+ \BODY
+ \end{+array}\right\rVert
+ }
+ \NewEnviron { +cases } [1] [] {
+ \left\lbrace\begin{+array}[expand = \BODY]{
+ column{1} = {leftsep = 0pt}, column{Z} = {rightsep = 0pt},
+ colspec = {ll}, stretch = 1.2, ##1
+ }
+ \BODY
+ \end{+array}\right.
+ }
+ }
+
%% Library booktabs and commands \toprule, \midrule, \bottomrule
\NewTblrLibrary { booktabs }
@@ -6507,6 +6610,32 @@
{ \SetVspace { abovespace+ = (##1) / 2, belowspace+ = (##1) / 2 } }
}
+%% Library counter for resetting all counters
+
+\tl_new:N \__tblr_saved_trial_counters_tl
+\tl_new:N \__tblr_saved_cell_counters_tl
+
+\cs_new_protected:Npn \__tblr_save_counters:n #1 { }
+\cs_new_protected:Npn \__tblr_restore_counters:n #1 { }
+
+%% We use code from tabularx package for resetting all LaTeX counters,
+%% where internal macro \cl@@ckpt looks like the following:
+%% \@elt{page} \@elt{equation} \@elt{enumi} \@elt{enumii} \@elt{enumiii} ...
+
+\NewTblrLibrary { counter }
+ {
+ \cs_set_protected:Npn \__tblr_save_counters:n ##1
+ {
+ \def \@elt ####1 { \global\value{####1} = \the\value{####1} \relax }
+ \tl_set:cx { __tblr_saved_ ##1 _counters_tl } { \cl@@ckpt }
+ \let \@elt = \relax
+ }
+ \cs_set_protected:Npn \__tblr_restore_counters:n ##1
+ {
+ \tl_use:c { __tblr_saved_ ##1 _counters_tl }
+ }
+ }
+
%% Library diagbox and command \diagbox
\NewTblrLibrary { diagbox }
@@ -6538,7 +6667,7 @@
\cs_new_protected:Npn \__tblr_lib_diagbox_math_or_text:n #1
{
- \bool_if:NTF \l__tblr_math_mode_bool {$#1$} {#1}
+ \bool_if:NTF \l__tblr_cell_math_mode_bool {$#1$} {#1}
}
\box_new:N \l__tblr_diag_box
@@ -6566,7 +6695,7 @@
\cs_new_protected:Npn \__tblr_siunitx_setcolumn:n ##1
{
\__tblr_column_gput_cell:nn { si } {##1}
- \__tblr_process_text_for_every_column_cell:n { \TblrNum }
+ \__tblr_column_gput_cell:nn { cmd } { \TblrNum }
}
\NewDocumentCommand \TblrNum { m }
{