当 \thethm 指向未定义的引用时,hyperref 会出现问题

当 \thethm 指向未定义的引用时,hyperref 会出现问题

请考虑以下三个最小示例。我不明白为什么第一个不起作用而第二个和第三个却没问题。谁能告诉我?当 \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 可以报告未定义或更改的参考。链接被剥离。

计数器减少,这意味着有两个定理具有相同的编号,因此具有相同的目标名称。可以通过修改 \theHthmhyperref 使用的 而不是 来解决此问题\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}

相关内容