ltablex и booktabs

ltablex и booktabs

Мне нужна таблица, которая больше одной страницы и должна иметь фиксированный размер. Чтобы улучшить вид, я использую 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}

мвэ 1

Редактировать, Решение 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

решение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}

введите описание изображения здесь

Связанный контент