带破折号的章节标题,根据是否存在章节标题而显示

带破折号的章节标题,根据是否存在章节标题而显示

我想在章节标签之后、章节标题之前添加一个破折号。但我希望首先根据是否存在章节标题来执行此操作。

所以

\section{Merry Christmas} 

应该显示

A部分-圣诞快乐

尽管

\section{}

应该显示

B 部分为空

我希望在我正在构建的类中自动实现这种行为,而不需要在标题等中手动添加破折号。

我该怎么做呢?

答案1

很简单,通过titlesec

\documentclass{article}
\usepackage{titlesec,etoolbox}

\titleformat{\section}
  {\normalfont\Large\bfseries}
  {Section \thesection}
  {0pt}
  {\checksectiontitle}

\newcommand{\checksectiontitle}[1]{%
  \ifblank{#1}{}{ -- #1}%
}

\renewcommand{\thesection}{\Alph{section}}

\begin{document}

\section{Merry Christmas}

\section{}

\end{document}

诀窍在于,章节标题始终作为参数传递给 的最后一个宏的最后一个宏(强制参数)\titleformat。我使用\ifblanketoolbox因此也\section{ }不会打印破折号。

在此处输入图片描述

如果您打算使用\section*,您还需要

\titleformat{name=\section,numberless}
  {\normalfont\Large\bfseries}
  {}
  {0pt}
  {}

答案2

仅需一个额外包的解决方案:(xpatch或者etoolbox,在这里也足够了)

通常情况下,修补就足够了,但在我看来,直接复制更容易\@sect\@sectlatex.ltx

\@seccntformat\quad如果--要应用的话,使用起来很丑陋,所以我删除了它。

但是我没有改变目录的条目和页眉样式。

如果需要的话,将此解决方案应用于其他分段级别也会更加容易。

\documentclass{article}

\usepackage{xpatch}

\renewcommand{\thesection}{\Alph{section}}
\makeatletter


\def\@sect#1#2#3#4#5#6[#7]#8{%
  \ifnum #2>\c@secnumdepth
  \let\@svsec\@empty
  \else
  \refstepcounter{#1}%
  \ifstrequal{#1}{section}{%
    \ifblank{#8}{%
      \protected@edef\@svsec{Section \@seccntformat{#1}\relax}%
    }{%
      \def\@localseccntformat##1{\csname the##1\endcsname}%   
      \protected@edef\@svsec{Section \@localseccntformat{#1}\ -- \relax}%
    }%
  }{%
    \protected@edef\@svsec{\@seccntformat{#1}\relax}%
  }%
  \fi
  \@tempskipa #5\relax
  \ifdim \@tempskipa>\z@
    \begingroup
      #6{%
        \@hangfrom{\hskip #3\relax\@svsec}%
        \interlinepenalty \@M#8\@@par}%
    \endgroup
    \csname #1mark\endcsname{#7}%
    \addcontentsline{toc}{#1}{%
      \ifnum #2>\c@secnumdepth \else
        \protect\numberline{\csname the#1\endcsname}%
      \fi
      #7}%
  \else
    \def\@svsechd{%
      #6{\hskip #3\relax
      \@svsec #8}%
      \csname #1mark\endcsname{#7}%
      \addcontentsline{toc}{#1}{%
        \ifnum #2>\c@secnumdepth \else
          \protect\numberline{\csname the#1\endcsname}%
        \fi
        #7}}%
  \fi
  \@xsect{#5}}
\makeatother


\begin{document}
\tableofcontents
\section{A section}
\section{}
\subsection{First subsection}

\end{document}

在此处输入图片描述

答案3

另一个解决方案与第二个解决方案非常相似:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[frenchb]{babel}

\usepackage{etoolbox}
\usepackage[explicit]{titlesec}

\newcommand{\titcon}[1]
{
  \ifstrempty{#1}
  {}
  { -- #1}
}

\titleformat{\section}{\bfseries\Large}{Section \Alph{section} \titcon{#1}}{6pt}{}

\begin{document}

\section{Merry Christmas}

\section{}

\end{document}

您可以使用 titlesec 包的显式选项来控制参数。

相关内容