ltablex und booktabs

ltablex und booktabs

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. Bildbeschreibung hier eingeben 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 \bottomruleam Ende jeder Seite haben, aber keine doppelte Zeile

Bildbeschreibung hier eingeben

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}

1

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 \midruleoder nicht \bottomrule(ich vergleiche die aktuelle und die folgende Zeile – es ist eine vorausschauende Situation).

\bottomruleFalls Sie das Geschriebene ganz am Ende Ihrer Tabelle haben möchten , kommentieren Sie es bitte \mycountingvor 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}

mwe 2

Antwort2

In Ihrem Beispiel scheint es – typografisch gesehen – wenig Sinn zu machen, sowohl „schwere“ Regeln (erzeugt durch \topruleund \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

\bottomruleDies behebt das Problem, indem ein Faux (der \raiseboxInhalt) vertikal nach oben verschoben wird, um alle Reste zu überlagern \midruleund 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 \raiseboxOriginal aus und entfernen Sie die Kommentarzeichen. \bottomruleSie 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}

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

verwandte Informationen