当我使用带编号的标题(如\section
或 )时\chapter
,标题会自动添加到目录中。如果我使用未编号的标题(如\section*
或 )\chapter*
,则必须添加另一行
\section*{Criteria}
\addcontentsline{toc}{section}{Criteria}
这很烦人。有没有办法让这种情况自动发生?我试过了
\renewcommand{section}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}}
但编译失败。
我能够使用
\newcommand{mysection}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}}
但这似乎也相当笨重,并且需要更改文档中的所有分段命令。
答案1
和xparse
在带星号的版本和可选参数之间进行条件判断非常简单。因此,以下重新定义会\section
自动在目录中插入适当的带星号的版本:
\documentclass{article}
\usepackage{xparse}
\let\oldsection\section
\RenewDocumentCommand{\section}{s o m}{%
\IfBooleanTF{#1}
{% \section*
\oldsection*{#3}% Insert \section*{...}
\addcontentsline{toc}{section}{\protect\numberline{}#3}% Add ToC entry
}{% \section
\IfNoValueTF{#2}
{\oldsection{#3}}% \section{...}
{\oldsection[#2]{#3}}% \section[..]{...}
}%
}
\begin{document}
\tableofcontents
\section{A section}
\section[Second section]{Another section}
\section*{Next section}
\section*[Final section]{Last section}
\end{document}
但请注意,\tableofcontents
也用于\section*
。article
因此,在这种情况下,它必然会包含在 ToC 中。\tableofcontents
不过,对 进行轻微的重新定义可以解决这个问题。
另请注意,当用户输入时,我没有处理可选参数\section*[..]{...}
,因为这通常不被使用。但是,如果需要,可以添加该条件。