我试图在文本中引用子图,但其编号不正确。这是一个最小的工作示例:
\documentclass{scrartcl}
\usepackage[demo]{graphicx}
\usepackage{subfig}
\begin{document}
\begin{figure}
\caption{Two pictures side by side}
\label{img:both}
\subfloat[first picture]{
\includegraphics[width=5cm]{name}
\label{img:first}
}
\subfloat[second picture]{
\includegraphics[width=5cm]{name}
\label{img:second}
}
\end{figure}
This example shows that figure \ref{img:second} has a wrong reference number.
But the complete float is referenced correctly: \ref{img:both}
\end{document}
答案1
该subfig
包很大程度上依赖于标题位置的知识——它是在图形或表格的上方还是下方?
包装文档除外subfig
:
3.1.5 标题位置选项
caption 包中的“position”选项指定标题是出现在图形或表格之前还是之后。这可以调整用于将浮动与周围文本分开的相对间距。但是,对于 subfig 包,它具有更重要的功能。即它确定子浮动是否属于或与要给出的最后一个 \caption 命令相关联,或者与将来某个时间要执行的下一个命令相关联。如果您发现子引用与顶级标签不一致,则可能需要专门设置“position”。最好在加载 caption 包时完成此操作,但可以随时使用 \captionsetup 命令完成。
因此通常可以使用正确的position
设置来解决这个问题:
\documentclass{article}
\usepackage[demo]{graphicx}
\usepackage{subfig}
% Telling the subfig package the desired caption positions
\captionsetup[figure]{position=t}
\captionsetup[subfigure]{position=b}
\begin{document}
\begin{figure}
\caption{Two pictures side by side}
\label{img:both}
\subfloat[first picture]{
\includegraphics[width=5cm]{name}
\label{img:first}
}
\subfloat[second picture]{
\includegraphics[width=5cm]{name}
\label{img:second}
}
\end{figure}
This example shows that figure \ref{img:second} has a wrong reference number.
But the complete float is referenced correctly: \ref{img:both}
\end{document}
但是,KOMA-Script 在这里有些特殊,因为它有自己的选项和命令来指定主标题位置。caption
/subfig
包尊重(并支持)KOMA-Script 方法,使得代码行\captionsetup[figure]{position=t}
不仅多余而且没有任何效果。(caption
有关详细信息,请参阅包文档中有关“KOMA-Script”的部分。)
因此,对于 KOMA-Script 类,需要使用 KOMA-Script 提供的选项和/或命令,至少对于主标题,例如“captions=figureheading”:
\documentclass[captions=figureheading]{scrartcl}
\usepackage[demo]{graphicx}
\usepackage{subfig}
% Telling the subfig package the desired caption position
\captionsetup[subfigure]{position=b}
\begin{document}
\begin{figure}
\caption{Two pictures side by side}
\label{img:both}
\subfloat[first picture]{
\includegraphics[width=5cm]{name}
\label{img:first}
}
\subfloat[second picture]{
\includegraphics[width=5cm]{name}
\label{img:second}
}
\end{figure}
This example shows that figure \ref{img:second} has a wrong reference number.
But the complete float is referenced correctly: \ref{img:both}
\end{document}
这样,引用就正确了,即使使用 KOMA-Script 也是如此。(请注意,由于 KOMA-Script 中的一个错误,选项“captions=figureheading”以前不起作用。这个问题已在 KOMA-Script 3.11b 版中得到修复。如果您必须处理旧版本的 KOMA-Script,并且无法更新,请尝试使用\captionabove
而不是\caption
。)
答案2
subfig
检查标题是放在图形的顶部还是底部。这是为了允许写入适当的“父”计数器和子浮点计数器,可能只随父级一起更新\caption
。为避免这种情况,提供了一种全局替换策略,该策略来自etoolbox
:
\usepackage{subfig,etoolbox}% http://ctan.org/pkg/{subfig,etoolbox}
\makeatletter
\AtBeginDocument{\patchcmd{\sf@subfloat}% <cmd>
{\maincaptiontopfalse}% <search>
{\maincaptiontoptrue}% <replace>
{}{}}% <success><failure>
\makeatother
上述内容(全局更改\maincaptiontopfalse
为\maincaptiontoptrue
)源于调用\subfloat
called后包含在子宏内的条件“父”计数器增量\sf@subfloat
(添加了注释):
\def\sf@subfloat{%
\begingroup
\@ifundefined{caption@setfloattype}%
\caption@settype
\caption@setfloattype
\@captype
\sf@ifpositiontop{% <------------ Check caption position
\maincaptiontoptrue
}{%
\maincaptiontopfalse
}%
\caption@settype{subfloat}%
\caption@settype{sub\@captype}%
\let\sf@oldlabel=\label
\let\label=\subfloat@label
\ifmaincaptiontop\else
\advance\@nameuse{c@\@captype}\@ne% <--- Step "parent" counter when \maincaptiontopfalse
\fi
\refstepcounter{sub\@captype}%
\setcounter{sub\@captype @save}{\value{sub\@captype}}%
\@ifnextchar [% %] match left bracket
{\sf@@subfloat}%
{\sf@@subfloat[\@empty]}}
以下是完整的 MWE:
\documentclass{scrartcl}% http://ctan.org/pkg/koma-script
\usepackage[demo]{graphicx}% http://ctan.org/pkg/graphicx
\usepackage{subfig,etoolbox}% http://ctan.org/pkg/{subfig,etoolbox}
\makeatletter
\AtBeginDocument{\patchcmd{\sf@subfloat}% <cmd>
{\maincaptiontopfalse}% <search>
{\maincaptiontoptrue}% <replace>
{}{}}% <success><failure>
\makeatother
\begin{document}
\begin{figure}
\centering
\caption{Two pictures side by side}
\label{img:both}
\subfloat[first picture]{
\includegraphics[width=5cm]{name}
\label{img:first}
} \qquad
\subfloat[second picture]{
\includegraphics[width=5cm]{name}
\label{img:second}
}
\end{figure}
This example shows that figure \ref{img:second} has a wrong reference number.
But the complete float is referenced correctly: \ref{img:both}.
\end{document}
答案3
有一种奇怪的行为,subfig
似乎只有当主标题是在下面子浮点数。
如果你真的想让你的主标题位于子浮动图标之上,我可以提供一个相当糟糕的修复方法:
\documentclass{scrartcl}
\usepackage[demo]{graphicx}
\usepackage{subfig}
\begin{document}
\begin{figure}
\centering
\caption{Two pictures side by side}
\label{img:both}
\addtocounter{figure}{-1}
\subfloat[first picture\label{img:first}]
{%
\includegraphics[width=5cm]{name}%
}
\qquad
\subfloat[second picture\label{img:second}]
{\includegraphics[width=5cm]{name}}
\stepcounter{figure}
\end{figure}
This example shows that figure \ref{img:second} has the correct reference number.
But the complete float is referenced correctly: \ref{img:both}
\end{document}
子浮点数的标签最好放在参数内部\subfloat
。
请小心处理强制参数中的虚假空格\subfloat
;我使用了两种可能的输入方法来解决这个问题。(缩进是可选的,我更喜欢不缩进“第一级”环境的内容。)
答案4
我将环境的标题和标签移到figure
了底部,这为我解决了这个问题。下面是我的 MWE 和输出。
\documentclass{scrartcl}
\usepackage[demo]{graphicx}
\usepackage{subfig}
\begin{document}
\begin{figure}
\subfloat[first picture]{
\includegraphics[width=5cm]{name}
\label{img:first}
}
\subfloat[second picture]{
\includegraphics[width=5cm]{name}
\label{img:second}
}
\caption{Two pictures side by side}
\label{img:both}
\end{figure}
This example shows that figure \ref{img:second} has a wrong reference number.
But the complete float is referenced correctly: \ref{img:both}
\end{document}