白屋書房Blog

組版・縦書きサイト「白屋書房」(https://hakuoku.github.io/agakuTeX/)のブログです

激闘TeX:rensujiのデフォルト

f:id:isaribisaitoh:20171123150309j:plain

 最初この問題に気づいてなかったんですが、グルーの項に入ったところで前後が空きすぎになっていると気がつきましたので直します。

 rensujiコマンドを定義しているplext.styを覗いてみます。

f:id:isaribisaitoh:20171123150352j:plain

 なるほどわからん
 美文書入門を紐解いてみると、『\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文字分のスペース」が確保されました。

f:id:isaribisaitoh:20171123150907j:plain

 次は1文字の箱に詰め込む中身です。pTeX\yoko命令で組方向を横向きに変更。これで縦中横を入れる態勢が整いました。

 水平方向に無限に伸縮するグルー\hssで次の内容を挟むことで、連数字を行の真ん中に寄せています。

f:id:isaribisaitoh:20171123150654j:plain

 でsmashがどうしてもよく分からない……高さと幅を0に潰すって何?文字の高さ・幅じゃなく純粋にhboxの大きさのみで勝負させるってこと?それとも逆で、どんな文字が入っても大丈夫にするってこと?
 どうもこれをやると配置の微調整がうまいこと行くようになるらしいんですが、明確には分かりませんでした。

 ともあれ連数字にしたい実体である#1を入れて、hssで挟んで、次の\ruleも難しかったorz

 \rule[ベースラインからの位置]{幅}{高さ}は、この通りの寸法で中身の詰まった黒いボックスを描いてくれるコマンドだそうな。
 ……今のベースラインってどこ?
 あと正負の方向もわからん。ruleはあえて幅を0にすることで『見えない支柱』になっているとのことなので、幅を持たせてみます。

f:id:isaribisaitoh:20171123150927j:plain

 今これは美文書入門の方の定義で\rule[-0.12zw]になっています。オプションを0.12と0と-0.25に変えてみます。

f:id:isaribisaitoh:20171123151027j:plainf:id:isaribisaitoh:20171123151042j:plainf:id:isaribisaitoh:20171123151057j:plain

 あれ?ボックスはそのままで文字の位置が変わった。
 ここの挙動がさっぱり分からない……直感的には、「ボックスの下端からベースラインまでの距離」を下げたらボックスもろとも下にめり込むんじゃないかと思うんだけど。
 これはつまり1zw分だけ開いている窓(\hbox)の後ろでオプション分の距離が“真の”line-heightに加算されていて、連数字の文字自体は必ず“その行幅における”ベースラインに底が揃うからこういう動きをするということでいいんでしょうか。
 プラスの値だとhboxの後ろで行の高さが下向きにプラスされて広くなっているから、数字も合わせて下に落ちる的な。(それにしては高さ1zwしかないはずの黒い箱が微動だにしないのが腑に落ちないんだけど)

 なんだか狐につままれたような感じですが元の-0.12zwに戻してやってhboxを抜け、あとは通常のkanjiskip間隔を入れてやって完了のようです。

 結局原理はよく分かってないままですが、ruleがhboxにおける連数字本体の上下の位置を決める役割を担っていることは分かりました。 あとはplextのrensujiはボックスの高さか、あるいは前後のskipに0.25を余計に設定しているから高くなりすぎるんじゃないかということもですね。

 こういうボックス周りのことを今のうちにやっておかないと多分絶対ページレイアウトの時泣く気がする。