重新定义 `\section*`,使其行为与 `\section` 完全一样,只是省略了数字

重新定义 `\section*`,使其行为与 `\section` 完全一样,只是省略了数字

“如何将未编号的部分放入目录中?”这个问题有很多变体......

对我来说,这些答案都没什么用,因为它们都涉及将\addcontentsline,可能还有其他内容(\mark\phantomsection,...?)粘贴到文档中的正确位置。就我而言,命令\section*是由包发出的,它们没有给我钩子来将内容插入到正确的位置;而且我不清楚我到底需要什么“其他内容”。如果我可以重新定义,\section*使其行为与非星号版本完全相同,除了它不打印节号外,它会更简单、更强大。

我该怎么做

注意:KOMA-Script 课程不是一种选择。我目前使用纯文本article来写草稿,最终我需要参加期刊课程。

注 2(来自对尝试回答的评论):\secnumdepth全局调整对我来说不起作用,因为(a)我仍然希望从无星号\section等进行正常的章节编号,并且(b)发出命令的包\section*无法被说服使用普通的\section

答案1

您可以重新定义\section捕获并确定何时使用星号版本。找到后\section*,像执行 一样发出它\section,但是通过适当设置计数器来移除数字打印机制secnumdepth

在此处输入图片描述

\documentclass{article}

\usepackage{xparse}

\let\oldsection\section
\makeatletter
\newcounter{@secnumdepth}
\RenewDocumentCommand{\section}{s o m}{%
  \IfBooleanTF{#1}
    {\setcounter{@secnumdepth}{\value{secnumdepth}}% Store secnumdepth
     \setcounter{secnumdepth}{0}% Print only up to \chapter numbers
     \oldsection{#3}% \section*
     \setcounter{secnumdepth}{\value{@secnumdepth}}}% Restore secnumdepth
    {\IfValueTF{#2}% \section
       {\oldsection[#2]{#3}}% \section[.]{..}
       {\oldsection{#3}}}% \section{..}
}
\makeatother

\begin{document}

\tableofcontents

\section{TestA}

\section*{TestB}

\end{document}

xparse提供一个简单的界面,用于(重新)定义可能有starred 版本以及o可选参数的命令。

相关内容