Das Folgende implementiert eine Summierung über eine Spalte (auch über mehrere Spalten innerhalb einer Tabelle ist möglich). Es gibt folgende Macros:
- `\columnsum` erwartet 2 Argumente, einen Variablennamen und eine Spaltendeklaration, Verwendung in der Tabellenpreambel
- `\colsumstart` erwartet 1 Argument, nämlich denjenigen Aufruf, ab dem die Summierung beginnen soll (unabhängig von der Spalte), außerdem setzt es den Zähler, der die Aufrufe zählt, zurück auf 0. Das ist ein wenig umständlicher in der Benutzung als eine Tabellenzeile, allerdings in der Programmierung deutlich einfacher.
- `\colsumexcept` expandiert zu nichts und fungiert als Markierung, dass diese Zelle nicht zur Summe hinzugefügt werden soll
- `\colsumvar` erwartet ein optionales und ein notwendiges Argument und gibt den Wert einer der Variablen aus. Das Optionale kann verwendet werden, um die Summe zu runden, das Notwendige ist der Variablenname, der ausgegeben werden soll.
- `\colsumvarset` erwartet 2 Argumente. Es kann verwendet werden, um den Wert einer Variable zu setzen, sollte die Variable noch nicht definiert sein, wird eine neue angelegt.
Die Variablen werden global gesetzt. `\colsumvar` ist vollständig expandierbar.
\documentclass{article}
\usepackage[]{longtable}
\usepackage[left=2.00cm, right=2.00cm, top=2.00cm, bottom=2.00cm,includeheadfoot]{geometry}
\usepackage{array}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
\usepackage{collcell}
\usepackage{xparse}
\ExplSyntaxOn
\int_new:N \g__colsum_call_int
\int_new:N \g__colsum_start_int
\newcolumntype\columnsum[2]
{
>{ \__colsum_set_name:n { #1 } \collectcell \__colsum_calc:n }
#2
<{ \endcollectcell }
}
\cs_new_protected:Npn \__colsum_set_name:n #1
{
\tl_set:Nn \l__colsum_name_tl { g__colsum_var_#1_fp }
\fp_if_exist:cF { \l__colsum_name_tl }
{
\fp_new:c { \l__colsum_name_tl }
}
}
\cs_new_protected:Npn \__colsum_calc:n #1
{
#1
\int_gincr:N \g__colsum_call_int
\tl_if_in:nnF { #1 } { \colsumexcept }
{
\tl_if_blank:nF { #1 }
{
\int_compare:nNnT { \g__colsum_call_int } > { \g__colsum_start_int }
{
\fp_gset:cn { \l__colsum_name_tl }
{ \fp_use:c { \l__colsum_name_tl } + #1 }
}
}
}
}
\NewDocumentCommand \colsumstart { m }
{
\int_gset:Nn \g__colsum_start_int { #1 }
\int_gzero:N \g__colsum_call_int
}
\NewExpandableDocumentCommand \colsumvar { o m }
{
\IfNoValueTF { #1 }
{ \fp_use:c { g__colsum_var_#2_fp } }
{ \fp_eval:n { round ( \fp_use:c { g__colsum_var_#2_fp } , #1 ) } }
}
\NewDocumentCommand \colsumvarset { m m }
{
\fp_if_exist:cF { g__colsum_var_#1_fp }
{ \fp_new:c { g__colsum_var_#1_fp } }
\fp_gset:cn { g__colsum_var_#1_fp } { #2 }
}
\cs_set:Npn \colsumexcept {}
\ExplSyntaxOff
\begin{document}
% we don't really know the row, but only the call at which we want to start. As
% it isn't called in a \multicolumn, we have to care for that
\colsumstart{4}
\begin{longtable}{|L{6cm}|\columnsum{M}{C{2cm}}|C{2cm}|C{1.4cm}|C{1.4cm}|\columnsum{Izz}{C{1.4cm}}|}
\caption{M}
\label{tab:mList} \\
\hline
\multicolumn{1}{|l|}{} & \multicolumn{1}{c|}{} & \multicolumn{1}{c|}{} & \multicolumn{3}{c|}
{\textbf{Trägheitsmomente}}\\
\textbf{Body} & \textbf{Masse} [kg] & \textbf{Typ} & \textbf{Ixx} [kgm$^2$] & \textbf{Iyy} [kg*m$^2$] & \textbf{Izz} [kg*m$^2$] \\
\hline
\noalign{\vskip 0.08cm}
\hline
\endfirsthead
\multicolumn{6}{c}
{\tablename\ \thetable.\ -- \textbf{z} - Fortsetzung} \\
\hline
\multicolumn{1}{|l|}{} & \multicolumn{1}{c|}{} & \multicolumn{1}{c|}{} & \multicolumn{3}{c|}{t}\\
\textbf{Body} & \textbf{Masse} [kg] & \textbf{Typ} & \textbf{Ixx} [kgm$^2$] & \textbf{Iyy} [kgm$^2$] & \textbf{Izz} [kgm$^2$] \\
\hline
\noalign{\vskip 0.08cm}
\hline
\endhead
\multicolumn{6}{c}{Tabelle wird fortgesetzt}
\endfoot
\endlastfoot
\$S\_Wk1.\$ & 15601 & 0 & 34322 & 592838 & 592838\\
\hline
\$S\_Wk1.\$ & 1 & 0 & 1 & 1 & 1\\
\hline
\$S\_Wk1.\$B & 1 & 0 & 1 & 1 & 1\\
\hline
\$S\_1T.\$B\_Wks1 & 0 & 0 & 1 & 1 & 1\\
\hline
\$S\_1T.\$B\_ & 52 & 0 & 0.6 & 1.1 & 0.8\\
\hline
\$S\_1T.\$B\_2 & 52 & 0 & 0.6 & 1.1 & 0.8\\
\hline
\textbf{Ergebnis Summe von Masse} &
% \colsumexcept tells it to not use this cell in the sum.
\colsumexcept\colsumvar{M} & & & &
\colsumexcept\colsumvar{Izz}
\\
\hline
\end{longtable}
\end{document}
Ergebnis:
[![alt text][1]][1]
[1]: https://texwelt.de/wissen/upfiles/columnsum.png