一条新条款之前的规则

一条新条款之前的规则

我使用规则来区分不同的部分。我想自动执行此操作,以便使用以下语法:

\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]

有两个问题需要解决:

  1. 第一部分前面没有规则。
  2. 如果一个部分位于新页面的开头,则其前面没有规则。

改善代码

\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”与egregTeX 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}

代码输出

相关内容