使用 iftoggle 设置 newtheorem 深度

使用 iftoggle 设置 newtheorem 深度

我对多个文档使用同一个宏文件,并且我希望它们的定理以不同的方式编号——一个按章节编号,另一个按子章节编号。我尝试使用 etoolbox 中的 iftoggle 来实现这一点,如下所示。

宏.sty:

\usepackage{etoolbox}
\newtoggle{sub}
\newtheorem{theorem}{Theorem}[\iftoggle{sub}{subsection}{section}]

doc1.tex:

\usepackage{macros}
\togglefalse{sub}
\begin{theorem} theorem text \end{theorem}

doc2.tex:

\usepackage{macros}
\toggletrue{sub}
\begin{theorem} theorem text \end{theorem}

不幸的是,这两个文档中都按节对定理进行了编号。我猜想,在定义定理环境之前必须设置切换(尽管其他宏的定义涉及 iftoggle 的情况并非如此)。事实上,我发现了以下解决这个问题的非理想方法。

宏.sty:

\newtheorem{theorem}{Theorem}[\iftoggle{sub}{subsection}{section}]

doc1.tex:

\usepackage{etoolbox}
\newtoggle{sub}
\togglefalse{sub}
\usepackage{macros}
\begin{theorem} theorem text \end{theorem}

doc2.tex:

\usepackage{etoolbox}
\newtoggle{sub}
\toggletrue{sub}
\usepackage{macros}
\begin{theorem} theorem text \end{theorem}

我觉得这不是理想的,因为我希望整个解决方案都包含在样式文件中,而不需要在每个新文档的开头添加额外的代码。有人能建议一个解决这个问题的可靠方法吗?

答案1

\newtheorem为了添加正确的计数器名称,尾随的可选参数会立即扩展。

您可以在开始文档时推迟类定理环境的定义,此时切换的值是已知的。

.sty文件骨架

\RequirePackage{etoolbox,amsthm}

\newtoggle{sub}

\AtBeginDocument{
  \newtheorem{theorem}{Theorem}[\iftoggle{sub}{subsection}{section}]
}

示例文档

\documentclass{article}
\usepackage{aaron}

\toggletrue{sub}

\begin{document}

\section{Section}

\subsection{Subsection}

\begin{theorem}
Theorem
\end{theorem}

\end{document}

注释掉\toggletrue{sub}

在此处输入图片描述

具有\toggletrue{sub}主动

在此处输入图片描述

相关内容