包含方括号的子标题标签在图片标题中显示效果不佳

包含方括号的子标题标签在图片标题中显示效果不佳

在交叉引用具有无机复合物分子式的物品时,我经常需要在各种标签中使用“[”和“]”。一切都很顺利,直到我注意到包装存在\subref{...}问题subcaption

在主标题中使用时,任何带有方括号的标签的条目都无法正确引用,并且不会为子图分配任何字母。标签中的括号和花括号不会引起任何问题:

\documentclass{article}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{hyperref}
    \hypersetup{colorlinks = true}

\begin{document}

Check out Figure~\ref{fig:as[many]square[brackets]as[i]want[and]still[works]fine}. Subfigures~\ref{fig:foo{bar}-a} and \ref{fig:foo(bar)-b} are referenced properly in the main caption, whereas \ref{fig:foo[bar]-c} isn't.

\begin{figure}
    \centering
    \begin{subfigure}[b]{0.3\linewidth}
        \includegraphics[width=\linewidth]{example-image-a}
        \caption{}
        \label{fig:foo{bar}-a}
    \end{subfigure}
    \begin{subfigure}[b]{0.3\linewidth}
        \includegraphics[width=\linewidth]{example-image-b}
        \caption{}
        \label{fig:foo(bar)-b}
    \end{subfigure}
    \begin{subfigure}[b]{0.3\linewidth}
        \includegraphics[width=\linewidth]{example-image-c}
        \caption{}
        \label{fig:foo[bar]-c}
    \end{subfigure}
    \caption{
        \subref{fig:foo{bar}-a} -- OK;
        \subref{fig:foo(bar)-b} -- OK;
        \subref{fig:foo[bar]-c} -- WTF?
    }
    \label{fig:as[many]square[brackets]as[i]want[and]still[works]fine}
\end{figure}

\end{document}

在此处输入图片描述

我无法直接替换或停止使用标签中的方括号。我该如何\subref{...}正确处理它们?

作为尼丁评论中指出,这很可能与软件包有关hyperref。禁用它实际上会恢复预期的功能。不幸的是,我hyperref也需要。

答案1

这是 中的一个愚蠢的错误subcaption,我只是在将参数作为可选参数传递给 时忘记在参数周围加上花括号\hyperref。这是我的错;hyperref这里的包没问题。

我将在接下来的几天内修复它(并将新版本上传到 CTAN),在此之前,加载包后可以使用以下错误修复subcaption

\makeatletter
% fix usage of [] within \subref{...}
\renewcommand*\@subref[2]{%
  \caption@ifundefined\hyperref
    {\subcaption@ref{#1}{#2}}%
    {\hyperref[{#2}]{\subcaption@ref{*#1}{#2}}}}
\makeatother

https://gitlab.com/axelsommerfeldt/caption/issues/40

答案2

更新答案

问题是由 引起的hyperref\subref展开时,标签作为可选参数(在方括号内)传递给hyperref命令。如下所示:

\hyperref[fig:foo[bar]-c]{
...
}

由于标签中有],可选参数在该点终止。因此,-c]在打印实际子标题之前先打印剩余部分。

将标签中的右方括号括在括号内可以解决此问题。将标签更改为:

\label{fig:foo[bar{]}-c}

在此处输入图片描述

\documentclass{article}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{hyperref}
\hypersetup{colorlinks = true}

\begin{document}

Check out Figure~\ref{fig:as[many]square[brackets]as[i]want[and]still[works]fine}. Subfigures~\ref{fig:foo{bar}-a} and \ref{fig:foo(bar)-b} are referenced properly in the main caption, whereas \ref{fig:foo[bar{]}-c} isn't.

\begin{figure}
    \centering
    \begin{subfigure}[b]{0.3\linewidth}
        \includegraphics[width=\linewidth]{example-image-a}
        \caption{}
        \label{fig:foo{bar}-a}
    \end{subfigure}
    \begin{subfigure}[b]{0.3\linewidth}
        \includegraphics[width=\linewidth]{example-image-b}
        \caption{}
        \label{fig:foo(bar)-b}
    \end{subfigure}
    \begin{subfigure}[b]{0.3\linewidth}
        \includegraphics[width=\linewidth]{example-image-c}
        \caption{}
        \label{fig:foo[bar{]}-c}
    \end{subfigure}
    \caption{
        \subref{fig:foo{bar}-a} -- OK;
        \subref{fig:foo(bar)-b} -- OK;
        \subref{fig:foo[bar{]}-c} -- WTF?
    }
    \label{fig:as[many]square[brackets]as[i]want[and]still[works]fine}
\end{figure}

\end{document}

另一个解决方法是使用\subref*而不是\subref。但它不会创建链接,如下图所示。

在此处输入图片描述

相关内容