![Hyperref 和 ntheorem 的 thref:编号不一致](https://linux22.com/image/245442/Hyperref%20%E5%92%8C%20ntheorem%20%E7%9A%84%20thref%EF%BC%9A%E7%BC%96%E5%8F%B7%E4%B8%8D%E4%B8%80%E8%87%B4.png)
当使用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
是生成零件编号,而您需要的是章节编号;因此修改了定义。