Делаем маржу шире, чем маржа

Sep 08 2020

Я использую класс Tufte и хочу создать фигуру поля, которая больше, чем поле, заставляя текст обтекать ее. Какие-нибудь советы, как я могу это сделать? Я попытался адаптировать, @tufte@margin@floatboxчтобы получить третий аргумент для ширины мини-страницы, но у меня ничего не получилось. Вот что у меня получилось:

\newsavebox{\myfloatboxwider}
\newenvironment{myfloatwider}[3][-1.2ex]%
  {\FloatBarrier% process all floats before this point so the figure/table numbers stay in order.
  \begin{lrbox}{\myfloatboxwider}%
  \hspace*{-\marginparwidth}%
  \begin{minipage}{#3}%
    \@tufte@caption@font%
    \def\@captype{#2}%
    \hbox{}\vspace*{#1}%
    \@tufte@caption@justification%
    \@tufte@margin@par%
    \noindent%
  }
  {\end{minipage}%
  \end{lrbox}%
  \marginpar{\usebox{\myfloatboxwider}}%
  }

\newenvironment{marginfigurewider}[2][-1.2ex]%
  {\begin{myfloatwider}[#1]{figure}{#2}}
  {\end{myfloatwider}}

Чтобы использовать как это

\begin{marginfigurewider}[1.2ex]{2.0\marginparwidth}%
  \includegraphics[width=\linewidth]{myimage.jpg}
  \caption{Some caption.}
  \label{fig:somefig}
\end{marginfigurewider}

Однако остались две проблемы, которые я не могу решить:

  1. На самом деле hspace должен быть #3-\marginparwidth, но я не могу найти способ сделать этот расчет.
  2. Основной текст не обтекает его. Мне wrapfigдля этого нужно что-то подобное ?

Обновить

Этим достигается более или менее то, что я хочу:

\setlength\columnsep{\marginparsep}
\begin{wrapfigure}{O}[\dimexpr \marginparwidth+\marginparsep]{2.0\marginparwidth}
  \FloatBarrier%
  \vspace{-0.7\baselineskip}
  \begin{minipage}[b]{2.0\marginparwidth}
    \includegraphics[width=\linewidth]{myimage.jpg}
    \caption{Some caption.}
    \label{fig:somefig}
  \end{minipage}
\end{wrapfigure}

Есть еще две проблемы:

  1. Боковые примечания, например cite, накладываются поверх изображения, а не плавают под ним.
  2. Я не могу заставить его работать как \ newenvironment. Ничего не отображается и width=\linewidthпомечено как не число. Я могу жить, используя код вручную, но было бы лучше, если бы это была среда. Попытка ниже:

\newenvironment{marginfigurewide}[1]%
  {\FloatBarrier%
  \setlength\columnsep{\marginparsep}%
  \begin{wrapfigure}{O}[\dimexpr \marginparwidth+\marginparsep]{2.0\marginparwidth}%
      \vspace{-0.7\baselineskip}%
      \begin{minipage}[b]{2.0\marginparwidth}
  }
  {\end{minipage}%
  \end{wrapfigure}
  }

Ответы

1 JohnKormylo Sep 09 2020 at 07:42

У меня возникла яркая идея зарезервировать пустое место на полях, используя \marginpar. Однако wrapfigure по-прежнему будет перекрывать любой ранее существовавший материал полей. Я не знаю ни одного способа отложить начало wrapfigure до тех пор, пока поле не станет пустым (кроме как вручную).

Кроме того, я не знаю, почему \wrapfigureработает, а почему \begin{wrapfigure}нет, но, вероятно, это как-то связано с локальными и глобальными значениями.

\documentclass{tufte-book}
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{marginfix}

\usepackage{lipsum}
\usepackage{showframe}

\newsavebox{\marginbox}

\makeatletter
\newenvironment{marginfigurewide}[1]% #1 = width
{\begin{lrbox}{\marginbox}%
  \def\@captype{figure}%
  \begin{minipage}{#1}}%
{\end{minipage}\end{lrbox}%
  %\setlength{\intextsep}{0pt}%
  \setlength{\columnsep}{\marginparsep}%
  \wrapfigure{r}[\dimexpr \marginparwidth+\marginparsep]{\wd\marginbox}
    \usebox\marginbox
  \endwrapfigure
  \marginpar{\rule{0pt}{\dimexpr \ht\marginbox+\dp\marginbox+2\intextsep}}}% reserve space in margin
\makeatother

\begin{document}

\begin{marginfigurewide}{2\marginparwidth}
  \includegraphics[width=\linewidth]{example-image}
  \caption{Some caption.}
  \label{fig:somefig}
\end{marginfigurewide}

test\sidenote{\LipsumPar{2}}

\LipsumPar{1}

\end{document}

Версия будет перекрывать нижнюю часть страницы.

\documentclass[twoside]{tufte-book}
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{marginfix}

\usepackage{lipsum}
\usepackage{showframe}

\newsavebox{\marginbox}

\makeatletter
\newenvironment{marginfigurewide}[1]% #1 = width
{\begin{lrbox}{\marginbox}%
  \def\@captype{figure}%
  \begin{minipage}{#1}}%
{\end{minipage}\end{lrbox}%
  \setlength{\columnsep}{\marginparsep}%
  \dimen0=\dimexpr \pagegoal-\pagetotal-\ht\strutbox\relax% remaining space on page
  \dimen1=\dimexpr \ht\marginbox+\dp\marginbox+\intextsep\relax% size of figure
  \ifdim\dimen1<\dimen0% fits page
    \wrapfigure{r}[\dimexpr \marginparwidth+\marginparsep]{\wd\marginbox}
      \usebox\marginbox
    \endwrapfigure
    \marginpar{\rule{0pt}{\dimexpr \ht\marginbox+\dp\marginbox+2\intextsep}}% reserve space in margin
  \else% overlaps bottom
    \wrapfigure{r}[\dimexpr \marginparwidth+\marginparsep]{\wd\marginbox}
      \raisebox{\dimexpr \dimen0-\intextsep-\ht\marginbox}[\dimexpr \dimen0-2\intextsep][0pt]{\usebox\marginbox}%
    \endwrapfigure
    \marginpar{\rule{0pt}{\dimen0}}%
  \fi}
\makeatother

\begin{document}

\begin{marginfigurewide}{2\marginparwidth}
  \includegraphics[width=\linewidth]{example-image}
  \caption{Some caption.}
  \label{fig:somefig}
\end{marginfigurewide}

Place note here.\sidenote{\LipsumPar{2}}

%\LipsumPar{1}
\lipsum[1-2]

\begin{marginfigurewide}{2\marginparwidth}
  \includegraphics[width=\linewidth]{example-image}
  \caption{Some caption.}
  \label{fig:somefig}
\end{marginfigurewide}

Place note here.\sidenote{\LipsumPar{2}}

\lipsum[3-4]

\end{document}