在长表中,通常可以\pagebreak
在行前插入 。但是,如果该行以使用\noalign
(like\multicolumn
或\rowcolor
)的命令开头\pagebreak
,则会导致“放错 \noalign”错误。
我尝试\\
在之后插入一个\pagebreak
但是会插入一个不需要的空行。
我尝试通过插入负空间来摆脱空行,\pagebreak\\[-\baselineskip]
但\baselineskip
似乎是 0pt。
在我的帮助下,\showthe\baselineskip
我发现\pagebreak\\[-\arraystretch\dimexpr12pt\relax]
只要没有人改变字体大小,这就可以实现我想要的效果。
如何在不硬编码 12pt 的情况\pagebreak
下在 a 前面正确插入 a?\multicolumn
\documentclass{article}
\usepackage{ltablex}
\usepackage[table]{xcolor}
\newcolumntype{L}{>{\raggedright\arraybackslash}X}
\colorlet{sectionbg}{gray!20}
\renewcommand{\arraystretch}{1.5}
\newcommand{\eol}{\\\hline}
\renewcommand{\section}[1]{\rowcolor{sectionbg}\multicolumn2{|l|}{#1}\eol}
\keepXColumns
%TODO: how do I avoid hardcoding the 12pt?
\newcommand{\ltpagebreak}{\pagebreak\\[-\arraystretch\dimexpr12pt\relax]}
\begin{document}
\begin{tabularx}{.5\linewidth}{|lL|}
\hline\endhead
\section{Section~1}
1 & Line A \eol
2 & Line B \eol
3 & Line C \eol
\ltpagebreak
\section{Section~2}
4 & Line D \eol
5 & Line E \eol
6 & Line F \eol
\section{Section~3}
7 & Line G \eol
8 & Line H \eol
9 & Line I \eol
\end{tabularx}
\end{document}
答案1
tabularx 编译两次表格,第一次进行一些测量,这不像分页符。您可以使用以下测试避免这种情况(这有点 hacky,但 tabularx 缺少更好的测试条件。
关于 baselineskip:在表格中,您可以使用 访问它\normalbaselineskip
。并考虑直接使用 xltabular 而不是 ltablex。xltabular 得到维护。
\documentclass{article}
\usepackage{ltablex}
\usepackage[table]{xcolor}
\newcolumntype{L}{>{\raggedright\arraybackslash}X}
\colorlet{sectionbg}{gray!20}
\renewcommand{\arraystretch}{1.5}
\newcommand{\eol}{\\\hline}
\renewcommand{\section}[1]{\rowcolor{sectionbg}\multicolumn2{|l|}{#1}\eol}
\keepXColumns
%TODO: how do I avoid hardcoding the 12pt?
\let\jakunTXtest\write
\newcommand{\ltpagebreak}{\ifx\jakunTXtest\write \pagebreak\fi}
\begin{document}
\begin{tabularx}{.5\linewidth}{|lL|}
\hline\endhead
\section{Section~1}
1 & Line A \eol
2 & Line B \eol
3 & Line C \eol
\ltpagebreak
\section{Section~2}
4 & Line D \eol
5 & Line E \eol
6 & Line F \eol
\section{Section~3}
7 & Line G \eol
8 & Line H \eol
9 & Line I \eol
\end{tabularx}
\end{document}