如果某些垂直内容出现在分页符旁边,我可以让它消失吗?

如果某些垂直内容出现在分页符旁边,我可以让它消失吗?

我想在每个部分标题上方放置一条水平线,以将新部分与之前的文本分开。但如果部分从新页面开始,我不希望出现该线,因为这样会将线放置在一个页面的底部或下一个页面的顶部,这两种情况看起来都很糟糕。

我认为第一步是\nobreak\hrule添加一个,这样它就不会出现在页面的最底部,但仍可以出现在页面的顶部。为了防止这种情况发生,我会喜欢要做的是有条件地发出规则,仅当当前页面上已经有其他材料时,但由于 TeX 的页面构建器的工作方式,可能直到规则已添加到主垂直列表后才会选择分页符。换句话说,在做出决定时不知道条件。所以我认为这行不通。

我知道输出例程可以访问页面上放不下的材料,因此它可以将其放回“最近贡献”列表中。它能从该材料的开头删除内容吗?如果可以,它如何确定新页面是否以应删除的规则开头?

或者,当 TeX 丢弃分页符后的粘连和惩罚时,我可以让它也丢弃规则框吗?

答案1

这个话题几个月前就出现了comp.text.tex讨论组中出现过;请参阅如果不在新页面顶部则绘制水平线

基于该问题的答案,这里有一个可以实现您的目标的 MWE。请注意,我定义了一个名为 的新命令,\emphsection它首先检查它是否接近页面底部;如果不是,它会绘制一条规则(除非它已经在页面顶部),然后调用普通命令\section

\documentclass[letterpaper,10pt]{article}
\usepackage{lipsum,needspace}

\newcommand{\emphrule}{%
  \par\vspace{2\bigskipamount}
  \leaders\vrule width \textwidth\vskip 0.4pt} 

\newcommand{\emphsection}[1]{\needspace{4\baselineskip}
    \emphrule\nobreak
    \section{#1}}

\begin{document}
\emphsection{First}
\lipsum[1]

\emphsection{Second}
\lipsum[2]

\emphsection{Third}
\lipsum[3]

\emphsection{Fourth}
\lipsum[4]

\emphsection{Fifth}
\lipsum[2]

\end{document}

如果你编译这个 latex 程序,你会看到第 1 节和第 4 节(从页面顶部开始)不是在节标题上方绘制一条水平线。

我创建了一个新命令,\emphsection而不是重新定义现有\section命令,因为您可能希望可以自由地返回到旧命令\section命令。如果您确定要不是想要使用旧的切片命令,您可以先执行\let\origsection\section,然后发出命令\renewcommand{\section}[1]{... \origsection{#1}

显然,您需要调整节尾和水平线之间的垂直间距;\vspace{2\bigskipamount}MWE 中的说明只是建议。同样,\needspace{4\baselineskip}如果您在节标题中使用双倍行距和/或不寻常的字体大小,则可能需要调整命令。祝您 TeXing 愉快!

答案2

needspace包裹\needspace{<length>}提供了一种简单的方法来实现这一点。它定义了检查<length>页面剩余部分是否可用的命令。如果没有,则\break发出,否则不执行任何操作。我从命令中获取了确切的代码\needspace,并对其进行了调整,以实际判断是否有足够的空间:

\usepackage{xparse}% http://ctan.org/pkg/xparse
...
\NewDocumentCommand{\ifneedspace}{m O{\relax}}{%
  \par \penalty-100\begingroup
  \setlength{\dimen@}{#1}%
  \dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
  \ifdim \dimen@>\dimen@ii
    \break
  \else
    #2
  \fi\endgroup%
}

此新\ifneedspace{<length>}[<success>]命令还会检查<length>页面上是否有可用空间。如果是,则<success>执行。此条件是可选的(因此有方括号[ ]),默认值为\relax(不执行任何操作)。如果页面上的空间实际上不够,则只执行\break\ifneedspace使用提供的接口定义xparse

为了让事情变得更有趣,我添加了\myrule来自如何在文本下方插入边框?这也需要xcolor包裹以选择颜色。

您可以尝试使用所需的<length>,但它似乎6\baselineskip有效。这为规则留出了足够的空间(2pt厚度和6pt总间隙加上部分标题)。当然,不同的长度将需要<length>使用不同的 。

以下是说明上述概念的完整最小工作示例:

\documentclass{article}
\usepackage{needspace}% http://ctan.org/pkg/needspace
\usepackage{xparse}% http://ctan.org/pkg/xparse
\usepackage{xcolor}% http://ctan.org/pkg/xcolor
\newcommand{\Text}{% Dummy text
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas 
vitae libero lectus. Sed justo nunc, bibendum at euismod vel, molestie 
vestibulum ipsum. Aenean tincidunt vestibulum nulla, ut feugiat mi 
malesuada quis. Vestibulum eu tincidunt dui. Aliquam erat volutpat. 
Nam mauris nibh, placerat in blandit sed, scelerisque quis justo. 
Duis ac libero nec leo ullamcorper pellentesque sed at libero.\par}

\makeatletter
\NewDocumentCommand{\ifneedspace}{m O{\relax}}{%
  \par \penalty-100\begingroup
  \setlength{\dimen@}{#1}%
  \dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
  \ifdim \dimen@>\dimen@ii
    \break
  \else
    #2
  \fi\endgroup%
}
\NewDocumentCommand{\myrule}{O{1pt} O{3pt} O{black}}{%
  \par\nobreak % don't break a page here
  \kern\the\prevdepth % don't take into account the depth of the preceding line
  \kern#2 % space before the rule
  {\color{#3}\hrule height #1 width\hsize} % the rule
  \kern#2 % space after the rule
  \nointerlineskip % no additional space after the rule
}
\makeatother
\begin{document}

\section{First section}
\Text \Text \Text \Text \Text \Text

text \par text % \par text

\ifneedspace{6\baselineskip}[\myrule[2pt][3pt][orange]]
\section{Second section}
\Text \Text \Text \Text \Text \Text \Text

\end{document}

在此处输入图片描述

如果取消注释附加项\par text,则会获得以下输出:

在此处输入图片描述

可以使用以下命令将该\ifneedspace命令合并到标准命令中\sectionletltxmacro。或者,定义您自己的\Section包含上述内容的命令。

相关内容