我发现 hyperref/subcaption/refcheck 包之间存在冲突。
我正在使用带有子图和子标题的图形,启用 hyperref 包在文档中进行交叉引用,到目前为止没有任何问题。
\subref{...}
当我包含 refcheck 包来检查未使用的 bib 项目和交叉引用时,如果我使用命令将子图交叉链接到带有下划线的图形标签(例如\label{fig:A_A_A}
,在图形环境的标题中,参见带有的 MWE \subref{fig:A_A_A}
),则会导致问题
它抱怨缺少 $,就好像它想将下划线置于数学模式一样。
Missing $ inserted [...]
有什么想法可以解决此冲突吗?
编辑:如果我在其他两个包之前加载 refcheck 包,文档可以正常编译,但实际上 refcheck 包的功能会丢失,即没有关于未使用的引用的警告。
移动终端
\documentclass[a4paper,11pt]{report}
\usepackage{hyperref} %Make hyperlinks available
\usepackage{subcaption} %Make subfigures available
%commenting out this package restores the working version
\usepackage{refcheck} %Warn for unused bibitems
\begin{document}
Figure \ref{fig:A_A} %no problem with the reference here
\begin{figure}[bhpt!]
\centering
\begin{subfigure}{0.45\textwidth}
\rule{3cm}{3cm} %dummy for a grafic
\caption{A subcaption}
\label{fig:A_A_A} %problematic label for subfigure with underscores
\end{subfigure}
\caption[A short caption]%
%caption without the subref works without any problems
%{A long caption without a subref}
%caption with subref for the label with underscores causes problem
{A long caption with a subref with underscores \subref{fig:A_A_A}}
\label{fig:A_A} %no problem with label for figure with underscores
\end{figure}
\end{document}
答案1
问题是refcheck
与 并不真正兼容hyperref
,因为refcheck
它不尊重 的宏hyperref
的星号版本\ref
(这可以看作 的一个错误refcheck
,可能应该报告给软件包维护者)。
当你这样做时\subref{fig:A_A_A}
它会扩展为如下形式:
\hyperref[fig:A_A_A]{%
\begingroup
\caption@setoptions{sub}%
\subcaption@reffmt\p@subref{%
\ref*{sub@fig:A_A_A}%
}%
\endgroup
}
注意这里的 的使用\ref*
。这是因为覆盖了用于生成超链接的hyperref
常规。因此还提供了作为一种替代方案,它的作用与 相同,只是它不生成超链接(您可以将 视为与 相同)。在上述情况下,参考文本和链接使用不同的参考标签,因此使用了。\ref
\hyperref
hyperref
\ref*
\ref
\ref{A}
\hyperref[A]{\ref*{A}}
\ref*
因为refcheck
覆盖\ref
不考虑 的hyperref
宏\ref*
,因此您基本上失去了带星号版本的“功能”。因此\ref*{A}
现在将展开,就像您编写了 一样\ref{*}{A}
。
如果是\ref*{sub@fig:A_A_A}
,你会得到\ref{*}{sub@fig:A_A_A}
,这显然不会很好地工作。你会收到一条警告
LaTeX Warning: Reference `*' on page 1 undefined on input line XY
并且由于{sub@fig:A_A_A}
不是\ref
宏的参数,您将得到正常的“下划线错误”。
编辑
作为一种快速修复,您可以在序言中使用类似这样的内容:
\makeatletter
\AtBeginDocument{%
\@ifpackageloaded{refcheck}{%
\@ifundefined{hyperref}{}{%
\let\T@ref@orig\T@ref
\def\T@ref#1{\T@ref@orig{#1}\wrtusdrf{#1}}%
\let\@refstar@orig\@refstar
\def\@refstar#1{\@refstar@orig{#1}\wrtusdrf{#1}}%
\DeclareRobustCommand\ref{\@ifstar\@refstar\T@ref}%
}%
}{}%
}
\makeatother
此代码恢复了hyperref
的定义\ref
,并修补了\T@ref
(无星号版本)和\@refstar
(星号版本)宏hyperref
。