ltablex 和 booktabs

ltablex 和 booktabs

我需要一个大于一页的表格,并且它应该具有固定大小。为了改善外观,我使用了 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}

1

编辑,解决方案 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

答案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}

在此处输入图片描述

相关内容