Ich brauche eine Tabelle, die größer als eine Seite ist und eine feste Größe haben sollte. Um das Aussehen zu verbessern, verwende ich Booktabs. Allerdings ist der Fuß der Tabelle nicht auf allen Seiten schön, außer auf der letzten Seite. Hier ist mein 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}
Gibt es eine Möglichkeit zu erkennen, ob eine Zeile die letzte Zeile auf einer Seite ist? Dann könnte ich die doppelte Zeile vermeiden. Wie der folgende Pseudocode
is row last row of the page than \bottomrule else \midrule
Ich möchte nur ein \bottomrule
am Ende jeder Seite haben, aber keine doppelte Zeile
Antwort1
Lösung A)Ich bin nicht sicher, ob ich die Frage richtig verstehe, aber Sie brauchen das \bottomrule
überhaupt nicht, es ist eine einfache Regel, bei der Sie nur die Breite festlegen können. In meinem Beispiel entferne ich sie und füge eine zusätzliche Regel ganz am Ende der Tabelle hinzu.
%! *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}
Bearbeiten, Lösung B)Falls Sie das wirklich brauchen, verwende ich diesen Trick als Patch. Ich speichere Informationen über die Seitenzahl ( \label
) am Ende jeder Zeile und entscheide bei den nächsten Durchläufen von TeX, ob gesetzt werden soll \midrule
oder nicht \bottomrule
(ich vergleiche die aktuelle und die folgende Zeile – es ist eine vorausschauende Situation).
\bottomrule
Falls Sie das Geschriebene ganz am Ende Ihrer Tabelle haben möchten , kommentieren Sie es bitte \mycounting
vor der letzten Zeile aus.
%! *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}
Antwort2
In Ihrem Beispiel scheint es – typografisch gesehen – wenig Sinn zu machen, sowohl „schwere“ Regeln (erzeugt durch \toprule
und \bottomrule
) als auch „leichte“ Regeln (erzeugt durch \midrule
) zu haben. Ich schlage daher vor, dass Sie nur eine Regelbreite verwenden, z. B. \heavyrulewidth
, füralle RegelnSo könnten Sie ein solches Setup implementieren:
\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}
Wenn Sie umgekehrt möchten, dass alle Regeln die Dicke von haben \lightrulewidth
, geben Sie die Anweisung
\setlength\heavyrulewidth{\lightrulewidth}
Antwort3
\bottomrule
Dies behebt das Problem, indem ein Faux (der \raisebox
Inhalt) vertikal nach oben verschoben wird, um alle Reste zu überlagern \midrule
und so den Anschein einer doppelten Regel zu vermeiden. Es gibt jedoch einen Nebeneffekt: Durch diese Manipulation wird eine zusätzliche Zeile vertikalen Raums beansprucht, sodass man pro Seite eine Zeile weniger zum Arbeiten hat. Um dies zu sehen, kommentieren Sie mein \raisebox
Original aus und entfernen Sie die Kommentarzeichen. \bottomrule
Sie werden feststellen, dass die Zeile „X Y“ vom oberen Rand von Seite 2 zum unteren Rand von Seite 1 verschoben wird.
\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}
Antwort4
Keine wirkliche Lösung:
\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}