![longtabu:将一些列的累计总数放在每页的标题下](https://linux22.com/image/289032/longtabu%EF%BC%9A%E5%B0%86%E4%B8%80%E4%BA%9B%E5%88%97%E7%9A%84%E7%B4%AF%E8%AE%A1%E6%80%BB%E6%95%B0%E6%94%BE%E5%9C%A8%E6%AF%8F%E9%A1%B5%E7%9A%84%E6%A0%87%E9%A2%98%E4%B8%8B.png)
因此,我有一个跨多页的 longtabu 表。该表有一个标题,需要在每一页上重复。有些列是数值金额,我想在每页的顶部,就在标题下方放置一行来显示累计总数。
因此,我从这里发现的内容开始: 如何在长表的每一页上打印小计? 并稍微修改了代码以便能够对浮点数求和(修改是该问题的答案之一)。
现在,我弄清楚了如何将累计总数移到页面的页眉而不是页脚。不过,正如我所说,我还需要在累计总数之前在每个页面上显示原始页眉。但是,当我排版您可以在下面找到的 MWE 时,我在生成的 PDF 中看到两个问题:
- 累计总数行对齐不正确
- 在表格结束后,我得到了一个只有标题和(对齐不佳的)累计总数的附加页,这是不可取的。
我理解(我认为!)第二个问题的原因,但找不到解决方案(这可能超出了我对 longtabu 内部结构的理解)。至于第一个问题,我无法弄清楚。
事不宜迟,下面是 MWE:
\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 }
\copy\LT@head\\
running total: & \ifx\tmp\@empty\else \botmarks1 \fi& \ifx\tmp\@empty\else \strip@pt\dimexpr\botmarks2 \fi
\LT@echunk
\setbox\LT@head\box\z@
\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}
Var&Val1&Val2 \endhead
xxxxxxxx&yyyyyyy&yyyyyy\\
xxxxzzzzzzzzzzzzzxx&yyyyyyy&yyyyyy\endfoot% not typeset but needs to be bigger than the foot that is used.
&&\endlastfoot
a & \zz{1} & \yy{0}\\
b & \zz{2} & \yy{0}\\
c & \zz{5} & \yy{0}\\
d & \zz{7} & \yy{0}\\
e & \zz{1} & \yy{0}\\
f & \zz{9} & \yy{0}\\
g & \zz{2} & \yy{0}\\
h & \zz{3} & \yy{0}\\
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}
以下是结果的截图:
提前感谢可能提供的任何帮助。问候!
答案1
好的,实际上我找到了答案。如果你看看我开始的问题(上面提供的链接),你会发现 D. Carlisle 提供了一个更完整的示例。我删除了 if 的整个第一部分,它基本上处理表格的结尾。将其放回(并调整它)解决了问题 2。:) 至于问题 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}
\newlength\yyy
\setlength{\yyy}{0pt}
\def\yy#1{#1
\global\addtolength{\yyy}{#1pt}\relax
\marks2 {\the\yyy}
}
\marks2{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
Var&Val1&Val2 \\
running total: & \ifx\tmp\@empty\else \botmarks1 \fi& \ifx\tmp\@empty\else \strip@pt\dimexpr\botmarks2 \fi
\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 }
Var&Val1&Val2 \\
running total: & \ifx\tmp\@empty\else \botmarks1 \fi& \ifx\tmp\@empty\else \strip@pt\dimexpr\botmarks2 \fi
\LT@echunk
\setbox\LT@head\box\z@
\setbox\LT@foot\box\z@
\setbox\LT@lastfoot\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|l}
Var&Val1&Val2 \endhead
xxxxzzzzzzzzzzzzzxx&yyyyyyy&yyyyyy\endfoot% not typeset but needs to be bigger than the foot that is used.
a & b & c \endlastfoot
a & \zz{1} & \yy{0}\\
b & \zz{2} & \yy{0}\\
c & \zz{5} & \yy{0}\\
d & \zz{7} & \yy{0}\\
e & \zz{1} & \yy{0}\\
f & \zz{9} & \yy{0}\\
g & \zz{2} & \yy{0}\\
h & \zz{3} & \yy{0}\\
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}