マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

jsbook や bxjsbook の左右マージンを理解する

前回の「bxjsbook が残念な件」の記事において、jsbook の左右マージンについて、以下のように記述した。

マージン領域を 36mm 確保し、それを左右で均等に配置する。

しかしこの説明と「jsbook の本文領域は端に偏っている」という事実は明らかに矛盾している。実際には、jsbook の左右マージンの設定は少し複雑で、

ヘッダ領域と本文領域で余白の量が異なる

という特徴をもっている。本記事ではこの辺りの事情について解説する。

jsbook の左右マージン

jsbook クラスにおける左右マージンの量は以下の手順により決定される。

  • ヘッダ領域について:
    • 左右のマージンを 18mm 取り、残った領域をヘッダ領域とする。*1
    • jsbook クラスには、このヘッダ領域の幅を表す \fullwidth という長さ命令が存在する。
  • 本文領域について:
    • 可読性を保つため、本文領域の行の長さは最大全角 40 文字(40zw)に制限されている。
    • 紙面の幅が小さく、ヘッダ領域の幅(\fullwidth)が 40zw 以下に収まる場合は、本文領域はヘッダ領域と同じマージン量を持たせる。(下掲の図 1 参照)
    • 紙面の幅が大きく、ヘッダ領域の幅が 40zw を超えてしまう場合は、本文領域の幅を 40zw とする。この時、本文領域はヘッダ領域とノド側(内側)の端を揃えるように配置する。つまり、ノド側のマージンは 18mm のままで、小口側(外側)のマージンが増加することになる。(図 2 参照)
    • LaTeX 標準のレイアウトパラメタの一つである \textwidth は、この本文領域の幅を指す。
[図 1: 用紙横幅が大きい(a4paper)場合]
 
[図 2: 用紙横幅が小さい(a5paper)場合]

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 が効かなかったように見える。

*1:厳密にいうと、ヘッダ領域の幅は、紙面横幅から 36mm を減じた後に全角幅の整数倍に丸めた値になる。

*2:例えば、margin や hscale を指定すると、結果的に textwidth を指定したことになる。