我目前正在尝试创建可链接的子定理。我参考了另一篇文章中提出的代码,如下:如何获得定理(定理 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
两件事情:
- 您应该加载
hyperef
为最后的包裹 - 您正在使用的代码是
subequations
对来自的代码的修改,因此您还需要模拟特定于的amsmath.sty
代码hyperef
subequations
\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
不在定理标题的行上。使用您当前的设置确实无法解决这个问题。