Die Konvertierung von Dezimalzahlen in Gebietsschemata schlägt mit Datatool in Kombination mit Tabularray fehl

Die Konvertierung von Dezimalzahlen in Gebietsschemata schlägt mit Datatool in Kombination mit Tabularray fehl

Ich habe diesen ziemlich komplexen Code, der am Ende mehrere Tabellen erzeugt. Das Problem ist derzeit die Gebietsschemaeinstellung der letzten Tabelle. Diese verwendet Befehle von , datatoolum die Summe mehrerer Positionen zu berechnen. In den einzelnen Tabellen (z. B. \excTable{EarlyCareer}und \excTable{Collaboration}) sieht alles wie erwartet aus. Aber die Verwendung des Befehls \DTLsumcolumnoder \DTLsumforkeysändert das Gebietsschema - daher werden Dezimaltrennzeichen als falsch interpretiert. Bei Verwendung \DTLsumcolumn{TotalStructuralMeasures}{totalsum}{\excSumTotalStructuralMeasures}außerhalb der tblrUmgebung ist alles in Ordnung.

Ich kann es auch nicht verwenden \DTLdecimaltolocale, da dies einen Kompilierungsfehler verursacht:

! Package siunitx Error: Invalid number '35,,000'.

For immediate help type H <return>.
 ...                                              
                                                  
l.242 \excTable{TotalStructuralMeasures}

Hier ist das komplette MWE:

\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}

Ein visuelles Produkt zum besseren Verständnis:

Bildbeschreibung hier eingeben

verwandte Informationen