![Как распечатать промежуточные итоги на каждой странице длинной таблицы?](https://rvso.com/image/281478/%D0%9A%D0%B0%D0%BA%20%D1%80%D0%B0%D1%81%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B0%D1%82%D1%8C%20%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B8%D1%82%D0%BE%D0%B3%D0%B8%20%D0%BD%D0%B0%20%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B9%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B5%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%BD%D0%BE%D0%B9%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%3F.png)
В некоторых счетах-фактурах необходимо печатать большой список позиций. В этом случае, и в моей стране, счета-фактуры должны печатать промежуточный итог предыдущей страницы для каждой страницы разрыва и добавлять к последнему промежуточному итогу накопленную сумму каждой позиции, напечатанной на странице.
Например, представьте себе следующую таблицу, разбитую на две страницы.
\begin{longtable}{cc}
Item 1 & 100 \$ \\
Item 2 & 100 \$ \\
Item 3 & 100 \$ \\
Item 4 & 100 \$ \\
Item 5 & 100 \$ \\
\end{longtable}
В счете-фактуре на каждой странице должна быть указана промежуточная сумма до и сумма после:
Страница 1:
Item 1 & 100 \$ \\
Item 2 & 100 \$ \\
Item 3 & 100 \$ \\
Subtotal: 300 \$.
Страница 2:
Transport: 300 \$.
Item 4 & 100 \$ \\
Item 5 & 100 \$ \\
Transport + Subtotal: 500 \$.
Я попытался накопить сумму, используяфпв каждой строке таблицы, но это не работает. Выведите 0 для транспорта и транспорта + промежуточный итог.
Пример в ShareLatex с проблемой
Спасибо за любые идеи!
решение1
У этого метода есть несколько ограничений, но он пересчитывает нижний блок на каждой странице...
\documentclass{article}
\usepackage{longtable}
\usepackage[textheight=9\baselineskip]{geometry}
\newcount\zzz
\def\foo{}
\def\zz#1{#1%
\global\advance\zzz#1\relax
\marks1 {\the\zzz}%
}
\marks1{0}
\makeatletter
\def\LT@output{%
\ifnum\outputpenalty <-\@Mi
\ifnum\outputpenalty > -\LT@end@pen
\LT@err{floats and marginpars not allowed in a longtable}\@ehc
\else
\LT@bchunk
page total: &
\edef\tmp{\topmarks1 }%
\the\numexpr\botmarks1 \ifx\tmp\@empty\else - \topmarks1 \fi\relax\\
total:&\botmarks1
\LT@echunk
\setbox\LT@foot\box\z@
\LT@get@widths
\setbox\z@\vbox{\unvbox\@cclv}%
\ifdim \ht\LT@lastfoot>\ht\LT@foot
\dimen@\pagegoal
\advance\dimen@-\ht\LT@lastfoot
\ifdim\dimen@<\ht\z@
\setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
\@makecol
\@outputpage
\setbox\z@\vbox{\box\LT@head}%
\fi
\fi
\global\@colroom\@colht
\global\vsize\@colht
%\vbox
{\unvbox\z@\nobreak\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
\fi
\else
\global\advance\c@LT@chunks\@M
\LT@bchunk
\edef\tmp{\topmarks1 }%
page total: &
\edef\tmp{\topmarks1 }%
\the\numexpr\botmarks1 \ifx\tmp\@empty\else - \topmarks1 \fi\relax\\
running total:&\botmarks1
\LT@echunk
\setbox\LT@foot\box\z@
\LT@get@widths
\global\advance\c@LT@chunks-\@M
\setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
\@makecol
\@outputpage
\global\vsize\@colroom
\copy\LT@head\nobreak
\fi}
\makeatother
\begin{document}
\begin{longtable}{l|l}
xxxxxx&yyyyyy\\
xxxxzzzzzzzzzzzzzxx&yyyyyyy\endfoot% not typeste but needs to be bigger than the foot that is used.
a & \zz{1}\\
b & \zz{2}\\
c & \zz{5}\\
d & \zz{7}\\
e & \zz{1}\\
f & \zz{9}\\
g & \zz{2}\\
h & \zz{3}\\
i & \zz{1}\\
j & \zz{6}\\
k & \zz{8}\\
l & \zz{3}\\
m & \zz{2}\\
n & \zz{1}\\
o & \zz{4}\\
p & \zz{8}\\
q & \zz{3}
\end{longtable}
\end{document}
решение2
Продолжая то, что предоставил Дэвид Карлайл, вот тот же пример, но со вторым столбцом, использующим числа с плавающей точкой (для этого я использовал длины):
\documentclass{article}
\usepackage{longtable}
\usepackage[textheight=9\baselineskip]{geometry}
\newcount\zzz
\def\foo{}
\def\zz#1{#1%
\global\advance\zzz#1\relax
\marks1 {\the\zzz}%
}
\marks1{0}
\newlength\yyy
\setlength{\yyy}{0pt}
\def\yy#1{#1
\global\addtolength{\yyy}{#1pt}\relax
\marks2 {\the\yyy}
}
\marks2{0}
\makeatletter
\def\LT@output{%
\global\advance\c@LT@chunks\@M
\LT@bchunk
\edef\tmp{\topmarks1 }%
page total: &
\edef\tmp{\topmarks1 }%
\the\numexpr\botmarks1 \ifx\tmp\@empty\else - \topmarks1 \fi\relax&
\edef\tmp{\topmarks2 }%
\strip@pt\dimexpr\botmarks2 \ifx\tmp\@empty\else - \topmarks2 \fi\relax\\
running total:&\botmarks1&\strip@pt\dimexpr\botmarks2
\LT@echunk
\setbox\LT@foot\box\z@
\LT@get@widths
\global\advance\c@LT@chunks-\@M
\setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
\@makecol
\@outputpage
\global\vsize\@colroom
\copy\LT@head\nobreak
}
\makeatother
\begin{document}
\begin{longtable}{l|l|l}
xxxxxx&yyyyyy&yyyyyy\\
xxxxzzzzzzzzzzzzzxx&yyyyyyy&yyyyyy\endfoot% not typeste but needs to be bigger than the foot that is used.
a & \zz{1} & \yy{5.3}\\
b & \zz{2} & \yy{6}\\
c & \zz{5} & \yy{7.1}\\
d & \zz{7} & \yy{4.5}\\
e & \zz{1} & \yy{9.15}\\
f & \zz{9} & \yy{15}\\
g & \zz{2} & \yy{2}\\
h & \zz{3} & \yy{8}\\
i & \zz{1} & \yy{1}\\
j & \zz{6} & \yy{6}\\
k & \zz{8} & \yy{8}\\
l & \zz{3} & \yy{3.2}\\
m & \zz{2} & \yy{2.67}\\
n & \zz{1} & \yy{1.1}\\
o & \zz{4} & \yy{4}\\
p & \zz{8} & \yy{8.05}\\
q & \zz{3} & \yy{3}
\end{longtable}
\end{document}