如何根据是否存在小节来编号定理

如何根据是否存在小节来编号定理

我正在尝试排版一个与以下编号相同的考试科目本文件由 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 手册中找不到AtBeginSectionAtBeginSubsection。是否有一些钩子可用于在每个部分/子部分执行一些代码,而无需破解整个内容?

答案1

以下操作可满足您的要求。我只是重新定义\thequestion为检查当前\valuesubsection(即\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}

相关内容