前回の「bxjsbook が残念な件」の記事において、jsbook の左右マージンについて、以下のように記述した。
マージン領域を 36mm 確保し、それを左右で均等に配置する。
しかしこの説明と「jsbook の本文領域は端に偏っている」という事実は明らかに矛盾している。実際には、jsbook の左右マージンの設定は少し複雑で、
ヘッダ領域と本文領域で余白の量が異なる
という特徴をもっている。本記事ではこの辺りの事情について解説する。
jsbook の左右マージン
jsbook クラスにおける左右マージンの量は以下の手順により決定される。
- ヘッダ領域について:
- 左右のマージンを 18mm 取り、残った領域をヘッダ領域とする。*1
- jsbook クラスには、このヘッダ領域の幅を表す
\fullwidth
という長さ命令が存在する。
- 本文領域について:
- 可読性を保つため、本文領域の行の長さは最大全角 40 文字(40zw)に制限されている。
- 紙面の幅が小さく、ヘッダ領域の幅(
\fullwidth
)が 40zw 以下に収まる場合は、本文領域はヘッダ領域と同じマージン量を持たせる。(下掲の図 1 参照) - 紙面の幅が大きく、ヘッダ領域の幅が 40zw を超えてしまう場合は、本文領域の幅を 40zw とする。この時、本文領域はヘッダ領域とノド側(内側)の端を揃えるように配置する。つまり、ノド側のマージンは 18mm のままで、小口側(外側)のマージンが増加することになる。(図 2 参照)
- LaTeX 標準のレイアウトパラメタの一つである
\textwidth
は、この本文領域の幅を指す。
bxjsbook の左右マージン
bxjsbook のクラスのレイアウトは jsbook クラスのものを踏襲しているため、「ヘッダ領域の横幅は \fullwidth
、本文領域の横幅は \textwidth
」のように別々のパラメタを持っている。
ところで、BXJS クラスにおいては、ユーザは \setpagelayout
という命令を利用してページレイアウトを変更することができる。この \setpagelayout
命令の引数には geometry のパラメタを設定する仕様になっている。ところが、geometry パッケージは一般のクラスを対象としているため bxjsbook 特有の「\fullwidth
と \textwidth
の違い」については当然関知していない。\setpagelayout
で“textwidth”の値を(直接または間接に*2)指定した場合、どう解釈されるだろうか?
\setpagelayout*{textwidth=50zw}
答えは以下の通り。
- textwidth として指定した値は
\fullwidth
の値と見なされる。すなわち、ヘッダ領域の水平配置は geometry で設定したものに従う。 - その上で、「jsbook の本文領域の決定手順」を改めて実行する。
\fullwidth
≦ 40zw ならば、\textwidth
=\fullwidth
とし、本文領域の水平配置も geometry の設定に従う。\fullwidth
> 40zw ならば、\textwidth
= 40zw とし、本文領域の水平配置は、geometry の設定に対して、小口側(外側)のマージンを増加させたものになる。
従って、\setpagelayout*{textwidth=50zw}
を実行した場合、ヘッダ領域については「横幅が 50zw で左右マージンが同じ」となるが、本文領域については「横幅が 40zw で外側のマージンが内側よりも 10zw だけ大きい」という結果になる。
textwidth-limit パラメタ
これまで見た通り、bxjsbook においては \textwidth
(本文領域の幅)の値について「40zw が上限」と決められていて、\setpagelayout
命令ではこれを変えることができない。これが不都合な場合もあるだろう。そこで、BXjscls の 1.2a 版において「本文領域の幅の上限」を設定するクラスオプション textwidth-limit を新設した。
textwidth-limit=<整数>
:「本文領域の幅の上限」を全角単位の整数値で指定する。実際の本文領域の横幅(\textwidth
)は、\setpagelayout
で決まるヘッダ領域の横幅(\fullwidth
)とこのオプションキーの値のうちの小さい方となる。
例えば、
\documentclass[uplatex,dvipdfmx,a4paper,ja=standard, textwidth-limit=45]{bxjsbook}
とすると、本文の行長が 45 文字になる。
注意事項
- 「textwidth が実際には
\fullwidth
の指定と見なされる」というのは飽くまで\setpagelayout
命令を使った場合である。\geometry
命令を直接実行した場合は「BXJS クラス用の後処理」が行われないためこの通りにならない。 - bxjsbook クラスでは水平マージンに関して
margin=18mm
((layout=v2
の場合。))が既定値として設定されている。ここでもし\setpagelayout{textwidth=50zw}
のような設定を実行すると、textwidth の設定が“追加”されるため、結果的に left、right、textwidth(および paperwidth)の全てを指定した「過制約」の状態になってしまう。geometry の仕様ではこういう場合 textwidth の指定が無視されるので、結果的に\setpagelayout
が効かなかったように見える。