使用带有“facing”的 floatrow 包时,前置图片中的标题图会导致错误

使用带有“facing”的 floatrow 包时,前置图片中的标题图会导致错误

我正在写一份双面文档,有边距(基于考布克级) 并想在前言中添加一个图片。但是,在添加带标题的图片时,编译器会抛出“未定义的控制序列”错误,声称不知道环境中的基本命令figure

我设法将问题追溯到floatrow软件包,该软件包要求facing启用该选项,因为文档是双面的(否则,标题将始终位于图片的同一侧,但它们需要根据奇数页或偶数页进行交换)。因此,此选项必须保留。

奇怪的是,我还注意到,如果手动将pagenumbering设置为arabic在图形环境之前或之内,问题就解决了。但不幸的是,我想将编号改为罗马数字,而将其roman立即改回图形环境之后则不起作用。(删除标题也可以,但这当然也不是一种选择。)

以下是 MWE:

\documentclass{scrbook}
\usepackage{graphicx}
\usepackage{floatrow}

\floatsetup[figure]{% Captions for figures
    facing=yes,%
    margins=hangright,% Put captions in the margins
    capposition=beside,%
    capbesideposition={bottom,right},%
    capbesideframe=yes,%
    capbesidewidth=\marginparwidth,% Width of the caption equal to the width of the margin
    floatwidth=\textwidth,% Width of the figure equal to the width of the text
}%

\begin{document}

\frontmatter

\begin{figure}[hb]
    % \pagenumbering{arabic}
    \centering
    \includegraphics[width=\textwidth]{example-image-a}
    \caption{It's the letter A.}
    \label{fig:sample_image}
\end{figure}

\end{document}

答案1

这将创建一个新的计数器,abspage以便\thepage完全避免。它还使用辅助文件来确定浮动结束在哪个页面上。

不知道你为什么要使用 [hb],但它确实有效。请注意,这\clearpage会将队列中所有浮点数变为 [p]。

用于将或\hfill放置在文本区域的右边缘。它还会将图像推到左边缘。您可以使用或来代替。\rlap\llap\centering\hspace*{\fill}\makebox[\textwidth]{...}

\documentclass{book}
\usepackage[export]{adjustbox}% for valign
\usepackage{graphicx}

\usepackage{lipsum}% random text
\usepackage{showframe}% alignment tool

\def\bottomfraction{0.7}% default is 0.3

\newcounter{abspage}
\setcounter{abspage}{1}
\AddToHook{shipout/after}{\stepcounter{abspage}}

\newcommand{\MCright}[2][c]{% #1=t, c or b (optional), #2=\caption{...}
  \hfill\rlap{\hskip\marginparsep
    \begin{minipage}[#1]{\marginparwidth}
      \vskip-\abovecaptionskip
      #2
      \vskip-\belowcaptionskip
      \hrule height0pt
    \end{minipage}}}

\newcommand{\MCleft}[2][c]{% #1=t, c or b (optional), #2=\caption{...}
  \hfill\llap{\begin{minipage}[#1]{\marginparwidth}
    \vskip-\abovecaptionskip
    #2
    \vskip-\belowcaptionskip
    \hrule height0pt
  \end{minipage}\hskip\marginparsep\hskip\textwidth}    
    \newcounter{MCindex}
    \renewcommand{\theMCindex}{\roman{MCindex}}

\makeatletter
\newcommand{\margincaption}[2][c]{% #!=t,c or b (optional), #2=\caption{...}
  \stepcounter{MCindex}%
  \protected@write{\@auxout}{\let\theabspage\relax}%
    {\string\gdef\string\MCpage\theMCindex{\theabspage}}%
  \@ifundefined{MCpage\theMCindex}%
    {\ifodd\value{abspage} \MCright[#1]{#2}%
      \else \MCleft[#1]{#2}\fi}%
    {\ifodd\csname MCpage\theMCindex\endcsname\relax \MCright[#1]{#2}%
      \else \MCleft[#1]{#2}\fi}%
  \par}
\makeatother

\begin{document}

\frontmatter

\begin{figure}[hb]
    \includegraphics[width=\textwidth, valign=T]{example-image-a}%
    \margincaption[t]{\caption{It's the letter A.}\label{fig:sample_image}}
\end{figure}

\lipsum[1]

\begin{figure}[hb]
    \includegraphics[width=\textwidth, valign=T]{example-image-a}%
    \margincaption[t]{\caption{It's the letter A.}}
\end{figure}

\lipsum[2-3]% second float to bottom of page

\mainmatter

\end{document}

相关内容