So richten Sie einen Float am Raster aus

So richten Sie einen Float am Raster aus

Ich habe ein zweispaltiges Dokument mit einigen spaltenübergreifenden Floats. Das Problem besteht darin, dass Floats, wenn vorhanden, die Seitengröße wesentlich verringern und die verbleibende Seitengröße nicht unbedingt einer ganzen Zeilenzahl entspricht. Daher versucht TeX, den Text an den Seitenrändern auszurichten, indem der Abstand zwischen den Absätzen vergrößert wird.

Eine bessere Lösung wäre, den Abstand zwischen dem Float und dem Text zu vergrößern, was bei einspaltigen Dokumenten automatisch geschieht. Gibt es eine Möglichkeit, dies auch bei zweispaltigen Dokumenten zu erreichen?

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}

Bildschirmfoto: Bildbeschreibung hier eingeben

Gewünschte Lösung: Bildbeschreibung hier eingeben

Antwort1

Hier ist eine Demonstration des Prinzips. Die Idee besteht darin, den verbleibenden Platz auf der Seite auf ein Vielfaches von zu reduzieren \baselineskip.

Beachten Sie, dass \baselineskipsich zwischen der Erstellung der Abbildung und dem endgültigen Speicherort Änderungen ergeben können (unwahrscheinlich, es sei denn, Sie möchten die Schriftgröße ändern).

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

Es stellte sich heraus, dass das Ersetzen der figureund figure*-Umgebungen einfacher war als erwartet. (Ich habe zunächst versucht, zu verwenden \@ifstar.)

verwandte Informationen