山口優一
私は現在ある役所でいわゆる公務員をやっております。 日本のお役所の書類には相変わらず複雑な罫線が多く、まさにTeX ユーザー泣かせと言えましょう。 ここで言っている罫線書類とは、単に文書の中に罫線を含む表があるというだけではなく、文書全体が表となっているようなものです。 例えば代表的なものとしては、あの有名な文部省の科研費申請書類なんていうものもあります。 このような罫線書類の氾濫に関しては批判も多いようですが、多くの書類に目を通さなけらばならない官庁の事務屋さんの身になれば仕方の無い面もあるのかも知れません。 とにかく多くの複雑な罫線書類書式の存在が一太郎(ワープロ一つで100メガバイトを越えるなんて...)を多くの人がなかなか手放せないでいる大きな要因となっている事は疑いようの無い事実でありましょう。
私はあえて巨大ワープロソフトに反旗を翻し、上司、同僚が一太郎でさっさと罫線書類を仕上げて行くのを横目に(そして彼らの冷笑を浴びつつ)TeX での書類作りに膨大な時間を費してきました。 私達の働く役所の場合、科研費書類のように誰かが各書式のスタイルファイルを作ってくれるなんてことはまずありえないので、そこは自分で何とかするしかありません。 この文書ではそのような膨大な無駄時間から生まれたTeX での罫線書類作りのコツを紹介します。
なお、本文書はTeX としていますが、実際には私はLaTeX (もしくはjLaTeX )を使用しています。 以下の説明ではTeX のコマンド(例えば\hbox、\vboxなど)とLaTeX のコマンド(例えば\parboxなど)が混在していますが、私達のような一般ユーザーはその区別にことさらこだわらなくて良いのではないかと思っています。 もちろんそれらの混在がまずい場合もあるのでしょうし、以下に示す例の多くはTeX のプロから見れば単にたまたまうまくいっているだけというものもあるでしょうが、まあこちらも素人なのでその点はご容赦ください。 おかしな点をご指摘頂ければ私としても幸いです。
罫線のある文書というのは、基本的には表です。 LaTeX では表作成のためにtabular環境というものがあります。 tabular環境では、細かいことを指定しなくてもなかなか見栄えの良い表を作ってくれるので、論文等の中で簡単な表を作るには非常に重宝します。 しかし、私達が扱うようなある程度寸法の決まった表や、罫線の形が変則的な表を作るのにはあまり向いていません。例えば次のようなものです。

これは次のようにして書きました。
\begin{tabular}{|p{20mm}|p{5mm}|p{15mm}|p{20mm}|p{30mm}|}
\hline
1 & 2 & 3 & 4 & 5 \\ \hline
\multicolumn{2}{|c|}{25mmです} & \multicolumn{2}{|c|}{35mmです} &%
ここは \\ \cline{1-4}
\rule[-5mm]{0mm}{10mm}ここは & \multicolumn{2}{|c|}{高さ} & 10mm &%
ぶち抜き \\ \hline
\end{tabular}
左の3階建ての部分が変則的ですが、\multicolumnで処理しています。
また、\rule[-5mm]{0mm}{10mm}という幅0mmの見えない柱を建てることにより、箱の高さを大きくしています。
tabular環境はこのような小さな表には使えるのですが、文書全体が罫線のような大きくて複雑な表を作るとなるととたんに困難になります。
大きな罫線書類を作るには、\hboxと\vboxを使うのが便利です。 これらの命令はLaTeX ではなくてTeX のプリミティブ(始めから組み込まれている基本的な機能)で、使い慣れてみるとTeX という組版システム全体がこの二つのコマンドでできているのではないだろうかと思えるくらい面白く、便利なものです。
まず\hboxですが、これは引数で指定した中身を横に並べる命令です。 通常次のような書式になります。
\hbox to length{ a b c ...}
この場合、\hboxは長さ lengthの箱(箱といっても枠は書きません)を作り、 a、 b、 cをその中に並べます。 全体の長さ lengthが指定されなければ、ちょうど中身の a、 b、 cが収まるだけの長さの箱を作ります。 a、 b、 cとしては、通常の文字、\hspaceのような空白、罫線(後で述べる\vruleなど)、\parbox(文章を入れる箱、これも後で説明します)、入れ子の\hboxなどが使えます。 そして、\hboxの中に\vruleがあると、そこで縦の罫線を引きます。 例えば\hbox{\vrule abc\vrule 農林水産\vrule}とすると

となります。 この\vruleは、\hboxの中で高さが一番高い箱の高さに伸びる性質があります。 したがって、例えば農林水産を大きな文字にして\hbox{\vrule abc\vrule{\LARGE 農林水産}\vrule}とすると

