color – Why does tabularray not Accept Colors from Commands in LaTeX?

colortabularray

I try to set the color of a cell in a tabularray by a command:

\documentclass{article}

\usepackage{xcolor}
\usepackage{tabularray}

\ExplSyntaxOn

\newcommand{\Tcolor}{
    green
}

\ExplSyntaxOff


\begin{document}
    \textcolor{\Tcolor}{abc}
    
\begin{tblr}{
        colspec  = {l},
        cell{1}{1} = {\Tcolor},
    }
abc  \\
\end{tblr}

\end{document}

Somehow the color cell{1}{1} = {\Tcolor}, breaks. Why?

cell{1}{1} = {green}, works…

EDIT: I guess in my attempt to create a MWE I shortened it too much. There is a need for a function instead of a simple color:

\documentclass{article}

\usepackage{xcolor}
\usepackage{tabularray}

\ExplSyntaxOn


\newcommand{\Tcolor}[1]{
    \int_compare:nNnTF
    {#1} = {0}
    { red } 
    {
        \int_compare:nNnTF
        {#1} < {30}
        { orange } 
        {
            \int_compare:nNnTF
            {#1} < {40}
            { green } 
            {
                blue
            }
        }
    }
    
}

\ExplSyntaxOff


\begin{document}
    \textcolor{\Tcolor{32}}{abc}
    
\begin{tblr}{
        colspec  = {l},
        cell{1}{1} = {\Tcolor{32}},
        cell{1}{2} = {\Tcolor{48}}, 
    }
abc  \\
def \\
\end{tblr}

\end{document}

Best Answer

The cell{<i>}{<j>} key can accept several types of values; for instance, according to the manual, you can do

cell{1}{1}={cmd=\fbox}

Thus the managing of values is necessarily complex. When a value is just a string that's not another key, it is interpreted as a color name for the background.

You can use bg=<color> and, in this case, you can use a macro.

\documentclass{article}

\usepackage{xcolor}
\usepackage{tabularray}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\Tcolor}{m}
  {
    \bool_case:nF
      {
        { \int_compare_p:n {#1 = 0} }{ red!80 } 
        { \int_compare_p:n {0 < #1 < 30} }{ orange } 
        { \int_compare_p:n {30 <= #1 < 40} }{ green!80 }
      }
      { blue!60!green }
  }

\ExplSyntaxOff

\begin{document}

\textcolor{\Tcolor{32}}{abc}

\medskip
    
\begin{tblr}{
   colspec  = {l},
   cell{1}{1} = {bg=\Tcolor{0}},
   cell{2}{1} = {bg=\Tcolor{15}}, 
   cell{3}{1} = {bg=\Tcolor{32}}, 
   cell{4}{1} = {bg=\Tcolor{48}}, 
}
abc \\
def \\
ghi \\
jkl \\
\end{tblr}

\end{document}

Note the use of \bool_case:nF in order to avoid the awkward nesting of conditionals.

enter image description here