LaTeXで多段組は珍しいことではないが、\section
などの見出しや表や画像などといった「本文の行の高さの整数倍ではない大きさ」が出現すると、次の画像のようにカラムのベースラインがずれてガタガタになることがままある。
そこでマクロを作ってこれを解決することにした。今回のマクロ作成にあたっては、TeXでDTP ― 行位置が揃った段組を参考にした。
実装
このような、本文の行の高さの整数倍の大きさを確保することを「行取り」と言うらしい。この行取りについては、参考元のサイトに書いてあるものをほとんどそのまま用いた。
ただ、参考元のサイトにある実装では何行取るのかを著者が指定する必要があったので、そこを自動で計算するような機能を加えてみた。
改良したマクロ\linespace
マクロ\linespace
は次の二つの使い方がある。
-
\linespace
{ body } -
\linespace
[ number ]{ body }
省略可能引数 number を与えた場合、\linespace
は number 分の行取りを行ってそこに body を挿入する。
number を省略した場合、内部のマクロによって number を1から順に増やしてゆき body が入る最小の行取りを行う。
行取りの量が、改ページまでの距離より長い場合
上記のサイトの実装では次のような現象が起きる。
この例では箇条書きの下部がページからはみ出ているということが分かる。これについてはdoraTeXさんにより、次のような方法で解決できると教えていただいた。
@_yyu_ \vtop to\z@ する前に,\ht\z@+\dp\z@ の分だけ\vspaceして,\allowbreakして再び -\ht\z@-\dp\z@ の分だけ\vspaceで戻るという手法で,ページ下余白部に\box\z@の出力があふれるのを防止できそうです。
— Yusuke Terada (@doraTeX) 2014, 2月 28
また、ZRさんから\@linespace
の冒頭で行なっている\noindent
によって、水平モードへ移行してしまっていて、このまま\allowbreak
するとよくないという指摘も受けた。
@doraTeX @_yyu_ \vtop~ の箇所では水平モードになっている(冒頭の \noindent のため)ので、これだと \vspace や \allowbreak が“水平モード”の動作になります。垂直方向のペナルティを入れたいはずだと思いますが。
— ZR-TeXnobabbler(既定値) (@zr_tex8r) 2014, 2月 28
これについても対応した。
これで\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 を省略した場合
number を3にした場合(3行取り)
大きなものを行取りしたとき
このように、はみ出ないようにしてある。
まとめ
きちんとしたものは意外と大変。
Future Work
しばらくは問題なく使えていたが、次のような問題があると分った。
- ページ末尾に
\section
などが来たとき首吊り状態になる可能性がある@_yyu_ あと,\linespace の中身に \section などを入れたとき,それがページ末尾に来た場合にセクション見出しがいわゆる“首つり”状態になるのを防止する必要がありますね。
— Yusuke Terada (@doraTeX) 2014, 2月 28
これよりも良いものが出来たという場合は、是非おしえてください。