Мне нужна таблица, которая больше одной страницы и должна иметь фиксированный размер. Чтобы улучшить вид, я использую booktabs. Однако, основание таблицы не очень красиво на всех страницах, кроме последней. Вот мой 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}
Есть ли возможность определить, будет ли строка последней на странице? Тогда я смогу избежать двойной линии. Как в следующем псевдокоде
is row last row of the page than \bottomrule else \midrule
Я хотел бы иметь только \bottomrule
в конце каждой страницы, но не двойную линию.
решение1
Решение А)Я не уверен, что я понял вопрос, но вам это \bottomrule
совсем не нужно, это простое правило, где вы можете задать только его ширину. В моем примере я удаляю его и добавляю одно дополнительное правило в самом конце таблицы.
%! *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}
Редактировать, Решение B)Если вам это действительно нужно, я использую этот трюк как патч. Я сохраняю информацию о номере страницы ( \label
) в конце каждой строки и в следующих запусках TeX я решаю, верстать или нет \midrule
( \bottomrule
я сравниваю фактическую и следующую строку — это ситуация наперед).
Если вы хотите, чтобы \bottomrule
в самом конце таблицы было написано, пожалуйста, прокомментируйте \mycounting
это перед последней строкой.
%! *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}
решение2
В вашем примере, кажется, нет особого смысла — с точки зрения типографики — иметь как «тяжелые» правила (сгенерированные \toprule
и \bottomrule
), так и «легкие» правила (сгенерированные \midrule
). Поэтому я предлагаю вам использовать только одну ширину правила, скажем, \heavyrulewidth
, длявсе правила. Вот как можно реализовать такую настройку:
\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}
И наоборот, если вы предпочитаете, чтобы все правила имели толщину \lightrulewidth
, вы должны дать команду
\setlength\heavyrulewidth{\lightrulewidth}
решение3
Это решает проблему, перемещая вверх по вертикали фальшивку \bottomrule
( \raisebox
содержимое) для наложения любого остатка \midrule
, таким образом избегая появления двойной линии. Однако есть побочный эффект: эта манипуляция занимает дополнительную строку вертикального пространства, и поэтому на странице остается на одну строку меньше. Чтобы увидеть это, закомментируйте my \raisebox
и раскомментируйте оригинал \bottomrule
, и вы увидите, что строка "X Y" переместилась с верха страницы 2 в низ страницы 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}
решение4
Не настоящее решение:
\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}