带有下划线的标签与 refcheck/subcaption 包冲突

带有下划线的标签与 refcheck/subcaption 包冲突

我发现 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\hyperrefhyperref\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

相关内容