Necesito una tabla que tenga más de una página y que tenga un tamaño fijo. Para mejorar el aspecto, utilizo booktabs. Sin embargo, el pie de la mesa no es bonito en todas las páginas, excepto en la última. Aqui esta mi 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 la posibilidad de detectar si una fila será la última fila de una página? Entonces podría evitar la doble línea. Como el siguiente pseudocódigo
is row last row of the page than \bottomrule else \midrule
Me gustaría tener solo un \bottomrule
al final de cada página pero sin doble línea
Respuesta1
Solución A)No estoy seguro de seguir la pregunta, pero no es necesario \bottomrule
en absoluto, es una regla simple en la que solo puedes establecer un ancho. En mi ejemplo, lo elimino y agrego una regla adicional al final de la tabla.
%! *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, Solución B)En caso de que realmente lo necesites, estoy usando este truco como parche. Estoy guardando información sobre el número de página ( \label
) al final de cada fila y en las próximas ejecuciones de TeX estoy decidiendo si escribir \midrule
o \bottomrule
(estoy comparando la fila real y la siguiente; es una situación de anticipación).
En caso de que desee tenerlo \bottomrule
al final de su tabla, comente \mycounting
escrito antes de la última línea.
%! *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}
Respuesta2
En su ejemplo, parece tener poco sentido (tipográficamente hablando) tener reglas "pesadas" (generadas por \toprule
y \bottomrule
) y reglas "ligeras" (generadas por \midrule
). Por lo tanto, le sugiero que utilice sólo un ancho de regla, digamos, \heavyrulewidth
paratodas las reglas. Así es como podría implementar dicha configuración:
\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 el contrario, si prefiere que todas las reglas tengan el grosor de \lightrulewidth
, emitirá la instrucción
\setlength\heavyrulewidth{\lightrulewidth}
Respuesta3
Esto soluciona el problema moviendo verticalmente un faux \bottomrule
(el \raisebox
contenido) para superponer cualquier residual \midrule
, evitando así la apariencia de una regla doble. Sin embargo, hay un efecto secundario: esta manipulación ocupa una línea adicional de espacio vertical, por lo que uno tiene una fila menos para trabajar por página. Para ver esto, comente mi \raisebox
y descomente el original \bottomrule
y encontrará que la fila "X Y" se mueve desde la parte superior de la página 2 hasta la parte inferior de la 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}
Respuesta4
No es una solución 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}