为什么 titlesec 包不会修改 \chapter 标题?(PDFLaTeX)

为什么 titlesec 包不会修改 \chapter 标题?(PDFLaTeX)

在我看来,这是因为无法在文档中titlesec设置标题样式。\chapter

文档说它应该支持设置\chapter标题样式。

这是一个最小可重现的示例:

\documentclass[12pt,letterpaper]{article}
\usepackage[margin=0.5in]{geometry}
\usepackage[compact]{titlesec}

\titleformat{\chapter}[hang]
{\centering\bfseries\huge}
{}
{0pt}
{\titlerule[0.8pt]}[]
\titlespacing{\chapter}
{0pt}
{0pt}
{0pt}[0pt]

\titleformat{\section}[hang]
{\centering\Large}
{}
{0pt}
{\titlerule[1.6pt]}[]
\titlespacing{\section}
{0pt}
{0pt}
{0pt}[0pt]

\begin{document}
\chapter{CHAPTER TEXT}\label{chapter-text}
\section{SECTION TEXT}\label{section-text}
\end{document}

这在我本地安装的 PDFLatex 和 Overleaf 中都失败了。 overleaf 中的错误截图

也许我忽略了什么。有人知道什么可以帮我解决这个问题吗?谢谢!

答案1

问题是article文档类没有定义\chapter标题,因此无法为其提供样式。

解决方案(由评论提出@Ulrike Fischer) 是切换到另一个文档类,例如reportbook。这有效!

我选择切换到report文档类。请注意,这会导致迁移问题:我的标题(由设置\pagestyle)拒绝在与标题相同的页面上工作\chapter。我在另一个论坛帖子中找到了此问题的解决方案:https://tex.stackexchange.com/a/19741/315958

答案2

您可以将 的定义包装\chapter在里面\@ifundefined(注意用 将其括起来\makeatletter ... \makeatother)。

\makeatletter
\@ifundefined{chapter}{}{
    \titleformat{\chapter}[hang]
    {\centering\bfseries\huge}
    {}
    {0pt}
    {\titlerule[0.8pt]}[]
    \titlespacing{\chapter}
    {0pt}
    {0pt}
    {0pt}[0pt]
}
\makeatother

这样,您就可以保持\chapter样式独立于文档类。


澄清:这个解决方案从来不是为了提供课堂\chapter命令article,而是为了保持\chapter风格关于无论使用哪种文档类,定义都是如此。正如@UlrikeFischer 提到的,article不提供\chapter,这是有原因的,这也证明了book和的存在report。我个人认为在文章中提供章节是非常错误的。

但是,正如 OP 所问,可以使用titlesectitletoc来定义\chapter命令。这可以按如下方式完成(我试图接近原始版本,可能并不完美):

\documentclass{article}

\usepackage{titlesec}
\usepackage{titletoc}

\newcommand{\chaptername}{Chapter}
\makeatletter
\newcommand{\@chapapp}{\chaptername}
\makeatother

\titleclass{\chapter}{top}[\part]
\newcounter{chapter}

\titleformat{\chapter}[display]
    {\bfseries\huge}
    {\chaptertitlename\space\thechapter}
    {20pt}
    {\Huge\bfseries}

\titlespacing*{\chapter}
    {0pt}
    {50pt}
    {40pt}

\titlecontents{chapter}
    [1.5em]
    {\vspace*{10pt}\bfseries}
    {\contentslabel{1.3em}}
    {\hspace*{-1.3em}}
    {\hfill\contentspage}

\AddToHook{cmd/appendix/before}{
    \setcounter{chapter}{0}
    \gdef{\thechapter}{\Alph{chapter}}
}

\begin{document}

\chapter{A}

\end{document}

但请注意,这在很多层面上都是错误的。例如,bookreport类用于自动发布、、等\chapter*标题,而类用于此。此外,我没有考虑到每页标题中使用的标记(类似于页码等其他信息)。和类为此定义,但显然没有。\tableofcontents\begin{thebibliography}{...}\printindexarticle\section*bookreport\chaptermarkarticle

相关内容