
Tengo este código bastante complejo que produce varias tablas al final. El problema actualmente es la configuración regional de la última tabla. Utiliza comandos de datatool
para calcular la suma de varias posiciones. En las tablas individuales (por ejemplo, \excTable{EarlyCareer}
y \excTable{Collaboration}
) todo parece como se esperaba. Pero usar el comando \DTLsumcolumn
o \DTLsumforkeys
cambia la configuración regional, por lo que los marcadores decimales se interpretan como falsos. Usando \DTLsumcolumn{TotalStructuralMeasures}{totalsum}{\excSumTotalStructuralMeasures}
fuera del tblr
entorno, todo está bien.
No puedo usarlo \DTLdecimaltolocale
también, ya que esto provoca un error de compilación:
! Package siunitx Error: Invalid number '35,,000'.
For immediate help type H <return>.
...
l.242 \excTable{TotalStructuralMeasures}
Aquí está el MWE completo:
\documentclass{scrbook}
\usepackage{datatool,xstring}
\usepackage{xkeyval}
\usepackage{tabularray}
\UseTblrLibrary{booktabs}
\PassOptionsToPackage{
mode = match,
propagate-math-font = true,
reset-math-version = false,
reset-text-family = false,
reset-text-series = false,
reset-text-shape = false,
text-family-to-math = true,
text-series-to-math = true,
tight-spacing = true,
group-minimum-digits = 4, % --> 1.234 instead of 1234
group-separator = {,},% for "12.345" instead of "12 345" %
%table-format = 6,
table-alignment-mode = format,
%table-auto-round,
locale=UK,
}{siunitx}
\UseTblrLibrary{siunitx}
\sisetup{output-decimal-marker={.}} % Neue Zeile hinzugefügt
\providecommand\excDB{}
\makeatletter
\define@key{funding}{category}{\DTLnewdbentry{\excDB}{category}{#1}}
\define@key{funding}{fundingYear1}{\DTLnewdbentry{\excDB}{fundingYear1}{#1}}
\define@key{funding}{fundingYear2}{\DTLnewdbentry{\excDB}{fundingYear2}{#1}}
\define@key{funding}{fundingYear3}{\DTLnewdbentry{\excDB}{fundingYear3}{#1}}
\define@key{funding}{fundingYear4}{\DTLnewdbentry{\excDB}{fundingYear4}{#1}}
\define@key{funding}{fundingYear5}{\DTLnewdbentry{\excDB}{fundingYear5}{#1}}
\define@key{funding}{fundingYear6}{\DTLnewdbentry{\excDB}{fundingYear6}{#1}}
\define@key{funding}{fundingYear7}{\DTLnewdbentry{\excDB}{fundingYear7}{#1}}
\define@key{funding}{totalsum}{\DTLnewdbentry{\excDB}{totalsum}{#1}}
\makeatother
\NewDocumentCommand{\excEntry}{ m o m }{%
% #1 name of the database into which the values are stored
% #2 name of the keys
% #3 part of the key-values
\def\excDB{#1}%
\DTLifdbexists{\excDB}{}{\DTLnewdb{\excDB}}%
\DTLnewrow{\excDB}%
\IfNoValueTF{#2}{\setkeys{#1}{#3}}{\setkeys{#2}{#3}}%
}
\NewDocumentCommand{\tmpDTLifdbexists}{mmm}{%
\DTLifdbexists{#2}
{\DTLsumforkeys{#2}{%
fundingYear1,%
fundingYear2,%
fundingYear3,%
fundingYear4,%
fundingYear5,%
fundingYear6,%
fundingYear7%
}{#3}%
\excEntry{#1}[funding]{%
category={#2},
totalsum={#3}%
}}%yes
{}%no
}
\makeatletter
\NewDocumentCommand{\excTotalStructuralMeasuresTable}{}{%
\def\tblrbody{}%
\tmpDTLifdbexists{TotalStructuralMeasures}{EarlyCareer}{\EarlyCareer}%
\tmpDTLifdbexists{TotalStructuralMeasures}{Collaboration}{\Collaboration}%
\DTLforeach{TotalStructuralMeasures}{%
\category =category,%
\totalsum =totalsum%
}{%
%%\DTLdecimaltolocale{\totalsum}{\totalsum}% try to convert . to ,
\protected@edef\tblrbody{\tblrbody
\category & \totalsum % <--- wrong locale // decimal
\\
}}%
% getting the sum of the total table
\DTLsumcolumn{TotalStructuralMeasures}{totalsum}{\excSumTotalStructuralMeasures}
\begin{tblr}[%
expand = \tblrbody,
long
]{%
vspan=even,
colspec = {%
*{1}{X[4,m]}
*{1}{X[c,si={table-format=6.0, round-mode=places, output-decimal-marker={,},locale=UK}]}
%% *{1}{X[c,si={locale=UK}]}
},
hline{Y}={wd=1pt},
column{2}={halign={c}},
row{1}={guard}
}
Structural measures & Total Year\\
\tblrbody
Total & \excSumTotalStructuralMeasures \\
\end{tblr}%
}
\NewDocumentCommand{\excFundingRequestTable}{}{%
\begingroup%
\def\tblrbody{}%
\DTLforeach{\tmpLocalDB}{%
\category=category,%
\FundingYearOne ={fundingYear1},%
\FundingYearTwo ={fundingYear2},%
\FundingYearThree ={fundingYear3},%
\FundingYearFour ={fundingYear4},%
\FundingYearFive ={fundingYear5},%
\FundingYearSix ={fundingYear6},%
\FundingYearSeven ={fundingYear7}%
}{%
\protected@edef\tblrbody{\tblrbody
\category
& \FundingYearOne
& \FundingYearTwo
& \FundingYearThree
& \FundingYearFour
& \FundingYearFive
& \FundingYearSix
& \FundingYearSeven \\
}}%
\begin{tblr}[%
expand = \tblrbody,
long
]{%
vspan=even,
colspec = {%
*{1}{X[3,m]}
*{7}{X[si={%
table-format=6,
table-auto-round,
round-mode=places},
c]}
},
hline{2}={wd=0pt},
hline{3}={wd=1pt},
rowhead = 2,
row{1,2}={guard},
row{2} = {
font={\bfseries},
halign={c},
}
}
% empty
& Year 1
& Year 2
& Year 3
& Year 4
& Year 5
& Year 6
& Year 7 \\
Funding category
& \SetCell[c=7]{c} Totals per year
&
&
&
&
&
& \\
\tblrbody
\end{tblr}%
\endgroup%
}
\makeatother
\NewDocumentCommand{\excTable}{om}{%
% #1 value for a specific database
% #2 using the default database of the defined table
\def\tmpLocalDB{#2}%
\IfStrEqCase{#2}{%
{EarlyCareer}{\def\tmpLocalTableCaption{Funding Request for Early-career Support}\excFundingRequestTable}%
{Collaboration}{\def\tmpLocalTableCaption{Funding Request for Collaboration with external partners}\excFundingRequestTable}%
}[\csname exc#2Table\endcsname]
}
\begin{document}
\excEntry{Collaboration}[funding]{
category = {Staff},
fundingYear1 = {4119},
fundingYear2 = {4229},
fundingYear3 = {4339},
fundingYear4 = {4449},
fundingYear5 = {4559},
fundingYear6 = {4669},
fundingYear7 = {4779},
}
\excEntry{Collaboration}[funding]{
category = {{Direct project costs}},
fundingYear1 = {5118},
fundingYear2 = {5228},
fundingYear3 = {5338},
fundingYear4 = {5448},
fundingYear5 = {5558},
fundingYear6 = {5668},
fundingYear7 = {5778},
}
\excEntry{EarlyCareer}[funding]{
category = {{Direct project costs}},
fundingYear1 = {2000},
fundingYear2 = {2000},
fundingYear3 = {2000},
fundingYear4 = {2000},
fundingYear5 = {2000},
fundingYear6 = {2000},
fundingYear7 = {2000},
}
\excEntry{EarlyCareer}[funding]{
category = {Instrumentation},
fundingYear1 = {3000},
fundingYear2 = {3000},
fundingYear3 = {3000},
fundingYear4 = {3000},
fundingYear5 = {3000},
fundingYear6 = {3000},
fundingYear7 = {3000},
}
% tables with correct decimals
\excTable{EarlyCareer}
\excTable{Collaboration}
% table with wrong decimals
\excTable{TotalStructuralMeasures}
% command with correct decimal
correct decimal: \excSumTotalStructuralMeasures
\end{document}
Un producto visual para una mejor comprensión: