命令和以下段落之间没有分页符

命令和以下段落之间没有分页符

对于一个项目,我创建了一个称为\numsubpara使用独立计数器的分段级别。

不幸的是,我经常遇到这种情况:

在此处输入图片描述

我希望尽可能避免这种分页符。在这种情况下,我希望我的标题位于下一页。

我知道这个功能与通常的等命令一起存在\section\subsection但在这种情况下,我无法使用这些命令,我​​必须坚持使用自己的命令。

我正在创建的文档很长,它必须是自动的,即我无法手动添加\pagebreak单独的\numsubpara命令。

有人知道怎么做吗?提前谢谢您!

这是我的 MWE:

\documentclass[12pt,twoside]{book}
\usepackage[paperheight=240mm,paperwidth=160mm, left=22mm, right = 20mm, top = 20mm, bottom = 22mm]{geometry}

\usepackage[cam,width=17.5truecm,height=25.54truecm,center,dvips,noinfo]{crop}
\usepackage[french]{babel}


\usepackage{fontspec}
\usepackage{lipsum}
\usepackage{titlesec}

%\usepackage{needspace}
%\newcounter{subpara}
%\setcounter{subpara}{0}
%\newcommand\numsubpara[1]%
   %{\vspace{3.36mm}\par\refstepcounter{subpara}%
   %\needspace{2em}%
   %\fontsize{10}{12}\selectfont\textbf{\thesubpara.}\fontsize{12}{12}\selectfont%
   %\space\textbf{#1}\space\vspace{2.8mm}\\%
   %\fontsize{12}{12}\selectfont\nobreak%
%}


\newcounter{subpara}
\setcounter{subpara}{0}
\newcommand\numsubpara[1]%
   {\vspace{3.36mm}\par\refstepcounter{subpara}%
   \fontsize{10}{12}\selectfont\textbf{\thesubpara.}\fontsize{12}{12}\selectfont%
   \space\textbf{#1}\space\vspace{2.8mm}\\%
   \fontsize{12}{12}\selectfont\nobreak%
}


\newcommand{\nocontentsline}[3]{}
\newcommand{\tocless}[2]{\bgroup\let\addcontentsline=\nocontentsline#1{#2}\egroup}
\newcommand{\hnumsubpara}{\tocless\numsubpara}


\begin{document}

\chapter{Test}
\section{Test}
\hnumsubpara{Test}
\lipsum[1]


\hnumsubpara{My command\footnote{\lipsum[1]}}
\lipsum[1]



\tableofcontents

\end{document}

答案1

我建议使用该titlesec软件包。此外,我建议不要使用vspace或硬编码字体值,但我不是\LaTeX专家,您可能有这样做的理由。我更改了您的自定义段落,但看起来完全一样。

您可以使用以下内容:

\documentclass[12pt,twoside]{book}
\usepackage[paperheight=240mm,paperwidth=160mm, left=22mm, right = 20mm, top = 20mm, bottom = 22mm]{geometry}

\usepackage[cam,width=17.5truecm,height=25.54truecm,center,dvips,noinfo]{crop}
\usepackage[french]{babel}


\usepackage{fontspec}

\usepackage{lipsum}

\usepackage{titlesec}

\titleclass{\numsubpara}{straight}[\chapter]
\newcounter{numsubpara}

\titleformat{\numsubpara}{}{}{0em}{\bfseries{\footnotesize\thenumsubpara.}\space}
\titlespacing*{\numsubpara}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}

\begin{document}

    \numsubpara{Test}
    Test

    Test

    Test

    Test

    Test

    Test

    Test

    Test

    Test

    Test

    Test
    \lipsum[1-2]



    \numsubpara{My command}

    \lipsum[1]

\end{document}

答案2

你的例子有几个错误。对 TeX 模式存在误解。TeX 中垂直和水平模式的交替属于 TeX 的基本原理。

\newcommand\numsubpara[1]%
   {\vspace{3.36mm}\par\refstepcounter{subpara}%
   \fontsize{10}{12}\selectfont\textbf{\thesubpara.}\fontsize{12}{12}\selectfont%
   \space\textbf{#1}\space\vspace{2.8mm}\\%
   \fontsize{12}{12}\selectfont\nobreak%
}

第一个\vspace取决于你在使用 之前是否有空行\numsubpara。如果有,那么你处于垂直模式,\vsapce其行为类似于\vskip。如果没有,那么你处于水平模式,\vspace其行为类似于\vsadjust{\vskip...}水平模式。下面\par关闭水平模式,因此视觉效果是一样的。但为什么这里会有这种复杂情况?接下来,你将通过 明确切换到较小的字体,\fontsize并通过 明确返回当前大小\fontsize。这不是一个好的做法,我们有 TeX 组来完成这项任务,并且在这样的组内只使用一个字体开关。主要问题是标题在水平模式下{...}跟着(它的行为类似于,然后是 ,它的行为类似于但是\vspace\vadjust{\vskip}\\\hfil\break它不会关闭水平模式\fonsize此处无关紧要,\nobreak并且水平模式。你没有调\nobreak成垂直模式。这是你的主要问题。

您的任务的良好做法如下:

\newcount\subparanum
\def\numsubpara#1{%
   \par                  % closes previous horizontal mode ebentualy
   \vskip 3.36cm \relax  % puts vertical space
   \global\advance\subparanum by1 % increments number of \numsubpara
   \indent               % opens horizontal mode
   \llap{\fontsize... \the\subparanum. }%  % prints number in smaller font in the TeX group and in llaped \hbox
   {\bf #1\par}          % prints the title and closes horizontal mode
   \nobreak              % this is in vertical mode, following space is protected
   \vskip 2.8mm \relax   % desired space, page break cannot be here
 }

请注意,空格位于\llap点后,因此每个标题的左边界都在\indent水平位置。空格通常可拉伸和收缩,但\llap框内的空间是恒定的。

如果不详细了解 TeX 中的垂直/水平模式和框原则,几乎不可能为标题创建良好的宏。最后注意:垂直空间通常是根据基线网格设计的,而不是以毫米为单位的偶然尺寸。

答案3

要解决这个问题,您可以使用该needspace包。它会检查您是否有足够的空间,如果空间不足,则添加分页命令以将标题与其余文本保持一致。

因此你的 MWE 将成为:

\documentclass[12pt,twoside]{book}
\usepackage[paperheight=240mm,paperwidth=160mm, left=22mm, right = 20mm, top = 20mm, bottom = 22mm]{geometry}

\usepackage[cam,width=17.5truecm,height=25.54truecm,center,dvips,noinfo]{crop}
\usepackage[french]{babel}


\usepackage{fontspec}

\usepackage{lipsum}
\usepackage{needspace}


\newcounter{subpara}
\setcounter{subpara}{0}
\newcommand\numsubpara[1]%
   {\vspace{3.36mm}\par\refstepcounter{subpara}%
   \needspace{6em}%
   \fontsize{10}{12}\selectfont\textbf{\thesubpara.}\fontsize{12}{12}\selectfont%
   \space\textbf{#1}\space\vspace{2.8mm}\\%
   \fontsize{12}{12}\selectfont\nobreak%
}

\begin{document}

\numsubpara{Test}

Test


Test


Test

Test

Test

\lipsum[1-3]



\numsubpara{My command}

\lipsum[1]

\end{document}

我HTH。

相关内容