假设我正在使用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
软件包还可与 配合使用thmtools
。它包括与交叉引用相关的其他便捷工具。