对于一个项目,我创建了一个称为\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。