在子定理环境中为定理创建的引用标签链接到之前的定理

在子定理环境中为定理创建的引用标签链接到之前的定理

我目前正在尝试创建可链接的子定理。我参考了另一篇文章中提出的代码,如下:如何获得定理(定理 1.A.、定理 1.B.、定理 2.)的子编号?

我尝试使用以下代码将其调整为编号,但它似乎链接到子定理环境中的定理之前的定理。我想知道是否有办法解决这个问题。例如,运行下面的代码并链接到定理 2A 会导致定理 1。任何帮助都将不胜感激。谢谢。

\documentclass{article}
\usepackage[linktoc=page,colorlinks,linkcolor=blue,citecolor=blue,urlcolor=blue]{hyperref}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}

\usepackage{amsfonts}
\usepackage{amsthm}

\makeatletter
\newenvironment{subtheorem}[1]{%
  \def\subtheoremcounter{#1}%
  \refstepcounter{#1}%
  \protected@edef\theparentnumber{\csname the#1\endcsname}%
  \setcounter{parentnumber}{\value{#1}}%
  \setcounter{#1}{0}%
  \expandafter\def\csname the#1\endcsname{\theparentnumber.\Alph{#1}}%
  \ignorespaces
}{%
  \setcounter{\subtheoremcounter}{\value{parentnumber}}%
  \ignorespacesafterend
}
\makeatother
\newcounter{parentnumber}

% - - environments
\newtheorem{thm}{Theorem}

\setcounter{secnumdepth}{5}
\setcounter{tocdepth}{5}


\begin{document}

\begin{thm}\label{thm:one}
One
\end{thm}

\begin{subtheorem}{thm}\label{thm:two}
\begin{thm}\label{thm:twoA}
Two, first part
\end{thm}

\begin{thm}\label{thm:twoB}
Two, second part
\end{thm}
\end{subtheorem}

\begin{thm}\label{thm:three}
Three
\end{thm}

\ref{thm:one}, \ref{thm:two}, \ref{thm:twoA}, \ref{thm:twoB}, \ref{thm:three}.

\end{document}

答案1

两件事情:

  1. 您应该加载hyperef最后的包裹
  2. 您正在使用的代码是subequations对来自的代码的修改,因此您还需要模拟特定于的amsmath.sty代码hyperefsubequations

示例输出

\documentclass{article}

\usepackage[utf8]{inputenc}

\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amsthm}

\usepackage[linktoc=page,colorlinks,linkcolor=blue,citecolor=blue,urlcolor=blue]{hyperref}

\newcounter{parentnumber}
\makeatletter
\newenvironment{subtheorem}[1]{%
  \def\subtheoremcounter{#1}%
  \refstepcounter{#1}%
  \protected@edef\theparentnumber{\csname the#1\endcsname}%
  \protected@edef\theHparentnumber{\@ifundefined{theH#1}%
  \csname the#1\endcsname\csname theH#1\endcsname}%
  \setcounter{parentnumber}{\value{#1}}%
  \setcounter{#1}{0}%
  \expandafter\def\csname the#1\endcsname{\theparentnumber.\Alph{#1}}%
  \expandafter\def\csname theH#1\endcsname{\theparentnumber.\Alph{#1}}%
  \ignorespaces
}{%
  \setcounter{\subtheoremcounter}{\value{parentnumber}}%
  \ignorespacesafterend
}
\makeatother

\newtheorem{thm}{Theorem}

\begin{document}

\begin{thm}\label{thm:one}
One
\end{thm}

Text

text

text

\begin{subtheorem}{thm}\label{thm:two}
\begin{thm}\label{thm:twoA}
Two, first part
\end{thm}

Text

text

text

\begin{thm}\label{thm:twoB}
Two, second part
\end{thm}
\end{subtheorem}

Text

text

text

\begin{thm}\label{thm:three}
Three
\end{thm}

\ref{thm:one}, \ref{thm:two}, \ref{thm:twoA}, \ref{thm:twoB}, \ref{thm:three}.

\end{document}

.aux以下是文件中的内容

\newlabel{thm:one}{{1}{1}{}{thm.1}{}}
\newlabel{thm:two}{{2}{1}{}{thm.2}{}}
\newlabel{thm:twoA}{{2.A}{1}{}{thm.2.A}{}}
\newlabel{thm:twoB}{{2.B}{1}{}{thm.2.B}{}}
\newlabel{thm:three}{{3}{1}{}{thm.3}{}}

这表明额外的 hyperref 参数已正确设置,与计数器匹配。您的原始代码生成

\newlabel{thm:twoA}{{2.A}{1}{}{thm.1}{}}

这并不是你想要的。

thm:twoA和的链接位置thm:twoB现在很好。但是,请注意thm:two指向subtheorem发出的位置。后续部分\begin{thm}增加了一些垂直空间,因此链接thm:two不在定理标题的行上。使用您当前的设置确实无法解决这个问题。

相关内容