请考虑以下三个最小示例。我不明白为什么第一个不起作用而第二个和第三个却没问题。谁能告诉我?当 \thethm 指向未定义的引用时,Hyperref 似乎会出现问题。请不要问为什么指向未定义的引用是有意义的。我确实有一个很好的理由,但这与这个问题无关。
第一个例子(产生奇怪的错误):
\documentclass{article}
\usepackage[thmmarks,hyperref]{ntheorem}
\usepackage{hyperref}
\newtheorem{thm}{Theorem}
\newtheorem{prop}[thm]{Proposition}
\begin{document}
\begingroup
\def\thethm{\ref{a}'}
\addtocounter{thm}{-1}
\begin{prop}
yyy
\label{test}
\end{prop}
\endgroup
\end{document}
第二个示例,已删除 hyperref,其他代码相同(运行良好):
\documentclass{article}
\usepackage[thmmarks]{ntheorem}
\newtheorem{thm}{Theorem}
\newtheorem{prop}[thm]{Proposition}
\begin{document}
\begingroup
\def\thethm{\ref{a}'}
\addtocounter{thm}{-1}
\begin{prop}
yyy
\label{test}
\end{prop}
\endgroup
\end{document}
第三个例子,代码与第一个例子相同,但是 \thethm 被改变了(也运行良好):
\documentclass{article}
\usepackage[thmmarks,hyperref]{ntheorem}
\usepackage{hyperref}
\newtheorem{thm}{Theorem}
\newtheorem{prop}[thm]{Proposition}
\begin{document}
\begingroup
\def\thethm{1'}
\addtocounter{thm}{-1}
\begin{prop}
yyy
\label{test}
\end{prop}
\endgroup
\end{document}
答案1
我对这份文件没有任何问题:
\documentclass{article}
\usepackage{refcount}
\usepackage[thmmarks,hyperref]{ntheorem}
\usepackage{hyperref}
\newtheorem{thm}{Theorem}
\newtheorem{prop}[thm]{Proposition}
\theoremstyle{nonumberplain}
\newcommand\specialref{}
\newtheorem{unnumbered}{\specialref}
\newenvironment{thmref}[2][$'$]
{\edef\theunnumbered{\getrefnumber{#2}\unexpanded{#1}}%
\renewcommand\specialref{Theorem \ref{#2}#1}\unnumbered}
{\endunnumbered}
\newenvironment{propref}[2][$'$]
{\edef\theunnumbered{\getrefnumber{#2}\unexpanded{#1}}%
\renewcommand\specialref{Proposition \ref{#2}#1}\unnumbered}
{\endunnumbered}
\begin{document}
\begin{prop}\label{a}
aaa
\end{prop}
\begin{propref}{a}\label{test}
yyy
\end{propref}
\ref{test}
\end{document}
不建议\thethm
用active 来改变 的含义。hyperref
答案2
除了字符之外,使用不可扩展的内容\the<counter>
有点冒险。数字可以在许多上下文中使用,并且可能会在可扩展的上下文中中断,就像这里一样。下面的解决方案使用包refcount
以可扩展的方式提取参考数据。外部\refused
通知 LaTeX 有关参考使用情况,LaTeX 可以报告未定义或更改的参考。链接被剥离。
计数器减少,这意味着有两个定理具有相同的编号,因此具有相同的目标名称。可以通过修改
\theHthm
hyperref 使用的 而不是 来解决此问题\thethm
。
\refused{a}%
\edef\thethm{\getrefbykeydefault{a}{}{?}'}%
\edef\theHthm{\theHthm'}%
完整示例:
\documentclass{article}
\usepackage[thmmarks,hyperref]{ntheorem}
\usepackage{hyperref}
\usepackage{refcount}
\newtheorem{thm}{Theorem}
\newtheorem{prop}[thm]{Proposition}
\begin{document}
\begin{prop}\label{a}
Proposition with label a.
\end{prop}
\begingroup
\refused{a}%
\edef\thethm{\getrefbykeydefault{a}{}{?}'}%
\edef\theHthm{\theHthm'}%
\addtocounter{thm}{-1}%
\begin{prop}
yyy
\label{test}
\end{prop}
\endgroup
\end{document}