如何在章节标题上方添加一行并避免其间出现分页符?

如何在章节标题上方添加一行并避免其间出现分页符?

我们为一些期刊设计了一个课程。我们希望我们的章节标题用一条水平线与上一行分隔。代码如下:

\def\section{%
    \vskip 1.2\@bls%
    \hrule height 1pt%
    \@startsection{section}{1}{\z@}{-1pt}{1pt}{\normalfont\large\bfseries}%
}

但是,有两个问题:

  1. 有时,当一页(或一列)结束时,水平线仍停留在前一页(或一列),段落标题则打印在新的一页(或一列)上。我读到过一些关于设置一些惩罚值来解决这个问题,但我没有成功。

  2. 我们希望我们的章节标题是左对齐,但 LaTeX证明连字符他们。添加命令\flushleft并没有改变什么。


编辑:

使用史蒂芬·柯特维茨的优秀回答,我修改了上面的代码,如下所示。不幸的是,它仍然不起作用:LaTeX 将节标题排版在水平线之后,没有任何行/段落中断。

\def\section{%
    \begin{minipage}{7cm} %
    \vskip 1.2\@bls%
    \hrule height 1pt%

    \raggedright\@startsection{section}{1}{\z@}{-1pt}{1pt}{\normalfont\large\bfseries}%
    \protect\end{minipage}%
}

答案1

  1. 为了防止分页符,您可以使用minipage环境。samepage也可以使用环境。此外,还有needspacepackage:该命令\needspace请求用户定义的空间量,否则会插入分页符。这对于标题很有用,因为它们也不应该位于页面末尾。

  2. 您可以插入一个\raggedright命令,例如直接在 之前\@startsection

您可以使用以下软件包:

  • titlesec非常适合自定义标题

  • sectsty也很有用,例如对于 2. 该命令\sectionfont{\raggedright}就足够了。

由于该needspace软件包提供了很好的解决方案,并且可能导致的问题较少,因此我建议使用它的\needspace命令。因为我知道您不喜欢加载其他软件包,所以这里有一个仅包含复制的\needspace命令的最小示例以供演示:

\documentclass{article}
\makeatletter
\newcommand{\needspace}[1]{\begingroup\setlength{\dimen@}{#1}%
  \vskip\z@\@plus\dimen@ \penalty -100\vskip\z@\@plus -\dimen@
  \vskip\dimen@ \penalty 9999\vskip -\dimen@\endgroup}% from needspace.sty
\def\section{%
    \needspace{3\baselineskip}%
    \vskip 1.2ex%
    \hrule height 1pt%
    \@startsection{section}{1}{\z@}{-1pt}{1pt}{%
      \raggedright\normalfont\large\bfseries}%
}
\makeatother
\begin{document}
Text
\vspace{.93\textheight}
\section{This is a very, very long heading just to test the justification}
\end{document}

输出:

替代文本

为了验证它是否按预期工作:

  • 如果删除该行,\needspace{3\baselineskip}%则顶行和章节标题之间会有一个分页符
  • 如果你删除\raggedright这个词理由将会被连字符连接。

答案2

我建议使用标题安全包。它应该解决这两个问题。否则,它可能需要以完整但最小的示例形式提供更多详细信息。请参阅下面的代码以获得一些启发。

\documentclass[11pt,a4paper,twocolumn,english]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage[raggedright]{titlesec}
\usepackage{blindtext}

\titleformat{\section}{\titlerule\vspace{1ex}\normalfont\Large\bfseries}{\thesection}{1em}{}

\begin{document}
  \blinddocument
\end{document}

请注意盲文该包仅用于创建虚拟文本,因此不是解决方案的一部分。

答案3

强制性的 ConTeXt 解决方案:

% Define a frame that only draws the top frame and typesets its content flushleft
\defineframed[sectionframe]
             [frame=off,   
              topframe=on,
              rulethickness=1pt,
              align=flushleft,
            ]

\def\sectioncommand#1#2{\sectionframe{#1 #2}}
% #1 is section number 
% #2 is section title

% Ask ConTeXt to use our section command.
\setuphead[section]
          [command=\sectioncommand,
           style=\bfa, % equivalent to \large\bfseries
          ]


% Test case
\starttext
\input knuth
\section{A section with a very long title that spans multiple lines to check if
         line breaking works correctly}
\input knuth
\stoptext

相关内容