Как привязать поплавок к сетке

Как привязать поплавок к сетке

У меня есть двухколоночный документ с несколькими охватывающими колонку плавающими элементами. Проблема в том, что плавающие элементы по сути уменьшают размер страницы, когда присутствуют, а оставшийся размер страницы не обязательно соответствует целому числу строк. Таким образом, TeX пытается выровнять текст по границам страницы, увеличивая расстояние между абзацами.

Лучшим решением было бы увеличить расстояние между float и текстом, что делается автоматически для документов с одной колонкой. Есть ли способ добиться этого также для документов с двумя колонками?

МВЭ:

\documentclass[twocolumn]{article}
\usepackage{kantlipsum}
\usepackage{mwe}
\begin{document}
\begin{figure*}[!t]
\includegraphics[width=\textwidth,height=10cm]{example-image-a}
\caption{This is a caption}
\end{figure*}
\kant[1-7]
\end{document}

Скриншот: введите описание изображения здесь

Желаемое решение: введите описание изображения здесь

решение1

Вот демонстрация принципа. Идея состоит в том, чтобы уменьшить оставшееся пространство на странице до кратного \baselineskip.

Обратите внимание, что \baselineskipмежду созданием рисунка и его окончательным местоположением все может измениться (маловероятно, если только вы не захотите изменить размер шрифта).

\documentclass[twocolumn]{article}
\usepackage{environ}
\usepackage{mwe}

% skip to the next grid interval
\newcommand{\vgrid}[2]% #1 = remaining page, #2 =  grid interval (\e.g. \baselineskip)
{\bgroup% use local registers
  \dimen0=#1\relax
  \dimen1=#2\relax
  \count1=\numexpr \dimen0 / \dimen1\relax
  \advance \dimen0 by -\count1\dimen1
  \ifdim\dimen0<0pt \advance\dimen0 by \dimen1\fi
  \vskip\dimen0
\egroup}

\makeatletter
\NewEnviron{figureboxstar}[1][t]{\@dblfloat{figure}[#1]
  \sbox0{\begin{minipage}{\textwidth}
    \BODY
  \end{minipage}}%
  \usebox0\vgrid{\dimexpr\textheight-\topskip-\ht0-\dp0-\dbltextfloatsep}{\baselineskip}%
\end@dblfloat}

\NewEnviron{figurebox}[1][t]{\@float{figure}[#1]
 \sbox0{\begin{minipage}{\columnwidth}
    \BODY
  \end{minipage}}%
  \usebox0\vgrid{\dimexpr\textheight-\topskip-\ht0-\dp0-\textfloatsep}{\baselineskip}%
\end@float}

\renewenvironment{figure}{\figurebox}{\endfigurebox}
\renewenvironment{figure*}{\figureboxstar}{\endfigureboxstar}
\makeatother

\begin{document}
\begin{figure}[t]
\includegraphics[width=\textwidth,height=10cm]{example-image-a}
\caption{This is a caption}
\end{figure}

\begin{figure*}[t]
\includegraphics[width=\textwidth,height=10cm]{example-image-a}
\caption{This is a caption}
\end{figure*}

\lipsum[1-10]
\end{document}

Оказалось, что замена окружений figureи figure*оказалась проще, чем ожидалось. (Я начал с того, что пытался использовать \@ifstar.)

Связанный контент