Делаем маржу шире, чем маржа
Я использую класс 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}
Однако остались две проблемы, которые я не могу решить:
- На самом деле hspace должен быть
#3-\marginparwidth, но я не могу найти способ сделать этот расчет. - Основной текст не обтекает его. Мне
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}
Есть еще две проблемы:
- Боковые примечания, например
cite, накладываются поверх изображения, а не плавают под ним. - Я не могу заставить его работать как \ 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}
}
Ответы
У меня возникла яркая идея зарезервировать пустое место на полях, используя \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}