为什么 subfig 使用自定义宏呈现错误的标题编号?

为什么 subfig 使用自定义宏呈现错误的标题编号?

当子图被包装在自定义宏中时,子图会显示错误的标题编号。有趣的是,如果没有宏,但使用技术上相同的命令,标题编号是正确的。

使用此代码:

\documentclass[a4paper]{scrbook}

\usepackage{subfig}
\usepackage{graphicx}
\usepackage{calc}
\usepackage{ifthen,changepage}

\begin{document}

\newlength{\alength}
\newlength{\blength}
\newcommand{\widefloat}[1]{%
  \setlength{\alength}{\textheight-\pagetotal}
  \setlength{\blength}{\totalheightof{\parbox{\linewidth}{#1}}}
  \ifdim\alength<\blength\clearpage\fi
  \ifthispageodd{\noindent\makebox[\textwidth][l]{#1}}{\noindent\makebox[\textwidth][r]{#1}}
}

\begin{figure}
  %\noindent\makebox[\textwidth][r]{
  \widefloat{
  \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
  \subfloat[]{\includegraphics[scale=.5]{example-image-b}}}
  \caption{ Two foo figures. }%
\end{figure}

\end{document}

我们得到了错误的标题标签(c 和 d): 第一的

现在,如果我们交换这两行:

  %\noindent\makebox[\textwidth][l]{
  \widefloat{

  \noindent\makebox[\textwidth][l]{
  %\widefloat{

结果是这样的: 在此处输入图片描述

鉴于这两行在技术上应该以相同的方式解释,我无法弄清楚哪里出了问题。该widefloat宏应该检测其中的内容是奇数页还是偶数页。然后它将内容刷新到左侧或右侧边距。

答案1

该代码旨在将“浮点数”排版为不是真正的浮点数,而是“只是在那里”。

如果您计划\widefloatfigure环境中使用,则完全不需要测量。这解决了子图标签的问题,因为它们不再排版两次。

\documentclass[a4paper]{scrbook}

\usepackage{subfig}
\usepackage{graphicx}

\begin{document}

\newcommand{\widefloat}[1]{%
  \centering
  \ifthispageodd
    {\makebox[\textwidth][l]{#1}}%
    {\makebox[\textwidth][r]{#1}}%
}

\begin{figure}
  \widefloat{
    \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
    \subfloat[]{\includegraphics[scale=.5]{example-image-b}}
  }
  \caption{Two foo figures.}
\end{figure}

\begin{figure}
  \widefloat{
    \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
    \subfloat[]{\includegraphics[scale=.5]{example-image-b}}
  }
  \caption{Two foo figures.}
\end{figure}

\begin{figure}
  \widefloat{
    \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
    \subfloat[]{\includegraphics[scale=.5]{example-image-b}}
  }
  \caption{Two foo figures.}
\end{figure}

\begin{figure}
  \widefloat{
    \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
    \subfloat[]{\includegraphics[scale=.5]{example-image-b}}
  }
  \caption{Two foo figures.}
\end{figure}

\end{document}

在此处输入图片描述

通过进行一些更改,如果标题适合一行,您还可以让(全局)标题左对齐或右对齐。

\documentclass[a4paper]{scrbook}

\usepackage{subfig}
\usepackage{graphicx}

\DeclareCaptionStyle{singleleft}[justification=raggedright]{}
\DeclareCaptionStyle{singleright}[justification=raggedleft]{}

\newcommand{\widecaption}{%
  \ifthispageodd
    {\captionsetup{style=singleleft}}
    {\captionsetup{style=singleright}}
  \caption
}

\begin{document}

\newcommand{\widefloat}[1]{%
  \centering
  \ifthispageodd
    {\makebox[\textwidth][l]{#1}}%
    {\makebox[\textwidth][r]{#1}}%
}

\begin{figure}
  \widefloat{
    \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
    \subfloat[]{\includegraphics[scale=.5]{example-image-b}}
  }
  \widecaption{Two foo figures.}
\end{figure}

\begin{figure}
  \widefloat{
    \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
    \subfloat[]{\includegraphics[scale=.5]{example-image-b}}
  }
  \widecaption{Two foo figures.}
\end{figure}

\begin{figure}
  \widefloat{
    \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
    \subfloat[]{\includegraphics[scale=.5]{example-image-b}}
  }
  \widecaption{Two foo figures.}
\end{figure}

\begin{figure}
  \widefloat{
    \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
    \subfloat[]{\includegraphics[scale=.5]{example-image-b}}
  }
  \widecaption{Two foo figures.}
\end{figure}

\end{document}

在此处输入图片描述

答案2

正如 @egreg 在他的评论中解释的那样,问题在于你实际上排版了所有内容两次。 仅排版一次,然后使用保存的框确实解决了您的问题:

\documentclass[a4paper]{scrbook}

\usepackage{subfig}
\usepackage{graphicx}

\begin{document}

\newlength{\alength}
\newlength{\blength}
\newsavebox\widefloatBox
\newcommand{\widefloat}[1]
  {%
    \setlength{\alength}{\dimexpr\textheight-\pagetotal\relax}%
    \sbox\widefloatBox{\parbox{\linewidth}{#1}}%
    \setlength{\blength}{\dimexpr\ht\widefloatBox+\dp\widefloatBox\relax}%
    \ifdim\alength<\blength\clearpage\fi
    \ifthispageodd
      {\noindent\makebox[\textwidth][l]{\usebox\widefloatBox}}
      {\noindent\makebox[\textwidth][r]{\usebox\widefloatBox}}%
  }

\begin{figure}
  \widefloat
    {%
      \subfloat[]{\includegraphics[scale=.5]{example-image-a}}
      \subfloat[]{\includegraphics[scale=.5]{example-image-b}}
    }%
  \caption{Two foo figures.}%
\end{figure}

\end{document}

相关内容