Hyperref 和 ntheorem 的 thref:编号不一致

Hyperref 和 ntheorem 的 thref:编号不一致

当使用ntheorem选项thref获取命名参考命令时\thref,有时产生的定理数与仅产生的定理数“不同” \ref。有什么修复/解决方法的建议吗?

以下是 MWE:

\documentclass{book}
\usepackage{amsmath}
\usepackage[standard,amsmath,thref,hyperref]{ntheorem}
\usepackage{hyperref}

\makeatletter
\@addtoreset{chapter}{part}
\makeatother

\numberwithin{Theorem}{section}

\begin{document}
\part{Part 1}
\chapter{Chaptername}
\section{Test}
\begin{Theorem}\label{test1} Test theorem
\end{Theorem}

Cite with ref: \ref{test1}

Cite with thref: \thref{test1}
\end{document}

编译后为

错误输出

请特别注意,输出\thref显示定理 1.1.1.1,第一个(额外的)1 属于\part

\documentclass{book}
\usepackage{amsmath}
\usepackage[standard,amsmath,thref]{ntheorem}

\makeatletter
\@addtoreset{chapter}{part}
\makeatother

\numberwithin{Theorem}{section}

\begin{document}
\part{Part 1}
\chapter{Chaptername}
\section{Test}
\begin{Theorem}\label{test1} Test theorem
\end{Theorem}

Cite with ref: \ref{test1}

Cite with thref: \thref{test1}
\end{document}

然而,如果不使用 hyperref,一切看起来都很好:

我想要的输出


评论

如果没有该\@addtoreset{chapter}{part}行,输出还可以。但是,我需要,\@addtoreset{chapter}{part}因为对于我正在处理的这个东西,我希望章节编号位于各个部分内,如果不明确设置,hyperref就会弄混,并混淆第 1 部分的方程式 1.1.1 和第 2 部分的方程式 1.1.1。

答案1

我认为我没有理解:你的阅读器如何区分第 1 部分中的定理 1.1.1 与第 2 部分中的定理 1.1.1?

以下黑客攻击似乎有效,但像所有黑客攻击一样,它可能会产生意想不到的后果。

\makeatletter
\@addtoreset{chapter}{part}
\def\thm@fmt@hyplabel@ii#1.#2.#3{#3}
\makeatother

为了获得正确的超链接,\thref不使用\theTheorem,而是使用更复杂的\theHTheorem,它由 建立hyperref。这是内部计数器的表示HTheorem(与 同步Theorem必须考虑零件编号,否则会产生错误和重复的链接。

黑客攻击在于修改\thm@fmt@hyplabel通常定义为的定义\def\thm@fmt@hyplabel@ii#1.#2{#2},并将其放在由生成的内部引用前面hyperref:在“正常”情况下,这将是

Theorem.<chapter>.<section>.<theorem>

但根据你的设置

Theorem.<part>.<chapter>.<section>.<theorem>

因此的正常定义\thm@fmt@hyplabel是生成零件编号,而您需要的是章节编号;因此修改了定义。

相关内容