如何使用 hyperref 和 cleveref 交叉引用未编号的定理

如何使用 hyperref 和 cleveref 交叉引用未编号的定理

在前两个问题中(即通过不同的颜色区分 \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,但仍然存在两个问题:

  1. 我没有得到用蓝色表示的定理名称(例如Bla Bla用蓝色表示),而是Theorem 1用蓝色表示;

  2. 如果存在另一个定理,无论标签是什么,当我调用它们时,在两种情况下我都会得到theorem 1

答案1

您的文档中有两种类型的定理——编号的定理(类型 )plain和未编号的定理(类型 )named。正如您已经发现并指出的那样,很容易将 分配给编号的定理,并通过、或\label进行交叉引用。\ref\cref\aref

相反,“命名”类型的定理不是有一个与之关联的计数器。虽然可以将一个\label与未编号的定理相关联,但这样做是行不通的(事实上,不能工作):LaTeX 将愉快地将\label一些先前已递增的计数器;就您的示例代码而言,这恰好是名为的计数器section

请注意,此行为不是特定于或由其hyperrefcleveref包裹引起的。

那么,如何创建对未编号定理的交叉引用呢?幸运的是,该hyperref包提供了\hypertarget/\hyperlink机制,正好用于此目的。前一个宏用于安装“钩子”(并为钩子命名),后一个宏用于在文档的其他地方创建指向 创建的钩子的超链接\hypertarget。请注意,而\label\ref/\cref则需要论点,\hypertarget\hyperlink采取参数。第一个参数在设计上对应于\label和的单个参数;第二个参数可以是任意文本字符串。因此,如果要通过和\ref交叉引用一个对象,则两个指令的第一个参数必须相同;相反,第二个参数\hypertarget\hyperlink可以但不必相同。即,在下面的例子中,的第二个参数\hypertarget是 ,Mystery theorem而的第二个参数\hyperlinkmystery 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}

相关内容