为了对小节进行编号,我使用
\renewcommand*\thesubsection{\thesection.\arabic{subsection}}
它适用于普通编号部分。例如,如果我们使用
\section{A}
\subsection{try}
\subsection{try2}
表明
1. A
1.1. try
1.2. try2
但是,如果某个部分没有编号,那么其中的子部分看起来会很奇怪。例如,如果我们写
\section*{A}
\subsection{try}
\subsection{try2}
我们得到
A
.1. try
.2. try
我该如何编写一个宏来自动判断:如果该节已编号,则将此编号添加到子节编号中;如果该节未编号,则我们直接对子节本身进行编号?例如,我想要获得
1. A
1.1. A1
1.2. A2
B
1. B1
2. B2
答案1
这在文档主体中可能有意义,但目录格式需要一些考虑。
下面我更新了\section
工作方式。它根据条件*
重新格式化计数器\thesubsection
- 删除前置\thesection.
或插入前置。
\documentclass{article}
\usepackage{xparse}
\let\oldsection\section
\RenewDocumentCommand{\section}{s o m}{%
\IfBooleanTF{#1}
{\oldsection*{#3}% \section*
\renewcommand{\thesubsection}{\arabic{subsection}}}% Update subsection numbering
{\IfNoValueTF{#2}% \section
{\oldsection{#3}}% \section{..}
{\oldsection[#2]{#3}}% \section[.]{..}
\renewcommand{\thesubsection}{\thesection.\arabic{subsection}}% Update subsection numbering
}%
\setcounter{subsection}{-1}\stepcounter{subsection}% Reset all sub-counters beyond \subsection
}
% Add period after sectional numbers in document body and ToC
\makeatletter
\renewcommand{\@seccntformat}[1]{\csname the#1\endcsname.\quad}
\renewcommand{\numberline}[1]{\hb@xt@\@tempdima{#1.\hfil}}
\makeatother
\begin{document}
\tableofcontents
\section{A}
\subsection{First subsection}
\subsection{Second subsection}
\section*{B}
\subsection{Third subsection}
\subsection{Fourth subsection}
\section*{C}
\subsection{Fifth subsection}
\subsection{Sixth subsection}
\section{D}
\subsection{Seventh subsection}
\subsection{Eighth subsection}
\end{document}