我需要一个大于一页的表格,并且它应该具有固定大小。为了改善外观,我使用了 booktabs。但是,除了最后一页之外,表脚在所有页面上都不好看。 这是我的 MWE
\documentclass{scrartcl}
\usepackage{booktabs}
\usepackage{ltablex}
\usepackage{blindtext}
\begin{document}
\begin{tabularx}{\linewidth}{XX}
left & right\\\toprule
\endhead
\bottomrule
\endfoot
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\
\end{tabularx}
\end{document}
是否有可能检测出某一行是否是页面上的最后一行?这样我就可以避免出现双线。如以下伪代码所示
is row last row of the page than \bottomrule else \midrule
我希望\bottomrule
每页末尾只有一个,但没有双线
答案1
解决方案A)我不确定我是否理解了这个问题,但你\bottomrule
根本不需要,这是一个简单的规则,你只能设置它的宽度。在我的例子中,我删除了它,并在表格的最末端添加了一条额外的规则。
%! *latex mal-ltablex-a.tex
\documentclass{scrartcl}
\usepackage{booktabs}
\usepackage{ltablex}
\usepackage{blindtext}
\begin{document}
\begin{tabularx}{\linewidth}{XX}
left & right\\\toprule
\endhead
%\bottomrule
\endfoot
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\*\midrule
\end{tabularx}
\end{document}
编辑,解决方案 B)\label
如果你真的需要,我会用这个技巧作为补丁。我在每行末尾保存有关页码 () 的信息,在下次运行 TeX 时,我会决定是否排版\midrule
或\bottomrule
(我正在比较实际行和下一行——这是一种前瞻性的情况)。
如果您希望将其放在\bottomrule
表格的最末尾,请注释掉\mycounting
最后一行之前的文字。
%! *latex mal-ltablex-b.tex
\documentclass{scrartcl}
\usepackage{booktabs}
\usepackage{ltablex}
\usepackage{blindtext}
\usepackage{refcount}
\let\oldmidrule=\midrule
\newcount\malic
\global\malic=0
\newcount\maltempa \maltempa=0
\newcount\maltempb \maltempb=0
\def\midrule{%
\mycounting
\ifnum\maltempa=\maltempb
\\*\oldmidrule
\else
\\*\bottomrule[6pt]
\fi
}%End of \midrule...
\def\mycounting{%
\global\advance\malic by 2%
\maltempb=\getpagerefnumber{mycounter-\the\malic}%
\global\advance\malic by -1%
\maltempa=\getpagerefnumber{mycounter-\the\malic}%
\typeout{\the\maltempa, \the\maltempb}
\label{mycounter-\the\malic}%
}% End of \mycounting...
\begin{document}
\begin{tabularx}{\linewidth}{XX}
left & right\\\toprule
\endhead
%\bottomrule
\endfoot
\blindtext & \blindtext \midrule
\blindtext & \blindtext \midrule
\blindtext & \blindtext \midrule
\blindtext & \blindtext \midrule
\blindtext & \blindtext \midrule
\blindtext & \blindtext \midrule
\blindtext & \blindtext \midrule
%\blindtext & \blindtext \midrule
\end{tabularx}
\mycounting % Comment out this line in case you would like to have \bottomrule at the very end of the table...
\end{document}
答案2
\toprule
在您的示例中,从印刷术角度来说,同时拥有“重”规则(由和生成\bottomrule
)和“轻”规则(由 生成)似乎没有什么意义\midrule
。因此,我建议您只使用一个规则宽度,例如,,\heavyrulewidth
用于所有规则。您可以按照以下方法实现此类设置:
\documentclass{scrartcl}
\usepackage{booktabs,ltablex,blindtext}
\setlength\lightrulewidth{\heavyrulewidth}
\begin{document}
\begin{tabularx}{\linewidth}{XX}
left & right\\ \toprule
\endhead
\bottomrule % use \bottomrule only on final page
\endlastfoot
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\
\end{tabularx}
\end{document}
相反,如果您希望所有规则的厚度为\lightrulewidth
,则可以发出指令
\setlength\heavyrulewidth{\lightrulewidth}
答案3
\bottomrule
通过将伪造的内容垂直向上移动\raisebox
以覆盖任何剩余的\midrule
,从而避免出现双重规则,从而解决了该问题。但是,有一个副作用:此操作会占用一行额外的垂直空间,因此每页要处理的行数会少。要查看此情况,请注释掉我的\raisebox
并取消注释原始行\bottomrule
,您将发现“X Y”行从第 2 页的顶部移动到第 1 页的底部。
\documentclass{scrartcl}
\usepackage{booktabs}
\usepackage{ltablex}
\usepackage{blindtext}
\begin{document}
\begin{tabularx}{\linewidth}{XX}
left & right\\\toprule
\endhead
\raisebox{9pt}{\smash{\makebox[.972\textwidth]{\rule{\textwidth}{1pt}}}}%
%\bottomrule
\endfoot
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\*\midrule
X & Y\\*\midrule
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\*\midrule
\blindtext & \blindtext\\
\end{tabularx}
\end{document}
答案4
不是一个真正的解决方案:
\documentclass{scrartcl}
\usepackage{booktabs}
\usepackage{ltablex,tabu}
\usepackage{blindtext}
\begin{document}
\begin{tabularx}{\linewidth}{XX}
left & right\\\midrule[\heavyrulewidth]
\endhead
\multicolumn{2}{@{}c@{}}{continues next page} \\*\bottomrule
\endfoot
\bottomrule
\endlastfoot
\blindtext & \blindtext\\\midrule
\blindtext & \blindtext\\\midrule
\blindtext & \blindtext\\
\end{tabularx}
\end{document}