Tenho uma tabela com valores calculados com \directlua{}
. Eles são formatados com siunitx
colunas.
Quero colocar alguns valores em negrito ou mudar sua cor.
Parece que a saída das \directlua{}
macros é formatada como texto bruto, não como a siunitx S
coluna deveria.
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}
Eu uso uma fonte de números de estilo antigo propositalmente, para realçar as diferenças:
(fonte:toile-libre.org)
O único texto formatado corretamente é quando nenhum modificador é aplicado.
O que estou perdendo aqui?
Responder1
O problema não está diretamente relacionado \directlua
, o mesmo acontece se você substituir \directlua{...}
por uma macro que se expande para um número. Em ambos os casos, siunitx tem que olhar para o valor depois de ter sido expandido pelo TeX para o número real, mas o código de expansão em siunitx é interrompido pelos comandos não expansíveis \color
, \itshape
etc. \expandafter
s or) \expanded
, para garantir que o valor seja totalmente expandido antes que siunitx veja o comando inexpansível:
% 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, o problema também pode ser corrigido imprimindo \color
ou usando o comando font tex.print
na \directlua
chamada, em vez de emiti-los separadamente)