使用 subfig 的错误图形引用

使用 subfig 的错误图形引用

我正在使用该subfig包来处理子图,但出现了一个令人费解的错误,当引用\ref{}子图时,会为其分配错误的图形编号,即使对全局图形的引用确实有效:

MWE 示例如下:

\documentclass{report}

\usepackage{subfig}
\usepackage{caption}
\usepackage{lmodern} 
\usepackage{bm}

\begin{document}

\chapter{Title}

\captionsetup[figure]{position=top}
\begin{figure}[!htbp]
  \centering
  \begin{tabular}{cc}
  \subfloat[caption 1a]{
    \label{fig1a}
    \rule{3cm}{2cm}
  }
  &
  \subfloat[caption 1b]{
    \label{fig1b}
    \rule{3cm}{2cm}
  }
  \end{tabular}
  \caption{Sample caption.}
  \label{fig1}
\end{figure}


\begin{figure}[hbt]
  \centering
  \subfloat{
    \rule{3cm}{2cm}
    \label{fig2a}
  }
  \hspace{5mm}
  \subfloat{
    \rule{3cm}{2cm}
    \label{fig2b}
  }
  \caption{
  Referencing inside the caption.
  \texttt{\textbackslash subref\{fig2a\}}: \protect\subref{fig2a}, 
  \texttt{\textbackslash subref\{fig2b\}}: \protect\subref{fig2b}, 
  \texttt{\textbackslash subref*\{fig2a\}}: \protect\subref*{fig2a}, 
  \texttt{\textbackslash subref*\{fig2b\}}: \protect\subref*{fig2b},
  \texttt{\textbackslash ref\{fig2a\}}: \protect\ref{fig2a},
  \texttt{\textbackslash ref\{fig2b\}}: \protect\ref{fig2b},
  \texttt{\textbackslash ref\{fig2\}}: \protect\ref{fig2}.
  }
  \label{fig2}
\end{figure}

Subref works correctly: 
  \texttt{\textbackslash subref\{fig2a\}}:~\protect\subref{fig2a}, 
  \texttt{\textbackslash subref\{fig2b\}}:~\protect\subref{fig2b}, 
  \texttt{\textbackslash subref*\{fig2a\}}:~\protect\subref*{fig2a}, 
  \texttt{\textbackslash subref*\{fig2b\}}:~\protect\subref*{fig2b}.

$\quad$

Figure ref works correctly:
  \texttt{\textbackslash ref\{fig2\}}:~\protect\ref{fig2}.

$\quad$

Direct ref to subfigures doesn't:
  \texttt{\textbackslash ref\{fig2a\}}: \protect\ref{fig2a},
  \texttt{\textbackslash ref\{fig2b\}}: \protect\ref{fig2b},

\end{document}

是什么原因导致的?我该如何解决?

答案1

事实证明,这是处理 s 时的一个非常微妙的错误。当删除\captionsetup首字母或\captionsetup

\captionsetup[figure]{position=auto}

位于两者之间:

我犹豫着是否将其称为错误,因为这可能不完全是它subfig应该被使用的方式(但让我们面对现实吧,上一次 LaTeX 包关心它的用户会如何响应并尝试使用它又是什么时候?),但在我看来它看起来确实存在错误。

(并且,如果这对任何人来说都很明显,请考虑这两个图可以位于一个很长的文档的不同子文件中(所以祝你好运调试成功),第二个图实际上不需要调用任何\captionsetup因为它不需要它,并且如果第一个图尝试通过设置来清理自身position=auto,并且在第一次引入顶部图时未包含第二个文件(相当合理),则subfig很容易引发警告,表明有未使用的\captionsetups,积极对抗这种修复。)

答案2

一个主要问题是:为什么要混合和错配subfigcaption软件包?必然会出现微妙和不那么微妙的不兼容性。

如果您想继续使用该caption包(鉴于您正在使用文档类,我看不出有什么理由不想这样做),那么report您几乎肯定会放弃该subfig包并改用该subcaption包。当然,您遇到的“非常微妙的错误”会立即消失。

修订后的 MWE:

\documentclass{report}

%%%\usepackage{subfig} % <-- use 'subcaption' instead
\usepackage{caption,subcaption}
\usepackage{lmodern} 
\usepackage[colorlinks]{hyperref}
\begin{document}

\setcounter{chapter}{1}

\begin{figure}[!htbp]
%%\captionsetup[figure]{position=top} % this is pointless, as explained in Axel's earlier comment

\centering
\begin{subfigure}{3cm}
\caption{caption 1a}\label{fig1a}
\rule{3cm}{2cm}
\end{subfigure}%
\hspace{2\tabcolsep}
\begin{subfigure}{3cm}
\caption{caption 1b}\label{fig1b}
\rule{3cm}{2cm}
\end{subfigure}

\caption{Sample caption.}\label{fig1}
\end{figure}

\begin{figure}[hbt]
  \centering
\begin{subfigure}{3cm}
\caption{caption 2a}\label{fig2a}
\rule{3cm}{2cm}
\end{subfigure}%
\hspace{2\tabcolsep}
\begin{subfigure}{3cm}
\caption{caption 2b}\label{fig2b}
\rule{3cm}{2cm}
\end{subfigure}

\caption[Referencing inside the caption.]{%
  Referencing inside the caption.
  \texttt{\textbackslash ref\{fig2a\}}: \ref{fig2a}, 
  \texttt{\textbackslash ref\{fig2b\}}: \ref{fig2b}, 
  \texttt{\textbackslash ref*\{fig2a\}}: \ref*{fig2a}, 
  \texttt{\textbackslash ref*\{fig2b\}}: \ref*{fig2b},
  \texttt{\textbackslash ref\{fig2a\}}: \ref{fig2a},
  \texttt{\textbackslash ref\{fig2b\}}: \ref{fig2b},
  \texttt{\textbackslash ref\{fig2\}}:  \ref{fig2}.
  }
  \label{fig2}
\end{figure}

ref works correctly: 
  \verb+\ref{fig2a}+: \ref{fig2a}, 
  \verb+\ref{fig2b}+: \ref{fig2b}, 
  \verb+\ref*{fig2a}+: \ref*{fig2a}, 
  \verb+\ref*{fig2b}+: \ref*{fig2b}.


Figure ref works correctly:
  \verb+\ref{fig2}+: \ref{fig2}.


Direct refs to subfigures also work:
  \verb+\ref{fig2a}+: \ref{fig2a},
  \verb+\ref{fig2b}+: \ref{fig2b},

\end{document}

相关内容