Preciso de uma tabela maior que uma página e que tenha um tamanho fixo. Para melhorar a aparência, uso booktabs. Porém, o pé da mesa não fica bonito em todas as páginas, exceto na última página. Aqui está meu 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}
Existe a possibilidade de detectar se uma linha será a última linha de uma página? Do que eu seria capaz de evitar a linha dupla. Como o seguinte pseudocódigo
is row last row of the page than \bottomrule else \midrule
Eu gostaria de ter apenas um \bottomrule
no final de cada página, mas sem linha dupla
Responder1
Solução A)Não tenho certeza se estou acompanhando a pergunta, mas não precisa \bottomrule
de nada, é uma regra simples onde você só pode definir uma largura dela. No meu exemplo, estou removendo-o e adicionando uma regra extra no final da tabela.
%! *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}
Editar, Solução B)Caso você realmente precise disso, estou usando esse truque como patch. Estou salvando informações sobre o número da página ( \label
) no final de cada linha e nas próximas execuções do TeX estou decidindo se devo compor \midrule
ou \bottomrule
(estou comparando a linha real e a seguinte - é uma situação prospectiva).
Caso queira ter \bottomrule
no final da sua mesa, por favor comente \mycounting
escrito antes da última linha.
%! *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}
Responder2
No seu exemplo, parece não haver sentido - tipograficamente falando - em ter regras "pesadas" (geradas por \toprule
e \bottomrule
) e regras "leves" (geradas por \midrule
). Portanto, sugiro que você use apenas uma largura de regra, digamos, \heavyrulewidth
, paratodas as regras. Veja como você pode implementar essa configuração:
\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}
Por outro lado, se você preferir que todas as regras tenham a espessura de \lightrulewidth
, você emitiria a instrução
\setlength\heavyrulewidth{\lightrulewidth}
Responder3
Isto resolve o problema movendo verticalmente um falso \bottomrule
(o \raisebox
conteúdo) para sobrepor qualquer resíduo \midrule
, evitando assim o aparecimento de uma regra dupla. Há, no entanto, um efeito colateral: uma linha extra de espaço vertical é ocupada por esta manipulação e, portanto, temos uma linha a menos para trabalhar por página. Para ver isso, comente \raisebox
e descomente o original \bottomrule
e você verá que a linha "X Y" se move do topo da página 2 para o final da página 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}
Responder4
Não é uma solução real:
\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}