のように大きな文字に合わせて\vruleが伸びることがわかるでしょう。 \vruleがこのように伸縮する性質は便利な時もあるのですが、それだけでは罫線書類において好きな高さの線を引くというようなことはできません。 でも大丈夫、\vruleでは線の幅、高さ、深さを指定できるようになっています。 その場合次のようにします。
\vrule width 1pt height 10mm depth 5mm
widthは縦線の幅、heightは高さ、depthは深さです。 深さというのは基準線から下にはみ出る長さで、罫線書類を作る時はこの深さが大事なポイントです。 結果的に、\vrule全体の長さはheightとdepthを足した長さになります。 これらの三つの長さが省略された場合、widthは0.4pt(この値も後々必要になるので要チェックです)、height、depthは前に書いたように内容に応じて伸縮します。 例えば、
\hbox{\vrule abc\vrule width 2pt height 5mm depth 10mm xyz%
\vrule width 5pt height 10mm depth 0mm abc\vrule}
のように書くと、

という風になります。 \hboxの中の最初と最後の\vruleは何も寸法を指定していないので、全体の長さ(つまり高さ+深さ)に合わせて伸びています。 二番目の\vruleは幅が2tp、基準線から上の高さが5mm、基準線からの下の深さが10mmになっています。 三番目の\vruleは幅5pt、高さ5mmで深さはありません。
以上のような\hboxと\vruleの性質を用いると、任意の幅、高さの罫線を含む表の一行分を作ることができます。 例えば

