我正在为一本书生成 LaTeX 代码,这本书有许多(超过 200 个)小节,每个小节由两个长表组成。我不想在每个小节之前强制分页,因为这样会在非常短的小节后留下大量浪费的空白。搜索了以前的帖子后,我使用 \needspace 作为推荐,仅在剩余空间有限时插入分页符。这在大多数情况下都可以正常工作,但有时会产生虚假的长表标题,如以下 MWE 所示,其中小节标题“0.1.2 Subsec2”前面是紧随长表之后的孤立标题“Row DataC”。
删除 \needspace(通过在 \mysubsec 命令定义中将其注释掉)似乎可以删除虚假标题(尽管有时尽管该命令末尾有 \nopagebreak,但仍会留下孤立的子部分标题)。有没有解决方案可以避免 \needspace 触发这些虚假的长表标题?或者有其他方法可以定义以页面上的剩余空间为条件的分页符?
\documentclass[a5paper]{book}
\usepackage[pass]{geometry}
\geometry{a5paper}
\usepackage{longtable}
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{needspace}
\newcommand{\mysubsec}[1]{%
\needspace{6\baselineskip}
\subsection{#1}%
\label{#1}%
\nopagebreak
}
\newenvironment{mytab}[2]
{\begin{longtable}[l]{r*{#2}c}
\toprule
Row & \multicolumn{#2}{c}{Data#1} \\
\midrule
\endhead
}
{\end{longtable}}
\newcommand{\myrow}[1]{
\multirow[t]{2}{*}{#1} & a & b & c \\
& d & e & f \\
}
\begin{document}
\raggedbottom
\mainmatter
Title \clearpage
\section{Sec1}
\mysubsec{Subsec1}
\begin{mytab}{A}{3}
\myrow{1}\midrule
\myrow{2}\bottomrule
\end{mytab}
\begin{mytab}{B}{3}
\myrow{1}\midrule
\myrow{2}\midrule
\myrow{3}\bottomrule
\end{mytab}
\mysubsec{Subsec2}
\begin{mytab}{C}{3}
\myrow{1}\midrule
\myrow{2}\midrule
\myrow{3}\bottomrule
\end{mytab}
\begin{mytab}{D}{3}
\myrow{1}\midrule
\myrow{2}\midrule
\myrow{3}\bottomrule
\end{mytab}
\clearpage
\mysubsec{Subsec3}
\begin{mytab}{E}{3}
\myrow{1}\bottomrule
\end{mytab}
\begin{mytab}{F}{3}
\myrow{1}\bottomrule
\end{mytab}
\mysubsec{Subsec4}
\begin{mytab}{G}{3}
\myrow{1}\bottomrule
\end{mytab}
\begin{mytab}{H}{3}
\myrow{1}\bottomrule
\end{mytab}
\mysubsec{Subsec5}
\begin{mytab}{I}{3}
\myrow{1}\midrule
\myrow{2}\bottomrule
\end{mytab}
\begin{mytab}{J}{3}
\myrow{1}\midrule
\myrow{2}\bottomrule
\end{mytab}
\end{document}
答案1
感谢你们的反馈和建议。我根据这些进行了测试,我的发现总结如下:
在里面较旧TeX Live 2019.20200218-1:
- longtable.sty 是 2020/01/07 v4.13
\needspace
导致虚假的长表头\Needspace
避免虚假的长表头没有创建孤立子部分标题“0.1.2 Subsec2”- 孤立子部分标题“0.1.5 Subsec5”做发生如果
\Needspace
被注释掉
在里面更新TeX Live 2021.20220204-1:
longtable.sty 是 2021-09-01 v4.17
\needspace
并\Needspace
避免虚假的长表头但他们创建了孤立的子节标题“0.1.2 Subsec2”(需要空间长度6\baselineskip
)\[Nn]eedspace
注释掉后不会出现孤立的小节标题
因此,目前的解决方案是使用\Needspace
旧版本,因为这可以修复虚假的长表标题,而不会创建新版本中出现的孤立小节标题。