如何确定与类定理环境相关的计数器的名称

如何确定与类定理环境相关的计数器的名称

(与以下相关的问题这个并导致这个

假设我正在使用ntheorem。我希望有一个命令来确定与某个定理类环境相关联的计数器的名称(而不是值)。因此,以下内容:

\documentclass{article}
\usepackage{ntheorem}
\newtheorem{theorem}{Theorem}[section]
\newtheorem{prop}[theorem]{Proposition}
\begin{document}
Propositions use the counter \getenvcounter{prop} while theorems use \getenvcounter{theorem}.
\end{document}

应该产生

命题使用反定理,而定理使用定理。

cleveref如果有必要我可以容忍使用...

答案1

\makeatletter
\def\getenvcounter#1{%
  \expandafter\expandafter\expandafter\@getenvcounter\csname mkheader@#1\endcsname}
\def\@getenvcounter\csname#1\endcsname#2#3#4#5{#4}
\makeatother

解释:\show\prop给出

> \prop=macro:
->\let \thm@starredenv \@undefined \csname mkheader@prop\endcsname .

然后\show\mkheader@prop给出

> \mkheader@prop=macro:
->\csname setparms@prop\endcsname \@thm {prop}{theorem}{Proposition}.

因此我展开两次\csname mkheader@#1\endcsname,得到最后显示的标记列表并进行\@getenvcounter相应的定义。

LaTeX 内核定义(由 保留)的版本amsthm将是

\makeatletter
\def\getenvcounter#1{%
  \expandafter\expandafter\expandafter\@getenvcounter\csname#1\endcsname}
\def\@getenvcounter#1#2#3{#2}
\makeatother

普通版

如果您更喜欢不依赖于包加载的版本,那么这里是:

\makeatletter
\def\getenvcounter#1{%
  \@ifundefined{mkheader@#1}
    {\expandafter\expandafter\expandafter\@getenvcounterkernel\csname#1\endcsname}
    {\expandafter\expandafter\expandafter\@getenvcounterntheorem\csname mkheader@#1\endcsname}}
\def\@getenvcounterkernel#1#2#3{#2}
\def\@getenvcounterntheorem\csname#1\endcsname#2#3#4#5{#4}
\makeatother

版本也支持thmtools

\makeatletter
\def\getenvcounter#1{%
  \@ifundefined{mkheader@#1}
    {\expandafter\expandafter\expandafter\@getenvcounterkernel
     \csname\ifcsname thmt@original@#1\endcsname thmt@original@\fi#1\endcsname}
    {\expandafter\expandafter\expandafter\@getenvcounterntheorem\csname mkheader@#1\endcsname}}
\def\@getenvcounterkernel#1#2#3{#2}
\def\@getenvcounterntheorem\csname#1\endcsname#2#3#4#5{#4}
\makeatother

答案2

如果您愿意使用cleveref,那么加载还crossreftools允许您通过其标签引用任何一个类似定理的环境来确定所讨论的计数器:

\documentclass{article}
\usepackage{ntheorem}
\newtheorem{theorem}{Theorem}[section]
\newtheorem{prop}[theorem]{Proposition}
\usepackage{cleveref}
\usepackage{crossreftools}

\begin{document}

\begin{theorem}\label{mythm}
This is a theorem.
\end{theorem}

\begin{prop}\label{just-a-prop}
And this is a proposition.
\end{prop}

My theorem uses the counter '\crtcrefcounter{mythm}' whereas my proposition uses the counter '\crtcrefcounter{just-a-prop}'.

\end{document}

使用 crossreftools 获取与类定理环境相关的计数器

crossreftools软件包还可与 配合使用thmtools。它包括与交叉引用相关的其他便捷工具。

相关内容