行位置が揃った段組

段組で行位置が揃わない

ここからはレイアウトについて考えてみましょう。まずは段組について考えてみます。LaTeXで2段組や3段組をやりたい場合は、twocolumnオプションやmulticols環境などが使えます。終わり。

……って、そんな簡単な話ではありません(笑)。

これらを何も考えずに使った場合の問題点は、隣の段と行位置が揃わないことです。図で見てみましょう。

【行の揃った段組とずれた場合を示した図】

商業印刷の和文の段組は、段の行位置を隣の段と揃えるのが一般的です。横書きなら横、縦書きなら縦で行のラインがぴっちり揃っているのが美しい状態ですね。そういうのを見なれていると、微妙にでもズレているのは不格好に見えてしまいます。

ところが、LaTeXで普通に段組にした場合、行位置は揃いません。上の図を見てもらってもわかるように、一番の原因は見出しにあります。

行取りが必要

行位置が揃っている段であっても、見出しが入ると、そこからずれてしまいます。ずれないようにするには、見出し (+ その前後の余白) が行の整数倍の高さを持つことが重要です。まあ、正確に言うと「行送りの整数倍 + 1行の高さ」ですけどね。これは横書き1段組でも言えることで、隣のページと行位置が揃うようにしようと思ったら、見出しは行の整数倍の大きさであるべきです。

【3行取り2行見出しの図】

DTPでは、2行分を使って見出しを置くことを「2行取り」、3行なら「3行取り」と言います。上の図はDTPでよく行なわれる3行取り2行見出しの例です。

もっとも、実際には、段が揃わないという問題は見出しだけの問題ではありません。挿入される図などすべて「n行取り」にする必要があります。というわけで、「n行取り」を実現するマクロを作ってみました。(【追記】ページをまたがると変になるバグを修正しました)

\ifx\Cht\undefined
 \newdimen\Cht\newdimen\Cdp
 \setbox0\hbox{\char\jis"2121}\Cht=\ht0\Cdp=\dp0\fi
\catcode`@=11
\long\def\linespace#1#2{\par\noindent
  \dimen@=\baselineskip
  \multiply\dimen@ #1\advance\dimen@-\baselineskip
  \advance\dimen@-\Cht\advance\dimen@\Cdp
  \setbox0\vbox{\noindent #2}%
  \advance\dimen@\ht0\advance\dimen@-\dp0%
  \vtop to\z@{\hbox{\vrule width\z@ height\Cht depth\z@
   \raise-.5\dimen@\hbox{\box0}}\vss}%
  \dimen@=\baselineskip
  \multiply\dimen@ #1\advance\dimen@-2\baselineskip
  \par\nobreak\vskip\dimen@
  \hbox{\vrule width\z@ height\Cht depth\z@}\vskip\z@}
\catcode`@=12

例によって、LaTeXならプリアンブル、plain TeXなら適当な所に置いておきます。これで本文で例えば、

\linespace{2}{見出し}
\linespace{3}{\large\bf 見出し1行目 \\ 見出し2行目}
\linespace{3}{\section{節見出し}}
\linespace{12}{\includegraphics[width=\hsize]{hoge.eps}}
\linespace{16}{\begin{tabular} …… \end{tabular}}

などと使えます。一番上の例は、2行取りで「見出し」と表示します。フォントの指定がない場合は本文と同じフォントになります。以下の例も同様ですが、複数行に渡ったものや、LaTeXの \section 等を入れることもできます。ただし、figure環境やtable環境のように、勝手に移動するものはうまく置けないと思います。

実際に使うときは、見出しを書くたびにいちいち何行取りと書き込まなければならないのは大変だし、後でレイアウトを変えたい場合にも対応しにくいので、\section 等のマクロをこの \linespace に書き換えて使うとかした方がいいかと思います。

ページの高さと行間の問題

ところで、「min10.tfmやjis.tfmの問題点」の回の最後に、1行の長さは文字サイズの整数倍であるべきという話をしました。ぴったり組むなら、ページの高さも行がぴったり入る大きさにしておくべきかもしれません。

また、TeXには、段落の変わり目を通常の行間より広めにすることで、設定されているページの高さ (\pageheight 等) にできるだけ合わせようとする機能があります。この機能 (\parskip) は切っておかないと行間が一定しないことになります。

% plain TeXの場合
\parskip=0pt
\topskip=\Cht
\vsize=31\baselineskip
 \advance\vsize 1zh
% LaTeXの場合
\setlength{\parskip}{0pt}
\setlength{\topskip}{\Cht}
\setlength{\textheight}{31\baselineskip}
 \addtolength{\textheight}{1zh}

上記は1ページに32行ある場合の設定です。つまり、行が32個と行間が31個分ですね。これは、行送りの値 (\baselineskip) を設定した後で設定します。また、TeXは、版面の上端から \topskip だけ下がった所に1行目のベースラインを置きます。従って、上記のように \topskip を文字の高さ (深さを含まない) と一致させることで、ぴったり詰めて組めます。

なお、plain TeXではデフォルトでは \Cht (ノーマルフォントの文字の高さ) は定義されていないと思いますが、先ほどの「n行取り」マクロの中で定義してありますので、あのマクロの下にこれを書けば問題ないです。

もっとも、従属欧文を使うのならこれでいいのですが、ひとまわり大きな欧文フォントと組み合わせる場合は、1行目に高さのある欧文が来たときにベースラインが下がってしまうかもしれません。その場合は、\topskip に少し大きめの値を設定して、行を全部のページで一定量下げることで揃える必要があります。もちろんその時は、\textheight 等もその分増やす必要がありますし、写真などを張るときは、写真をその分だけ下にずらさないと、写真と文字の上端が一致しません。


渡邉たけし <t-wata@dab.hi-ho.ne.jp>