我有一章包含许多部分,但它们的长度各不相同。我希望在前一节结束后立即出现新的部分(这很正常) - 除非 - 两个部分最终出现在同一页上。现在,如果两个部分出现在同一页上,我会手动添加 \newpage。有没有通用的方法可以做到这一点?我正在研究书籍类。
\documentclass[12pt]{book}
\begin{document}
\chapter{thefirstchapter}
\section{long section}
\section{long section}
\section{short section}
\newpage
\section{long section}
\section{short section}
\newpage
\section{long section}
\end{document}
答案1
以下方法使用 TeX 的\label
-\ref
系统来检查 是否\section
已出现在当前页面上。它通过创建/检查一个名为 的宏\section-on-page-<pnum>
(其中<pnum>
是要设置的部分的页面)来实现。如果此宏对于给定的 存在<pnum>
(通过 检查\ifcsname <csname>\endcsname
),则\section
已存在于该页面上<pnum>
并发出\newpage
。如果它不存在,它会\section
在之前设置 并(重新)创建\section-on-page-<pnum>
。
\documentclass{book}
\usepackage{lipsum,refcount}
\NewCommandCopy{\oldsection}{\section}
\RenewDocumentCommand{\section}{ s o m }{%
\label{before-section-\thesection}% Set \label for section
% Check if there is already a section on the current page by
% examining the existence of \section-on-page-<pnum>
\ifcsname section-on-page-\getpagerefnumber{before-section-\thesection}\endcsname
\newpage% Action if a section already exists
\fi
\IfBooleanTF{#1}
{\oldsection*{#3}}% \section*{..}
{\IfValueTF{#2}
{\oldsection[#2]{#3}}% \section[.]{..}
{\oldsection{#3}}% \section{..}
}%
\label{section-\thesection}% Set new label for section (could be on a following page)
% Update \section-on-page-<pnum>
\expandafter\xdef\csname section-on-page-\getpagerefnumber{section-\thesection}\endcsname{Section on page \getpagerefnumber{section-\thesection}}%
}
\begin{document}
\chapter{A chapter}
\section{Long section}\lipsum[1-10]
\section{Long section}\lipsum[1-10]
\section{Short section}\lipsum[1]
\section{Long section}\lipsum[1-10]
\section{Short section}\lipsum[1]
\section{Long section}\lipsum[1-10]
\end{document}
前:
后:
\ref
使用以下功能提取文章的页码:refcount
。
由于使用了\label
-\ref
系统,文档布局的更改可能需要多次运行。文档的构建以及 的条件发布\newpage
都是连续的。因此,\newpage
可以在整个文档中引起连锁反应。继续编译,直到所有引用都已解决。
答案2
基于此条目,我开始使用\clearpage{}
指令反而因为\newpage{}
前者不仅会开始新的一页,还会确保(仍然浮动的)对象(如旧部分的表格和图形)出现前进入新的部分。(否则,如果实验部分包含理论部分的表格,可能会分散读者的注意力,因为 LaTeX 的浮动算法假设“现在这里有足够的空间吗?”)
这样,新的部分将从新页面的顶部开始。
或者,您可以分割文档——每个部分都是自己的文件,最终以\include{file}
模式汇集到主文档中。