![如何使用 hyperref 和 cleveref 交叉引用未编号的定理](https://linux22.com/image/325922/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20hyperref%20%E5%92%8C%20cleveref%20%E4%BA%A4%E5%8F%89%E5%BC%95%E7%94%A8%E6%9C%AA%E7%BC%96%E5%8F%B7%E7%9A%84%E5%AE%9A%E7%90%86.png)
在前两个问题中(即通过不同的颜色区分 \ref 和 \cref, 和通过修改 \ref 获得“定理 x 的证明”标题) 我解决了一些与hyperref
和相关的问题cleverref
。下面是我遇到的一个新问题,可以用以下 MWE 来举例说明:
\documentclass[12pt]{article}%
\usepackage{amsmath}%
\usepackage{amsthm}%
\usepackage{amsfonts}%
\usepackage{amssymb}%
\usepackage[usenames,dvipsnames]{xcolor}%
\theoremstyle{plain}
\newtheorem{theorem}{Theorem}
\newtheoremstyle{named}{}{}{\itshape}{}{\bfseries}{.}{.5em}{\thmnote{#3}}
\theoremstyle{named}
\newtheorem*{namedtheorem}{Theorem}
\usepackage{varioref}
\usepackage{hyperref}
\usepackage[noabbrev,nameinlink]{cleveref}
\hypersetup{colorlinks={true},linkcolor={red},citecolor={green}}
\newcommand{\aref}[2][blue]{%
\hypersetup{linkcolor=#1}%
\cref{#2}%
\hypersetup{linkcolor=red}%
}
\begin{document}
\section{Bla}
\label{section:bla}
\begin{theorem}[Bla]
\label{th:bla}
Bla.
\end{theorem}
\begin{namedtheorem}[Bla Bla]
\label{thm:blabla}
Bla bla
\end{namedtheorem}
\section{Bla Bla}
In section \ref{section:bla}, we get \aref{th:bla}, but we also get \aref{thm:blabla}.
\end{document}
因此,所有的问题是,当我将\aref
(的修改\cref
)应用于时namedtheorem
,它没有给我定理的名称(例如蓝色的“Bla Bla”),而是给我蓝色的“第 1 节”。
有办法解决吗?
感谢您的时间。
评论后编辑:
一位用户好心地尝试修复此问题。即,将其替换\newtheorem*
为\newtheorem
,然后\crefname{namedtheorem}{theorem}{theorems}
在加载后使用cleverref
。通过这样做,超链接不再显示为section
,但仍然存在两个问题:
我没有得到用蓝色表示的定理名称(例如
Bla Bla
用蓝色表示),而是Theorem 1
用蓝色表示;如果存在另一个定理,无论标签是什么,当我调用它们时,在两种情况下我都会得到
theorem 1
。
答案1
您的文档中有两种类型的定理——编号的定理(类型 )plain
和未编号的定理(类型 )named
。正如您已经发现并指出的那样,很容易将 分配给编号的定理,并通过、或\label
进行交叉引用。\ref
\cref
\aref
相反,“命名”类型的定理不是有一个与之关联的计数器。虽然可以将一个\label
与未编号的定理相关联,但这样做是行不通的(事实上,不能工作):LaTeX 将愉快地将\label
与一些先前已递增的计数器;就您的示例代码而言,这恰好是名为的计数器section
。
请注意,此行为不是特定于或由其hyperref
或cleveref
包裹引起的。
那么,如何创建对未编号定理的交叉引用呢?幸运的是,该hyperref
包提供了\hypertarget
/\hyperlink
机制,正好用于此目的。前一个宏用于安装“钩子”(并为钩子命名),后一个宏用于在文档的其他地方创建指向 创建的钩子的超链接\hypertarget
。请注意,而\label
和\ref
/\cref
则需要一论点,\hypertarget
并\hyperlink
采取二参数。第一个参数在设计上对应于\label
和的单个参数;第二个参数可以是任意文本字符串。因此,如果要通过和\ref
交叉引用一个对象,则两个指令的第一个参数必须相同;相反,第二个参数\hypertarget
\hyperlink
可以但不必相同。即,在下面的例子中,的第二个参数\hypertarget
是 ,Mystery theorem
而的第二个参数\hyperlink
是mystery theorem
。
顺便说一句,我设置了一个名为的辅助宏\bref
,可以简化将交叉引用的颜色从红色切换为其他颜色(默认:蓝色)的过程。(另外,我忍不住想创造一个机会来写一个包含\aref
、\bref
和\cref
...的句子)
\documentclass[12pt]{article}
\usepackage{amsthm,xcolor}
\usepackage[colorlinks, linkcolor=red]{hyperref}
\usepackage[noabbrev,nameinlink]{cleveref}
\theoremstyle{plain}
\newtheorem{theorem}{Theorem}
\newtheoremstyle{named}%
{}{}{\itshape}{}{\bfseries}{.}{.5em}{\thmnote{#3}}
\theoremstyle{named}
\newtheorem*{namedtheorem}{Theorem}
\newcommand{\aref}[2][blue]{%
\begingroup%
\hypersetup{linkcolor=#1}%
\cref{#2}%
\endgroup}
\newcommand\bref[3][blue]{%
\begingroup%
\hypersetup{linkcolor=#1}%
\hyperlink{#2}{#3}%
\endgroup}
\begin{document}
\section{Uno} \label{section:uno}
\begin{theorem}[Bla]\label{thm:bla}
Bla.
\end{theorem}
\begin{namedtheorem}[\hypertarget{thm:mystery}{Mystery theorem}]
Bla bla.
\end{namedtheorem}
\section{Due}
In \cref{section:uno}, we have both \aref{thm:bla} and an unnumbered \bref{thm:mystery}{mystery theorem}.
\end{document}