我使用规则来区分不同的部分。我想自动执行此操作,以便使用以下语法:
\section*{One day}
\noindent\lipsum[1]
\section*{Another day}
\noindent\lipsum[1]
\section*{One more day}
\noindent\lipsum[1]
\newpage
\section*{One last day}
\noindent\lipsum[1]
有两个问题需要解决:
- 第一部分前面没有规则。
- 如果一个部分位于新页面的开头,则其前面没有规则。
改善代码
\documentclass[12pt]{article}
\newcommand{\myRule}{%
\vspace{0.5cm}\hrule%
}
\usepackage{lipsum}
\begin{document}
% No rule !
\section*{One day}
\noindent\lipsum[1]
\myRule
\section*{Another day}
\noindent\lipsum[1]
\myRule
\section*{One more day}
\noindent\lipsum[1]
\newpage
% No rule !
\section*{One last day}
\noindent\lipsum[1]
\end{document}
答案1
通过结合 Mico 和 Alan Munn 的答案,这里有一个更简单的代码,可以完成所要求的内容:
\usepackage{titlesec}
\titleformat{\section}
{\leaders\vrule width \textwidth\vskip 0.4pt\vspace{.8ex}%
\normalfont\Large\bfseries}
{}
{0em}
{}
规则和章节标题之间的间距是 .8ex(调整以适合您)。
答案2
以下代码基于这篇文章2011 年 5 月,comp.text.tex 开始使用。如果节标题位于页面顶部(包括第一页),则不会绘制任何规则。此方法适用于编号和未编号的节标题。
节尾与后续规则之间以及规则与下一节标题之间的间距量由命令\vspace{2\bigskipamount}
和控制\vspace{\smallskipamount}
;更改这两个命令的参数\vspace
以适合您的偏好。默认情况下,规则的宽度为 0.4pt。(0.4pt 似乎是 LaTeX 中许多行的标准宽度...)当然,您也可以更改此设置。
请注意,该命令\separatorrule
可以在文本中的任何位置单独使用,而不仅仅是在章节标题之前。它的两个主要区别属性是 (i) 不会在页面顶部绘制任何规则,以及 (ii) 如果命令后跟隐式或显式命令\clearpage
或类似效果的命令(例如),则不会在页面的后面绘制任何规则\cleardoublepage
。
\documentclass{article}
\newcommand{\separatorrule}{%
\par\vspace{2\bigskipamount}
\leaders\vrule width \textwidth\vskip 0.4pt
\vspace{\smallskipamount}\nointerlineskip}
\let\origsection\section
\renewcommand\section{\separatorrule \origsection}
\usepackage{lipsum} % for filler text
\begin{document}
\section*{A} \lipsum[1]
\section{B} \lipsum[2]
\section*{C} \lipsum[3]
\clearpage
\section*{D} \lipsum[4]
\section{E} \lipsum[5]
\end{document}
最后,我强烈地感觉到 comp.text.tex 组中分隔符规则代码的提供者“Enrico Gregorio”与egreg
TeX Stack Exchange 组中的提供者是同一个人。无论如何,我对这篇文章的贡献显然是微不足道的。
答案3
这只是部分答案,因为还有一些间距问题需要解决。至少,它可以引导出一个更好的解决方案。
使用titlesec
以及一些来自needspace
可以根据页面可用性进行调节。
\documentclass[12pt]{article}
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\usepackage{titlesec}% http://ctan.org/pkg/titlesec
\newcounter{tmpcntr} \preto\newpage{\setcounter{tmpcntr}{0}}%
% Taken from the needspace package (http://ctan.org/pkg/needspace)
\makeatletter
\newcommand{\needspace}[3]{\par \penalty-100\begingroup
\setlength{\dimen@}{#1}%
\dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
\ifdim \dimen@>\dimen@ii
#3
\else
#2
\fi\endgroup}
\makeatother
\titleformat{\section}{\bfseries\large\stepcounter{tmpcntr}}{\thesection}{\quad}{%
\needspace{\dimexpr0.4pt+5mm+1.5\baselineskip\relax}%
{\ifnumequal{\value{tmpcntr}}{1}{}{\titlerule\nobreak\kern5mm\nobreak}}% enough space
{\break\vspace*{\topskip}}% not enough space
}
\begin{document}
% No rule !
\section*{One day}
\noindent\lipsum[1]
\section*{Another day}
\noindent\lipsum[1]
\section*{One more day}
\noindent\lipsum[1]
\newpage
% No rule !
\section*{One last day}
\noindent\lipsum[1]
\end{document}
修改后的代码needspace
提供了
\needspace{<len>}{<less than len>}{<more than len>}
如果页面上可用的<less than len>
内容不足,则执行此操作,否则发出。<len>
<more than len>
此外,tmpcntr
计数器旨在作为您是否开始新页面或文档以 开头的参考\section
。如果此计数器为 1(在 内增加\section
),则不会\titlerule
排版。
答案4
这是使用该包的部分答案titlesec
。我添加了一个条件来删除第一部分的规则。如果这适用于章节,则需要添加\ruledfalse
到的定义中\chapter
。然而,这并不能解决页面顶部的问题,但我将其保留为答案,因为到达这里的其他人可能没有这个要求。
\documentclass{article}
\usepackage{titlesec}
\newif\ifruled
\titleformat{\section}
{\ifruled\titlerule\else\global\ruledtrue\fi\vspace{.8ex}%
\normalfont\bfseries} {}{0em}{}
\begin{document}
\section*{A section}
\section*{Another section}
\end{document}