在页边距中定义自定义浮动环境?

在页边距中定义自定义浮动环境?

我正在使用fancyhdrtikz在页面的左侧偶数和右侧奇数处创建自定义侧边栏(对于书籍,因此使用 documentstyle book)。有没有办法在这些侧边栏中创建一个新的“浮动区域”和相应的“浮动环境”,这样我就可以在侧边栏中添加小图形,它们会根据可用空间在页面侧边栏中流动,就像我使用 时它们在正文中流动一样\begin{figure}?以下是我的意思的说明:

在此处输入图片描述

答案1

下面提供了对marginfloats (和marginfiguremargintable) 的一些基本支持。您不能将\marginpar它们一起使用 (当然可以,但不要指望它能正常工作)。

此外,如果您使用普通浮点数,我无法保证它们的编号是正确的(我没有彻底测试过。使用单个浮点数进行的快速测试figure表明编号确实正确,但不知何故边距浮动分页符太早了)。

我让它eso-pic进行输出例程黑客攻击,它使用atbegshi,主要是为了帮助放置使用\AtTextUpperLeft

编辑:缺少了一个\fi应该匹配的\ifhmode(现在已添加),我还添加了\marginfloat@sep控制两个 s 之间最小距离的长度marginfloat。此外,我已改用\vtop to \textheight而不是\vbox to \textheight,因此\ht\marginfloat@ins\z@不再需要。

代码如下:

\documentclass[]{book}

\usepackage{showframe} % only to show that the placement is roughly correct

\usepackage{eso-pic}

\makeatletter
\AddToShipoutPictureBG{\marginfloat@handle}
\newinsert\marginfloat@ins
\count\marginfloat@ins\z@
\skip\marginfloat@ins\z@
\dimen\marginfloat@ins\textheight
\newlength\marginfloat@sep
\marginfloat@sep2ex
\newenvironment{marginfloat}[1]
  {%
    \def\@captype{#1}%
    \ifhmode\@bsphack\fi
    \insert\marginfloat@ins\bgroup
      \penalty100
      \vbox\bgroup
        \hsize=\marginparwidth
        \linewidth=\hsize
        \@afterheading
        \@afterindentfalse
  }%
  {%
      \egroup
      \vfill
      \vskip\marginfloat@sep
    \egroup
    \@Esphack
  }
\newenvironment{marginfigure}{\marginfloat{figure}}{\endmarginfloat}
\newenvironment{margintable}{\marginfloat{table}}{\endmarginfloat}

\newcommand*\marginfloat@handle
  {%
    \setbox\marginfloat@ins\vtop to \textheight
      {\null\vfill\unvbox\marginfloat@ins\vskip-\marginfloat@sep}%
    \if@twoside
      \ifodd\c@page
        \AtTextUpperLeft
          {%
            \put(\LenToUnit{\dimexpr\textwidth+\marginparsep\relax},0)
              {\box\marginfloat@ins}%
          }%
      \else
        \AtTextUpperLeft
          {%
            \put(\LenToUnit{-\dimexpr\marginparsep+\marginparwidth\relax},0)
              {\box\marginfloat@ins}%
          }%
      \fi
    \else
      \AtTextUpperLeft
        {%
          \put(\LenToUnit{\dimexpr\textwidth+\marginparsep\relax},0)
            {\box\marginfloat@ins}%
        }%
    \fi
  }
\makeatother

\usepackage[]{graphicx}
\usepackage{duckuments} % dummy content

\begin{document}
\blindduck[1-4]
\begin{marginfigure}
  \centering
  \includegraphics[width=\linewidth]{example-image-duck}
  \caption{a duck}
\end{marginfigure}
\blindduck[1]
\begin{marginfigure}
  \centering
  \includegraphics[width=\linewidth]{example-image-duck}
  \caption{another duck}
\end{marginfigure}
\begin{marginfigure}
  \centering
  \includegraphics[width=\linewidth]{example-image-duck}
  \caption{another duck}
\end{marginfigure}
\begin{marginfigure}
  \centering
  \includegraphics[width=\linewidth]{example-image-duck}
  \caption{another duck}
\end{marginfigure}
\begin{marginfigure}
  \centering
  \includegraphics[width=\linewidth]{example-image-duck}
  \caption{another duck}
\end{marginfigure}
\begin{marginfigure}
  \centering
  \includegraphics[width=\linewidth]{example-image-duck}
  \caption{another duck}
\end{marginfigure}
\blindduck[1-4]
\begin{marginfigure}
  This is even more text.
\end{marginfigure}
\blindduck[5]
\begin{marginfigure}
  This is even more text that is really long.
\end{marginfigure}
\clearpage
\begin{marginfigure}
  \centering
  \includegraphics[width=\linewidth]{example-image-duck}
  \caption{yet another duck}
\end{marginfigure}
\blindduck[full]
\end{document}

该文件的第一页:

在此处输入图片描述

相关内容