我正在使用该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
很容易引发警告,表明有未使用的\captionsetup
s,积极对抗这种修复。)
答案2
一个主要问题是:为什么要混合和错配subfig
和caption
软件包?必然会出现微妙和不那么微妙的不兼容性。
如果您想继续使用该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}