我们为一些期刊设计了一个课程。我们希望我们的章节标题用一条水平线与上一行分隔。代码如下:
\def\section{%
\vskip 1.2\@bls%
\hrule height 1pt%
\@startsection{section}{1}{\z@}{-1pt}{1pt}{\normalfont\large\bfseries}%
}
但是,有两个问题:
有时,当一页(或一列)结束时,水平线仍停留在前一页(或一列),段落标题则打印在新的一页(或一列)上。我读到过一些关于设置一些惩罚值来解决这个问题,但我没有成功。
我们希望我们的章节标题是左对齐,但 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
为了防止分页符,您可以使用
minipage
环境。samepage
也可以使用环境。此外,还有needspace
package:该命令\needspace
请求用户定义的空间量,否则会插入分页符。这对于标题很有用,因为它们也不应该位于页面末尾。您可以插入一个
\raggedright
命令,例如直接在 之前\@startsection
。
您可以使用以下软件包:
由于该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