これは次のようなコマンドで書きました。
\hbox{\vrule width 1pt height 5mm depth 10mm%
\hbox to 30mm{この幅は30mm\hfill}\vrule width 1pt%
\hbox to 40mm{\hfill この幅は40mm\hfill}\vrule width 1pt%
\hbox to 10mm{15mm\hfill}\vrule width 1pt}
この行全体の幅は30mm+40mm+15mm+4ptになっているはずです。 4ptというのは4本の罫線の合計の幅です。 ちなみに1ptは0.35mmですので、この表(といってもまだ一行ですが)全体の幅は86.4mmです。
上の例の中に\hfillというのがありますが、これは必要なだけ伸びてくれる空白 で(グルーと呼ばれます)、もしこれが無いと\hboxの指定幅(この場合30mm、40mm、10mm)を満たせないためUnderfullの警告が出されます。 一番目、三番目の欄では右側のみに\hfillがあるので中の文字は左寄せされます。 一方、中央の長さ40mmの欄は両側に\hfillがあるので、文字が両側から押されて欄の中でセンタリングされます。
さて、欄の中に文章を入れたい時はどうすれば良いでしょうか。 私達の扱う役所の罫線書類にはそのような例が数多くあります。 一太郎の場合はブロック化を指定することにより、実現することができますが、TeX の場合、単純に\hboxの中に長い文章を入れても改行などはしてくれません。 例えば、次のようなコードを処理しようとするとどうなるでしょうか。
\hbox to 40mm{\vrule この箱の幅は40mmです。でも中身の文章は40mmを%
越えています。はたして40mmの所で改行をしてくれるでしょうか?\vrule}
\hboxの中の文章が指定した40mmより長くなるためOverfullのエラーが出て、40mmを越えて全部の文章が改行無く詰め込まれてしまうはずです。 このように長い文章を自動的に改行して欄に入れたい時は、\parboxを使います。 \parboxは文章を入れる箱を作る命令で、例えば
\hbox{\vrule\hbox to 40 mm{\hfill%
\parbox[t]{30mm}{この欄全体の幅は40mmです。この文章は%
幅30mmの\verb|\parbox|の中に書かれています。%
両側に\verb|hfill|があるのでセンタリングされているはずです。}%
\hfill}\vrule}
により次のように欄中に文章を入れることができます。
\parboxは[t]オプションがあると文章を入れる箱が行の基準線から下方向に伸びるように配置し、[c]オプションでは行の中央、[b]オプションでは基準線から上方向に伸びます。 次の例を見て下さい。
さて、以上のように\hboxを使うと横幅を指定した欄(罫線書類の一部)を作ることができます。 しかしこれだけではまだまだです。 罫線書類を作るためにはまだ重要なコマンド、すなわち\vboxと\hruleがあります。
\hboxがオプションで指定した要素を横に並べたのに対し、\vboxはオプションで指定した要素を縦に並べます。
例えば\vbox{\hbox{あ}\hbox{い}\hbox{う}\hbox{え}\hbox{お}}と書くと
のようになるのです。
また、\vboxの中に\hruleがあると、そこで横線を引きます。 この線も\hboxの中の\vruleと同じように、何も指定しなければ適当な長さまで自動的に伸びてくれます。 例えば、
\vbox{{あ}\hrule{あいう}\hrule{あいうえ}\hrule{あいうえお}}
のように横幅の異なる箱を縦に並べ、その間に\hruleを入れると、
このように、\hruleの幅は何も指定していないのに、\vboxの中で最も幅の広い{あいうえお}に合った長さの横線が自動的に引かれています。
\vruleと同じように、\hruleも長さ、太さ、深さを指定することができます。 この場合も\vruleと同様
\hrule width 10mm height 1pt depth 1pt
のように書きます。
ただし、widthが長さ、heightが基準線より上の高さ、depthが基準線より下の深さとなります。
従って、線の太さはheight+depthとなります。これらを省略した場合は、heightは0.4pt、depthは0ptです。
横線に深さがあることについてはあまりピンときませんが、
\vbox{\hrule width 10mm height 4mm depth 0mm}と
\vbox{\hrule width 10mm height 2mm depth 2mm}とを一行に並べてみるとはっきりします。
つまり、次のようになります。
このように、同じ幅4mmの横線でも、2mmの深さがある二番目の方はその分だけ行の基準線より少し下がっています。 ただし、実際の作表の際には\hruleの深さはあまり気にしないでいいでしょう。
以上の\hbox、\vbox、\hrule、\vruleそして\parboxの説明で、罫線書類を作る準備がほぼ整いました。 次からは実際の例を見てみましょう。
まずは基本中の基本から。
これは、二つの箱の上下に罫線をつけただけです。このソースは次のように書きました。
\vbox{% 全体は\vboxでまとめる
\hrule% 上の横線
\hbox{%
\vrule height 10mm depth 5mm% 一番左の縦線。全体の高さと深さを決める
\hbox to 40mm{\hfill この中は40$\times$15mm\hfill}% 幅40mmの箱
\vrule% まんなかの縦線
\hbox to 50mm{\hfill この中は幅50mm\hfill}% 幅50mmの箱
\vrule}% 右の縦線
\hrule}% 下の横線
構造的には\vboxの中に\hruleと\hboxを並べて縦に積み重ねています。 中に文字を入れる箱は\hbox to 40mmのように長さを指定しています。 一番左の縦線(4行目のvrule)は重要です。 この\vruleには高さ、深さが指定されていますが、これが以後の横並び(すなわち\hboxの中身)全体の高さ、深さを規定しているのです。 この\vruleに5mmの深さがあるおかげで、次の\hboxの中の文字もその深さを受け継いで箱の下から5mm程上に持ち上げられているのです。 この方式の罫線書類の作成においては、このように一番左の\vruleが高さ、深さを決める重要な要素となることが多いのです。
今までに示したソースは、見やすいように改行されています。 お気づきのように各行の最後に%がありますが、TeX では%以後の文字列はコメントとして無視されます。 何もコメントが無いのに行の最後に%が入っているのは、その後にあるはずの改行コードを消すためです。 もしこれが無いと改行コードはスペースとして解釈され、場合によっては最終的な組版でもスペースが入れられてしまうことがあります。 これではせっかく\hbox to 50mmのように長さを指定しても台無しになってしまいます。 改行によりソースを見やすくするのはよいのですが、怪しい時は行末に%を入れましょう。 そうしないと意味不明なスペースに最後まで悩まされることになります。
さて、次のように書いても上の例と全く同じ表ができます。
\leavevmode\hbox{% 全体を\hboxでまとめる
\vrule% 一番左の縦線
\vbox{\hrule% 上の横線の左半分
\hbox to 40mm% 長さ40mmの箱を作る
{\vrule width 0mm height 10mm depth 5mm%
% 箱の中の文字位置を調節するための幅無しの見えない縦線
\hfill この中は40$\times$15mm\hfill }%
\hrule}% 下の横線の左半分
\vrule% まんなかの縦線
\vbox{\hrule% 上の横線の右半分
\hbox to 50mm% 右の長さ50mmの箱を作る
{\vrule width 0mm height 10mm depth 5mm\hfill この中は幅50mm\hfill}%
% 右の箱の中身。ここも見えない縦線が箱の中に高さと深さを与えている。
\hrule}% 下の横線の右半分
\vrule}% 右の縦線
前の書き方では全体を\vboxでまとめましたが、こちらは\hboxでまとめたものです。 このように、一つの罫線書類でも全体の見方によって幾通りかの書き方ができるのが普通です。 多くの場合好みの問題ですが、なるべく短くでき、なおかつ途中で破綻をきたさないように注意することが必要でしょう。
一番最初の\leavevmodeというのは、段落の最初に\hboxが来る場合などに必要です(上の例の場合これが無いとエラーになります)。 \leavevmodeが必要な理由は、段落の始めでは垂直モードになっているからということなのですが、なにやら難しい話なので、私はおまじないと思っています。 この点に関する若干の説明は後で紹介する参考書に書かれています。
この例で、途中に width 0mm の\vruleがありますが、これは\hboxに高さと深さを与えるための見えない縦線です。 これが無いと
になってしまいます。 もちろん、一番左の''見える''罫線で全体の高さ、深さを指定することもできるのですが、複雑な罫線書類ではこのような技巧も必要となることがあるのでここで紹介しました。
次はこんな表を作って見ましょう。\parboxの応用です。
\parboxを使うと罫線で囲まれた箱の中に文章を入れることができるのですが、私達の扱うべき書類の中には上の例のような意地悪なものもあるかも知れません。 また、限られたスペースになるべく多くの文章を入れたい時もあるでしょう。 TeX では段落の最後で\baselineskipを指定することにより、その段落の改行幅を変えることができるのです。 上の例のソースは次のようなものです。
\vbox{%
\hrule\hbox{%
\vrule height 15pt depth 30mm%
\hbox to 40mm{\hfill%
\parbox[t]{9zw}{ここは一続きの文章です。parboxを使っているので%
ちゃんと改行されていますね。}\hfill}%
\vrule%
\hbox to 40mm{\hfill%
\parbox[t]{9zw}{ここもparboxを使った文章です。しかし、改行幅が%
左の欄より少なく、もっと長い文章を入れることができるようになっ%
ています。\baselineskip=12pt}\hfill}%
\vrule}\hrule}
右側の箱の中の文章の改行幅は、\parboxの最後の\baselineskip=12により、少し小さくなっています。 この方法により罫線の中のような限られたスペースに通常より長い文章を入れることができるようになります。 もっと長い文章を入れたい時はどうするかって? あまりおすすめではありませんが、文字を小さくするしかないでしょう。
次の例は、箱の中の文字の上下位置が異なる場合はどうするかという例です。
箱の中の文字の上下位置は、前にある\vruleの高さ(height)と深さ(depth)により調節可能であり、そのためには太さ(width)0の見えない\vruleが便利であることは前にも書きました。 この例でもその技巧を使っているのですが、注意しなければならない点があります。単純に考えれば、次のようなソースで上の例は書けるように思うのですが、
\vbox{%
\hrule%
\hbox{%
\vrule{\hbox to 40mm{%
\vrule height 14.5mm depth 10.5mm width 0mm\hfill --ここが基準--\hfill}
\vrule{\hbox to 40mm{%
\vrule height 20mm depth 5mm width 0mm\hfill --ここが基準--\hfill}
\vrule{\hbox to 40mm{%
\vrule height 10mm depth 15mm width 0mm\hfill --ここが基準--\hfill}
\vrule}%
\hrule%
}
\hboxで作った幅40mmの三つの箱を\hboxで横に並べています。
それぞれの箱の中はvruleで高さと深さを決め、文字の上下位置を調節しています。
ところが、これをコンパイルしてみると次のようになってしまいます。
文字の位置が全部同じ高さに並んでしまいました。見えない罫線は働いていないのでしょうか? では、わかりやすいように、見えない罫線に幅を与えて見ましょう。
このように、見えない罫線はちゃんと各箱に高さ、深さを与えています。 ところが、\hboxというのは、含まれる要素の基準線をすべて一直線上に並べようとするため、箱全体としてはずれて配置されてしまっているのです。 このようなことを避けるためには、つぎのように各箱を\vboxに入れ、各\vboxの一番下に height 0mm の見えない\hruleを入れておくとよいのです。
\hspace*{10mm}\vbox{%
\hrule%
\hbox{%
\vrule\vbox{% 幅40mmの箱を\vboxの中に入れる
\hbox to 40mm{%
\vrule height 14.5mm depth 10.5mm width 0mm\hfill --ここが基準--\hfill}
\hrule height 0mm}% 箱の下に見えない横線を入れる
\vrule\vbox{%
\hbox to 40mm{%
\vrule height 20mm depth 5mm width 0mm\hfill --ここが基準--\hfill}
\hrule height 0mm}%
\vrule\vbox{%
\hbox to 40mm{%
\vrule height 10mm depth 15mm width 0mm\hfill --ここが基準--\hfill}
\hrule height 0mm}%
\vrule}%
\hrule%
}
\vbox全体の深さというのは、一番下の要素の深さになります。 この場合、三つの\vboxともに一番下の要素が深さ0の\hruleですから、全体の深さも0になります。 全体の深さが打ち消されて0になっているわけですから,これらを\hboxで横に並べれば前の例のように箱の上下がずらされずに済みます。
なお、ここでは高さ0の見えない\hruleを使っていますが、ここで下の横罫線を引いても構いません。 その場合、一番下の\hruleはいらなくなります。
最後に、もうちょっと複雑な罫線の例を見てみましょう。
この程度ならまだよいのですが、複雑な罫線書類を作る場合はまず簡略化して戦略をたてます。 この場合、次のように\hboxと\vboxを組み合わせるとよいでしょう。
\vbox{\hbox{箱A 箱C \vbox{箱B-上 箱B-下}}\hbox{箱D 箱E}}
最初の方の\hboxは注意が必要です。 \vbox{箱B-上 箱B-下}全体の深さは''箱B--下''の深さに等しくなるので、次のように見えない\hrule height 0ptを使って深さをそろえなければいけません。
\vbox{\hbox{%
\vbox{箱A\hrule height 0pt}%
\vbox{箱C\hrule height 0pt}%
\vbox{箱B-上 箱B-下\hrule height 0pt}}%
\hbox{箱D 箱E}}
さらに各箱に長さを与えましょう。 上の段の箱A、B、Cの幅は罫線を除いて各86pt、下の段の二つの箱E、Fは各129.2ptです。 こうすると縦罫線の幅0.4ptを含めて表全体で横幅が259.6ptとなります。 ついでに必要なところに縦罫線(\vrule)も入れておきます。
\vbox{\hrule\hbox{\vrule%
\vbox{\hbox to 86pt{箱A}\hrule height 0mm}\vrule%
\vbox{\hbox to 86pt{箱C}\hrule height 0mm}\vrule%
\vbox{\hbox to 86pt{箱B-上}\hrule%
\hbox to 86pt{ 箱B-下}\hrule height 0mm}\vrule}%
\hrule%
\hbox{\vrule\hbox to 129.2pt{箱D}\vrule%
\hbox to 129.2pt{箱E}\vrule}%
\hrule}%
これで大体の構造は出来上がりですが、各箱に高さ、深さを与えないと上下に縮まった表になってしまいます。 また、''箱A''等の文字の前後に\hfillを入れてセンタリングしておきましょう。
\vbox{\hrule\hbox{\vrule%
\vbox{\hbox to 86pt{\vrule height 24.4pt depth 12pt width 0pt\hfill 箱A%
\hfill}\hrule height 0pt}\vrule%
\vbox{\hbox to 86pt{\vrule height 24.4pt depth 12pt width 0pt\hfill 箱C%
\hfill}\hrule height 0pt}\vrule%
\vbox{\hbox to 86pt{\vrule height 15pt depth 3pt width 0pt\hfill 箱B--上%
\hfill}\hrule%
\hbox to 86pt{\vrule height 15pt depth 3pt width 0pt\hfill 箱B--下\hfill}%
\hrule height 0pt}\vrule}%
\hrule%
\hbox{\vrule\hbox to 129.2pt{\vrule height 24.4pt depth 12pt width 0pt%
\hfill 箱D\hfill}\vrule
\hbox to 129.2pt{\vrule height 24.4pt depth 12pt width 0pt\hfill 箱E%
\hfill}\vrule}%
\hrule}
これだけの表で何とも複雑なソースになってしまいました。 こんな文章を書いていながら心苦しいのですが、お役所用の罫線書類を TeX で書こうとする以上やむを得ないことであると思います。 まあ、形式の決まった書類なら、一度苦労して作っておけばあとは比較的楽です。 ただし、書式が来年度も同じであるとは限らないのですが...。
くどくどと罫線書類の書き方を書いてみましたが、いかがだったでしょうか。 多くの方は途中で馬鹿らしくなって、最後までたどり着いて頂けなかったんじゃあないかと思います。 ここまでくるとほとんど意地と趣味の世界ですから。
この文章の元となった本は
磯崎秀樹:LATEX自由自在,サイエンス社,(1992)
です。 私がしつこく書いたようなことはこの本ではほんの2、3ページで書かれています。 それで理解できてしまうような本なのです。 真に優れた書籍と言えましょう。 TeX 好きの方には是非ご一読をお勧めします。
終りに、この駄文を今は無き「一太郎 Ver.3」に捧げます。
E-mail: E-mail