フロートをグリッドにスナップする方法

フロートをグリッドにスナップする方法

2 列の文書があり、列をまたぐフロートがいくつか含まれています。問題は、フロートが存在するとページ サイズが実質的に縮小され、残りのページ サイズが必ずしも行数の整数に一致しないという点です。そのため、TeX は段落間のスペースを増やすことで、テキストをページ境界に揃えようとします。

より良い解決策は、フロートとテキストの間のスペースを増やすことです。これは、1 列のドキュメントでは自動的に実行されます。2 列のドキュメントでもこれを実現する方法はありますか?

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}

スクリーンショット: ここに画像の説明を入力してください

望ましい解決策: ここに画像の説明を入力してください

答え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。)

関連情報