子浮点数的参考编号错误

子浮点数的参考编号错误

我试图在文本中引用子图,但其编号不正确。这是一个最小的工作示例:

在此处输入图片描述

\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)源于调用\subfloatcalled后包含在子宏内的条件“父”计数器增量\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}

在此处输入图片描述

相关内容