Open DaftDogeee opened 10 months ago
It seems currently there's no user interface to align the top of cells in columns 2 and 3 with each other and align the middle of cells in column 1 with the middle of highest cell in same row (but other columns). Horizontal spanning cells (with r=<n>
, n >= 2
) do have the effect you want, but that doesn't work for r=1
cells.
A proof-of-concept attempt that adds valign=M
.
Update: It's tested with tabularray 2023A (2023-03-01) and 2024A (2024-02-16).
```tex \documentclass{article} \usepackage{tabularray} \usepackage{xcolor} \UseTblrLibrary{varwidth} \usepackage{blindtext} \usepackage{regexpatch} % for patching \ExplSyntaxOn \makeatletter % tested with tabularray 2023A (2023-03-01) and 2024A (2024-02-16) only \IfPackageAtLeastTF{tabularray}{2024-02-17}{ \PackageWarning { patch-tabularray } { Experimental~patching~to~support~"valign=M"~may~fail~in~newer~versions. } }{} \tl_const:Nn \c__tblr_valign_M_tl {M} \tl_new:N \g__tblr_cell_valign_sub_tl \cs_undefine:N \__tblr_get_cell_alignments:nn \cs_new_protected:Npn \__tblr_get_cell_alignments:nn #1 #2 { \group_begin: \tl_gset:Nx \g__tblr_cell_halign_tl { \__tblr_data_item:neen { cell } {#1} {#2} { halign } } \tl_set:Nx \l__tblr_v_tl { \__tblr_data_item:neen { cell } {#1} {#2} { valign } } \tl_case:NnF \l__tblr_v_tl { \c__tblr_valign_t_tl { \tl_gset:Nn \g__tblr_cell_valign_tl {m} \tl_gset:Nn \g__tblr_cell_middle_tl {t} \tl_gclear:N \g__tblr_cell_valign_sub_tl } \c__tblr_valign_m_tl { \tl_gset:Nn \g__tblr_cell_valign_tl {m} \tl_gset:Nn \g__tblr_cell_middle_tl {m} \tl_gclear:N \g__tblr_cell_valign_sub_tl } \c__tblr_valign_M_tl { \tl_gset:Nn \g__tblr_cell_valign_tl {m} \tl_gset:Nn \g__tblr_cell_valign_sub_tl {M} \tl_gset:Nn \g__tblr_cell_middle_tl {t} } \c__tblr_valign_b_tl { \tl_gset:Nn \g__tblr_cell_valign_tl {m} \tl_gset:Nn \g__tblr_cell_middle_tl {b} \tl_gclear:N \g__tblr_cell_valign_sub_tl } } { \tl_gset_eq:NN \g__tblr_cell_valign_tl \l__tblr_v_tl \tl_gclear:N \g__tblr_cell_middle_tl } \group_end: } % \tracingxpatches % make \__tblr_build_cell_content:NN patchable \char_set_catcode_space:n {32} \xpatchcmd \__tblr_build_cell_content:NN {\hrule height 0pt} {\hrule height0pt} {} {\PackageError{patch-tabularray}{Patch~failed.}{}} \char_set_catcode_ignore:n {32} \IfPackageAtLeastTF{tabularray}{2024-02-16}{ % 2024A or newer % use a longer patten in the hope of failing fast \xpatchcmd \__tblr_build_cell_content:NN { \int_compare:nNnT { \lTblrCellRowSpanTl } < {2} { \box_set_ht:Nn \l__tblr_a_box { \__tblr_data_item:nen { row } {#1} { @row-upper } } \box_set_dp:Nn \l__tblr_a_box { \__tblr_data_item:nen { row } {#1} { @row-lower } } } } { \bool_lazy_and:nnT { \int_compare_p:nNn { \lTblrCellRowSpanTl } < {2} } { ! \tl_if_eq_p:NN \c__tblr_valign_M_tl \g__tblr_cell_valign_sub_tl } { \box_set_ht:Nn \l__tblr_a_box { \__tblr_data_item:nen { row } {#1} { @row-upper } } \box_set_dp:Nn \l__tblr_a_box { \__tblr_data_item:nen { row } {#1} { @row-lower } } } } { } { \PackageError { patch-tabularray } { Patch~failed } {} } }{ % prior to 2024A \xpatchcmd \__tblr_build_cell_content:NN { \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 } } \box_set_dp:Nn \l__tblr_a_box { \__tblr_data_item:nen { row } {#1} { @row-lower } } } } { \bool_lazy_and:nnT { \int_compare_p:nNn { \l__tblr_cell_rowspan_tl } < {2} } { ! \tl_if_eq_p:NN \c__tblr_valign_M_tl \g__tblr_cell_valign_sub_tl } { \box_set_ht:Nn \l__tblr_a_box { \__tblr_data_item:nen { row } {#1} { @row-upper } } \box_set_dp:Nn \l__tblr_a_box { \__tblr_data_item:nen { row } {#1} { @row-lower } } } } { } { \PackageError { patch-tabularray } { Patch~failed } {} } } \keys_define:nn { tblr-column } { M .meta:n = { valign = M }, } \makeatother \ExplSyntaxOff \parindent=0pt \begin{document} \def\test#1{% \begin{tblr}{ hlines, vlines, colspec={X[1,c,#1] *2{X[2,t]}}, column{1}={bg=cyan!20, font=\ttfamily}, measure=vbox } #1 & {test \par test} & {test \par test \par test} \\ #1 & {test \par test} & {test \par test \par test} \\ \end{tblr} \par\medskip } \test{valign=m} \test{valign=M} \begin{tblr}{ width = 0.95\linewidth, colspec = {X[1,c,M]X[2,l,t]X[2,l,t]}, %% Notice hlines, hline{2} = {1}{-}{}, hline{2} = {2}{-}{}, vline{2-3}, row{1} = {c,font=\bfseries}, column{1} = {font=\bfseries}, measure=vbox, } & test & test \\ test & \blindlist{itemize} & \blindlist{itemize} \\ test & \blindlist{itemize} & \blindlist{itemize} \blindlist{itemize} \\ \end{tblr} \end{document} ```
A proof-of-concept attempt that adds
valign=M
.
Many thanks for your solution! I also test your code with Package: tabularray 2022-06-01 v2022B Typeset tabulars and arrays with LaTeX3
, and it still works well.
@muzimuzhi I notice that there is another solution for the similar issue #436. I just want to know which method is better.
The situation here is more general than in #436, hence the solution here is more general too. That is, valign=M
is expected
to work for both issues, but \rotatebox[origin=c]{<degree>}{<text>}
only works for #436.
It seems that the new version of tabularray (2024A) has broken this script, where notably \l__tblr_cell_rowspan_tl
no longer exists. Did valign=M
get a sequel, or do we need to adapt the new script?
! Undefined control sequence.
<argument> \l__tblr_cell_rowspan_tl
l.328 \end
{longtblr}
The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.
! Missing number, treated as zero.
<to be read again>
<
l.328 \end
{longtblr}
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)
@BenjaminGalliot I updated the experimental patching in https://github.com/lvjr/tabularray/issues/434#issuecomment-1686957209 to track changes in tabularray
2024A (2024-02-16). It now works with both 2023A and 2024A.
In the following MWE, I just want to let the first column be with the
m
vertical alignment. I have tried all alignment options, and there is no effects.