ltablex e booktabs

ltablex e booktabs

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. insira a descrição da imagem aqui 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 \bottomruleno final de cada página, mas sem linha dupla

insira a descrição da imagem aqui

Responder1

Solução A)Não tenho certeza se estou acompanhando a pergunta, mas não precisa \bottomrulede 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}

sim 1

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 \midruleou \bottomrule(estou comparando a linha real e a seguinte - é uma situação prospectiva).

Caso queira ter \bottomruleno final da sua mesa, por favor comente \mycountingescrito 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}

eu 2

Responder2

No seu exemplo, parece não haver sentido - tipograficamente falando - em ter regras "pesadas" (geradas por \toprulee \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 \raiseboxconteú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 \raiseboxe descomente o original \bottomrulee 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}

insira a descrição da imagem aqui

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}

insira a descrição da imagem aqui

informação relacionada