我在一个环境中定义了一个定理,该定理的编号类似于 T1.2。这是第一节中的第二个定理。现在我想要另一个定理,它与另一个定理有相同的计数器,但看起来像 T1.3*。
一个简单的例子:
\documentclass{scrartcl}
\usepackage{amsthm}
\usepackage{blindtext}
\theoremstyle{definition}
\newenvironment{myenv}{
\newpage
\section{New section}
}{}
\newtheorem{mytheorem}{}[section]
\renewcommand{\themytheorem}{T\thesection.\arabic{mytheorem}}
\newtheorem{starredtheorem}[mytheorem]{}
\begin{document}
\begin{myenv}
\begin{mytheorem}
\blindtext
\end{mytheorem}
\begin{starredtheorem}
\blindtext
\end{starredtheorem}
\begin{mytheorem}
\blindtext
\end{mytheorem}
\end{myenv}
\end{document}
我想要类似的东西
\renewcommand{\thestarredtheorem}{T\thesection.\arabic{mytheorem}*}
因此,最小示例中的编号应为
T1.1. ABC
T1.2*. DEF
T1.3. GHI
我怎样才能做到这一点?
答案1
我建议使用etoolbox
的\AtBeginEnvironment
命令来\themytheorem
在环境范围内重新定义starredtheorem
:
\let\themytheoremNormal=\themytheorem
\AtBeginEnvironment{starredtheorem}{%
\renewcommand*{\themytheorem}{\themytheoremNormal\relax *}%
}
引用该定理时这也有效,因为:
环境的开始代码
starredtheorem
执行的操作是\refstepcounter{mytheorem}
,它将 的\protected@edef\@currentlabel{...}
扩展存储\themytheorem
在宏中的该点处\@currentlabel
。\label{th:starred}
执行\protected@write\@auxout{}{\string\newlabel{th:starred}{{\@currentlabel}{\thepage}}}
,它将一个\newlabel
命令写入.aux
包含 扩展名的文件\@currentlabel
,即\refstepcounter{mytheorem}
在步骤 1 中使用 的特殊重新定义\themytheorem
(附加星号的定义)所准备的内容。
完整代码:
\documentclass{article}
\usepackage{amsthm}
\usepackage{etoolbox}
\usepackage{lipsum}
\theoremstyle{definition}
\newenvironment{myenv}
{\newpage\section{New section}}
{}
\newtheorem{mytheorem}{}[section]
\renewcommand{\themytheorem}{T\thesection.\arabic{mytheorem}}
\let\themytheoremNormal=\themytheorem
\newtheorem{starredtheorem}[mytheorem]{}
\AtBeginEnvironment{starredtheorem}{%
\renewcommand*{\themytheorem}{\themytheoremNormal\relax *}%
}
\begin{document}
\begin{myenv}
\begin{mytheorem}\label{th:normal-a}
\lipsum[1][1-3]
\end{mytheorem}
\begin{starredtheorem}\label{th:starred}
\lipsum[1][1-3]
\end{starredtheorem}
\begin{mytheorem}\label{th:normal-b}
\lipsum[1][1-3]
\end{mytheorem}
References to theorems~\ref{th:normal-a}, \ref{th:starred}
and~\ref{th:normal-b}.
\end{myenv}
\end{document}
讨论\relax
\relax
在特殊(“星号”)定义中\themytheorem
真的必要的,使用 为文本时,这只是一种安全的做法*
:即使星号前面是带有星号形式的命令,\relax
也会阻止该命令将我们的星号解释为“我想要命令的星号形式”。在这种情况下,扩展 之后\themytheoremNormal
,星号前面将是\arabic{mytheorem}
,其行为与后面跟星号时并无不同。因此,\relax
不是必需的,但也不会造成任何损害。
\relax
例如,如果有人使用(看起来很傻的例子,但可以测试),则可能会发生这种情况。
\renewcommand{\themytheorem}{%
T\thesection.\arabic{mytheorem}\protect\\%
}
但在这种情况下,最好的做法是防止错误在呼叫站点。在此示例中,这是\\
使用的 where,因为该命令会向前看,如果有星星出现,则会采取不同的行为。在这种情况下,最好的解决方法是使用:
\renewcommand{\themytheorem}{%
T\thesection.\arabic{mytheorem}\protect\\\relax
}
以确保\\
不使用带星号的形式。这样,即使有人*
在后面使用了 not \relax
,对 的调用\\
也会像 a\\
而不是 a 那样工作\\*
(这会开始一个新行,防止分页符,但不会打印星号)。