longtabu:将一些列的累计总数放在每页的标题下

longtabu:将一些列的累计总数放在每页的标题下

因此,我有一个跨多页的 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}

相关内容