激闘TeX:rensujiのデフォルト
最初この問題に気づいてなかったんですが、グルーの項に入ったところで前後が空きすぎになっていると気がつきましたので直します。
rensujiコマンドを定義しているplext.styを覗いてみます。
なるほどわからん。
美文書入門を紐解いてみると、『\rensujiコマンドを単純化したもの』として次の定義が載っていました。
\def\xrensuji#1{\hskip\kanjiskip\hbox to 1zw{\yoko\hss\smash{#1}\hss\rule[-0.12zw]{0zw}{1zw}}\hskip\kanjiskip}
そこでこれを丸ままプリアンブルで\xrensuji
として定義してみるとあっさり隣の行と高さが揃いました。
となるとこの定義の数値をいじればplextデフォルトの挙動を再現できるに違いない。さっき見た中では\rensujiskip=0.25
とかいうあたりが怪しそうです。
原始的なトライアル&エラーを繰り返し、結局は以下の数値でぴったりデフォルトと同じ高さになりました。
\def\rensuji#1{\hskip\kanjiskip\hbox to 1zw{\yoko\hss\smash{#1}\hss\rule[-0.25zw]{0zw}{1.25zw}}\hskip\kanjiskip}
自分で自分が何をやっているのか分からないままでは悔しいので、マクロの解読を試みました。
まず\def\rensuji#1{}
。これは簡単です。「引数を1つ取るrensujiという名のコマンドを定義する」ですねね。問題は中身です。
最初の\hskip
は文字送り方向、この場合は下への空白で、シンタックスは\hskip <dimen1> plus <dimen2> minus <dimen3>
。今はプラスマイナスがついていないので\hskip\kanjiskip
までで、kanjiskipすなわち普通の和文文字間分の空隙を前の字との間に入れるということです(当たり前だ)。
\hbox to 1zw{内容}
で「高さ1zwの箱に内容を詰める」になります。これで「字と字の間の普通の空隙」と「1文字分のスペース」が確保されました。
次は1文字の箱に詰め込む中身です。pTeXの\yoko
命令で組方向を横向きに変更。これで縦中横を入れる態勢が整いました。
水平方向に無限に伸縮するグルー\hss
で次の内容を挟むことで、連数字を行の真ん中に寄せています。
でsmashがどうしてもよく分からない……高さと幅を0に潰すって何?文字の高さ・幅じゃなく純粋にhboxの大きさのみで勝負させるってこと?それとも逆で、どんな文字が入っても大丈夫にするってこと?
どうもこれをやると配置の微調整がうまいこと行くようになるらしいんですが、明確には分かりませんでした。
ともあれ連数字にしたい実体である#1を入れて、hssで挟んで、次の\rule
も難しかったorz
\rule[ベースラインからの位置]{幅}{高さ}
は、この通りの寸法で中身の詰まった黒いボックスを描いてくれるコマンドだそうな。
……今のベースラインってどこ?
あと正負の方向もわからん。ruleはあえて幅を0にすることで『見えない支柱』になっているとのことなので、幅を持たせてみます。
今これは美文書入門の方の定義で\rule[-0.12zw]
になっています。オプションを0.12と0と-0.25に変えてみます。
あれ?ボックスはそのままで文字の位置が変わった。
ここの挙動がさっぱり分からない……直感的には、「ボックスの下端からベースラインまでの距離」を下げたらボックスもろとも下にめり込むんじゃないかと思うんだけど。
これはつまり1zw分だけ開いている窓(\hbox
)の後ろでオプション分の距離が“真の”line-heightに加算されていて、連数字の文字自体は必ず“その行幅における”ベースラインに底が揃うからこういう動きをするということでいいんでしょうか。
プラスの値だとhboxの後ろで行の高さが下向きにプラスされて広くなっているから、数字も合わせて下に落ちる的な。(それにしては高さ1zwしかないはずの黒い箱が微動だにしないのが腑に落ちないんだけど)
なんだか狐につままれたような感じですが元の-0.12zwに戻してやってhboxを抜け、あとは通常のkanjiskip間隔を入れてやって完了のようです。
結局原理はよく分かってないままですが、ruleがhboxにおける連数字本体の上下の位置を決める役割を担っていることは分かりました。 あとはplextのrensujiはボックスの高さか、あるいは前後のskipに0.25を余計に設定しているから高くなりすぎるんじゃないかということもですね。
こういうボックス周りのことを今のうちにやっておかないと多分絶対ページレイアウトの時泣く気がする。