讨论\relax

讨论\relax

我在一个环境中定义了一个定理,该定理的编号类似于 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 *}%
}

引用该定理时这也有效,因为:

  1. 环境的开始代码starredtheorem执行的操作是\refstepcounter{mytheorem},它将 的\protected@edef\@currentlabel{...}扩展存储\themytheorem在宏中的该点处\@currentlabel

  2. \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 那样工作\\*(这会开始一个新行,防止分页符,但不会打印星号)。

相关内容