tabla siunitx, formateando la salida \directlua{}

tabla siunitx, formateando la salida \directlua{}

Tengo una tabla con valores calculados con \directlua{}. Están formateados con siunitxcolumnas.

Quiero poner algunos valores en negrita o cambiar su color.

Parece que la salida de \directlua{}las macros tiene el formato de texto sin formato, no como siunitx Sdebería ser la columna.

MWE:

% Latex program : luaLatex
\documentclass{article}

% *** Fonts ***
\usepackage{fontspec}
\setmainfont{Tex Gyre Schola}[Numbers={Proportional,OldStyle}]
% *** Tabular figures ***
\newfontfamily\TLFfont{Tex Gyre Schola}[Numbers={Monospaced,Lining}]

% *** siunitx ***
\usepackage{siunitx}
% french typesetting, 3-figures blocks
   \sisetup{locale=FR,group-minimum-digits=4}
% font detection
   \sisetup{detect-all}

% *** Lua percent sign ***
% https://tex.stackexchange.com/questions/436979/problem-with-string-format-directlua-and-tex-sprint
\makeatletter
   \let\luaPercent\@percentchar
\makeatother
% *** Rounding value ***
\newcommand*{\roundingValue}{2}
% ***

\usepackage{xcolor}

% *** Tabular bold / siunitx ***
% https://tex.stackexchange.com/questions/66253/siunitx-bold-single-numeric-cells
\usepackage{etoolbox}
\robustify\bfseries


\begin{document}

\sisetup{mode=text,text-rm=\TLFfont,unit-mode=text}
\begin{tabular}{lSSr}
      &   {raw text value} &   {directlua value} &    \\
   basic text &   1231.45 &   \directlua{n=1231.45 tex.print(string.format("\luaPercent.\roundingValue f",n))} &   right \\
   itshape &   \itshape 1231.45 &   \itshape \directlua{n=1231.45 tex.print(string.format("\luaPercent.\roundingValue f",n))} &   wrong \\
   bfseries &   \bfseries 1231.45 &   \bfseries \directlua{n=1231.45 tex.print(string.format("\luaPercent.\roundingValue f",n))} &   wrong \\
   color &   \color{red}1231.45 &   \color{red}\directlua{n=1231.45 tex.print(string.format("\luaPercent.\roundingValue f",n))} &   wrong \\
   tex.sprint &   &   \color{red}\directlua{n=1231.45 tex.sprint(string.format("\luaPercent.\roundingValue f",n))} &   wrong \\
   tex.cprint 11 &   &   \color{red}\directlua{n=1231.45 tex.cprint(11, string.format("\luaPercent.\roundingValue f",n))} &   wrong \\
\end{tabular}

\end{document}

Utilizo una fuente de números de estilo antiguo a propósito, para realzar las diferencias:

Imagen
(fuente:toile-libre.org)

El único texto con el formato correcto es cuando no se aplica ningún modificador.

¿Que me estoy perdiendo aqui?

Respuesta1

El problema no está directamente relacionado con \directlua, sucede lo mismo si lo reemplaza \directlua{...}con una macro que se expande a un número. En ambos casos, siunitx tiene que mirar el valor después de que TeX lo haya expandido al número real, pero el código de expansión en siunitx se ve interrumpido por comandos no expandibles \color, \itshapeetc. Puede evitar esto agregando manualmente (muchos \expandafters o) \expanded, para garantizar que el valor esté completamente expandido antes de que siunitx vea el comando no expandible:

% Latex program : luaLatex
\documentclass{article}

% *** Fonts ***
\usepackage{fontspec}
\setmainfont{Tex Gyre Schola}[Numbers={Proportional,OldStyle}]
% *** Tabular figures ***
\newfontfamily\TLFfont{Tex Gyre Schola}[Numbers={Monospaced,Lining}]

% *** siunitx ***
\usepackage{siunitx}
% french typesetting, 3-figures blocks
   \sisetup{locale=FR,group-minimum-digits=4}
% font detection
   \sisetup{detect-all}

% *** Lua percent sign ***
% https://tex.stackexchange.com/questions/436979/problem-with-string-format-directlua-and-tex-sprint
\makeatletter
   \let\luaPercent\@percentchar
\makeatother
% *** Rounding value ***
\newcommand*{\roundingValue}{2}
% ***

\usepackage{xcolor}

% *** Tabular bold / siunitx ***
% https://tex.stackexchange.com/questions/66253/siunitx-bold-single-numeric-cells
\usepackage{etoolbox}
\robustify\bfseries


\begin{document}

\sisetup{mode=text,text-rm=\TLFfont,unit-mode=text}
\begin{tabular}{lSSr}
      &   {raw text value} &   {directlua value} &    \\
   basic text &   1231.45 &   \directlua{n=1231.45 tex.print(string.format("\luaPercent.\roundingValue f",n))} &   right \\
   itshape &   \itshape 1231.45 &   \expanded{\noexpand\itshape \directlua{n=1231.45 tex.print(string.format("\luaPercent.\roundingValue f",n))}} &   right \\
   bfseries &   \bfseries 1231.45 &   \expanded{\noexpand\bfseries \directlua{n=1231.45 tex.print(string.format("\luaPercent.\roundingValue f",n))}} &   right \\
   color &   \color{red}1231.45 &   \expanded{\noexpand\color{red}\directlua{n=1231.45 tex.print(string.format("\luaPercent.\roundingValue f",n))}} &   right \\
   tex.sprint &   &   \expanded{\noexpand\color{red}\directlua{n=1231.45 tex.sprint(string.format("\luaPercent.\roundingValue f",n))}} &   right \\
   tex.cprint 11 &   &   \expanded{\noexpand\color{red}\directlua{n=1231.45 tex.cprint(11, string.format("\luaPercent.\roundingValue f",n))}} &   wrong \\
   tex.cprint 12 &   &   \expanded{\noexpand\color{red}\directlua{n=1231.45 tex.cprint(12, string.format("\luaPercent.\roundingValue f",n))}} &   right \\
\end{tabular}

\end{document}

(Como alternativa, el problema también podría solucionarse imprimiendo \coloro el comando de fuente tex.printen la \directluallamada en lugar de emitirlos por separado) ingrese la descripción de la imagen aquí

información relacionada