Cómo ajustar un flotador a la cuadrícula

Cómo ajustar un flotador a la cuadrícula

Tengo un documento de dos columnas con algunos flotadores que abarcan columnas. El problema es que los flotantes esencialmente reducen el tamaño de la página cuando están presentes, y el tamaño de página restante no corresponde necesariamente a un número entero de líneas. Por tanto, TeX intenta alinear el texto con los límites de la página aumentando el espacio entre párrafos.

Una mejor solución sería aumentar el espacio entre el flotante y el texto, lo que se hace automáticamente para documentos de una sola columna. ¿Hay alguna forma de lograr esto también para documentos de dos columnas?

MWE:

\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}

Captura de pantalla: ingrese la descripción de la imagen aquí

Solución deseada: ingrese la descripción de la imagen aquí

Respuesta1

Aquí hay una demostración de principio. La idea es reducir el espacio restante en la página a un múltiplo de \baselineskip.

Tenga en cuenta que esto \baselineskippodría cambiar entre la creación de la figura y la ubicación final (no es probable a menos que desee cambiar el tamaño de fuente).

\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}

Resultó que reemplazar los entornos figurey figure*era más fácil de lo esperado. (Empecé intentando usar \@ifstar.)

información relacionada