我正在尝试排版一个与以下编号相同的考试科目本文件由 Concours CentraleSupélec 提供。
章节用罗马字母编号,子章节用字母编号,每个子章节中的问题用阿拉伯字母编号:也就是说,第 I 部分的 A 子章节中问题编号 2 的编号为 IA2。
我知道如何使用 ntheorem 和 KOMA scrartcl 来做到这一点:这样做就足够了
\renewcommand\thesection{\Roman{section}}
\renewcommand\thesubsection{\thesection.\Alph{subsection}}
\newtheorem{question}{Question}[subsection]
这有效。
但是,并非所有部分都有子部分。在这种情况下,问题在部分内以字母而不是阿拉伯语进行编号。因此,没有子部分的 IV 部分中的第三个问题编号为 IV.C,而不是 IV..3。
我知道我能做到
\theoremnumbering{Alph}
\renewtheorem{question}{Question}[section]
我正在尝试使此过程自动化。显然,当遇到新部分时,不可能知道是否会有子部分,因此必须在每个部分更改编号,并在每个子部分(或至少是每个部分内的每个第一个子部分)再次更改编号。
我在 KOMA-script 手册中找不到AtBeginSection
或AtBeginSubsection
。是否有一些钩子可用于在每个部分/子部分执行一些代码,而无需破解整个内容?
答案1
以下操作可满足您的要求。我只是重新定义\thequestion
为检查当前\value
的subsection
(即\c@subsection
),并根据此情况以不同的方式打印。
\documentclass[]{scrartcl}
\usepackage{ntheorem}
\renewcommand*\thesection{\Roman{section}}
\renewcommand*\thesubsection{\thesection.\Alph{subsection}}
\newtheorem{question}{Question}[subsection]
\makeatletter
\renewcommand*\thequestion{%
\ifnum\c@subsection=0
\thesection.\Alph{question}%
\else
\thesubsection.\arabic{question}%
\fi
}
\makeatother
\begin{document}
\section{Foo}
\begin{question}
foo
\end{question}
\section{Foo}
\subsection{Bar}
\begin{question}
foo
\end{question}
\end{document}
问题:如果你有类似以下结构的内容会怎样?
I. Section
A. Question
B. Subsection
1. Question
解决方案:\section
在and命令中添加一个布尔开关\subsection
,指示我们是否在子部分内,如果是,则使用thesubsection.\arabic{question}
。如果不是,则进入子部分计数器并使用\thesection.\Alph{question}
。对于修补部分,我使用了etoolbox
:
\documentclass[]{scrartcl}
\usepackage{ntheorem}
\usepackage{etoolbox}
\newif\ifInsideSubsection
\pretocmd\section{\InsideSubsectionfalse}{}{}
\pretocmd\subsection{\InsideSubsectiontrue}{}{}
\renewcommand*\thesection{\Roman{section}}
\renewcommand*\thesubsection{\thesection.\Alph{subsection}}
\newtheorem{question}{Question}[subsection]
\makeatletter
\renewcommand*\thequestion{%
\ifInsideSubsection
\thesubsection.\arabic{question}%
\else
\thesection.\Alph{question}%
\global\advance\c@subsection by 1\relax
\fi
}
\makeatother
\begin{document}
\section{Foo}
\begin{question}
foo
\end{question}
\section{Foo}
\begin{question}
foo
\end{question}
\subsection{Bar}
\begin{question}
foo
\end{question}
\end{document}