多段組でカラムのベースラインを揃える方法

LaTeXで多段組は珍しいことではないが、\sectionなどの見出しや表や画像などといった「本文の行の高さの整数倍ではない大きさ」が出現すると、次の画像のようにカラムのベースラインがずれてガタガタになることがままある。

スクリーンショット 2013-12-30 22.43.18.png

そこでマクロを作ってこれを解決することにした。今回のマクロ作成にあたっては、TeXでDTP ― 行位置が揃った段組を参考にした。

実装

このような、本文の行の高さの整数倍の大きさを確保することを「行取り」と言うらしい。この行取りについては、参考元のサイトに書いてあるものをほとんどそのまま用いた。 ただ、参考元のサイトにある実装では何行取るのかを著者が指定する必要があったので、そこを自動で計算するような機能を加えてみた。

改良したマクロ\linespace

マクロ\linespaceは次の二つの使い方がある。

  • \linespace{ body }
  • \linespace[ number ]{ body }

省略可能引数 number を与えた場合、\linespacenumber 分の行取りを行ってそこに body を挿入する。 number を省略した場合、内部のマクロによって number を1から順に増やしてゆき body が入る最小の行取りを行う。

行取りの量が、改ページまでの距離より長い場合

上記のサイトの実装では次のような現象が起きる。

スクリーンショット 2014-04-10 01.11.30.png

この例では箇条書きの下部がページからはみ出ているということが分かる。これについてはdoraTeXさんにより、次のような方法で解決できると教えていただいた。

また、ZRさんから\@linespaceの冒頭で行なっている\noindentによって、水平モードへ移行してしまっていて、このまま\allowbreakするとよくないという指摘も受けた。

これについても対応した。

これで\linespaceによってページからはみ出す問題は解決したと思う。

\makeatletter

\def\linespace{%
  \@ifnextchar[\@linespace\@linespace@auto}
\newcount\c@linespace
\long\def\@linespace@auto#1{%
  \c@linespace = 1
  \setbox\@tempboxa\vbox{#1}%
  \setlength\@tempdima{\ht\@tempboxa}%
  \addtolength\@tempdima{\dp\@tempboxa}%
  \def\@rec{%
    \setlength\@tempdimb\Cvs
    \multiply\@tempdimb\c@linespace

    \ifdim \@tempdimb>\@tempdima
      \def\@k{\@linespace[\c@linespace]{\box\@tempboxa}}%
    \else
      \advance\c@linespace1
      \def\@k{\@rec}%
    \fi
    \@k}%
  \@rec
}

\long\def\@linespace[#1]#2{%
  \par
  \setlength\@tempdima\Cvs
  \multiply\@tempdima#1
  \advance\@tempdima-\Cvs
  \advance\@tempdima-\Cht
  \advance\@tempdima\Cdp
  \setbox\z@\vbox{#2}%
  \advance\@tempdima-\ht\z@
  \advance\@tempdima-\dp\z@
  \vspace{\ht\z@}%
  \vspace{\dp\z@}%
  \allowbreak
  \vspace{-\ht\z@}%
  \vspace{-\dp\z@}%
  \vtop to\z@{%
    \vskip.5\@tempdima
    \box\z@\vss}\quad
  \setlength\@tempdima\Cvs
  \multiply\@tempdima#1
  \advance\@tempdima-2\Cvs
  \vspace\@tempdima
  \par\nobreak}

\makeatother

結果

こんな感じになる。

number を省略した場合

スクリーンショット 2013-12-31 0.28.09.png

number を3にした場合(3行取り)

スクリーンショット 2013-12-31 0.31.10.png

大きなものを行取りしたとき

スクリーンショット 2014-04-10 1.21.54.png

このように、はみ出ないようにしてある。

まとめ

きちんとしたものは意外と大変。

Future Work

しばらくは問題なく使えていたが、次のような問題があると分った。

  • ページ末尾に\sectionなどが来たとき首吊り状態になる可能性がある

これよりも良いものが出来たという場合は、是非おしえてください。

コメント