Tug.org の \vadjust の例

Tug.org の \vadjust の例

私は Tug.org で TeX のプリミティブのいくつかについて読んでいました。そこで、\vadjust の使用例を見つけました。

1. \def\strutA#1#2{\vrule height#1 depth#2 width0pt}
2. \def\ta#1%
3. {%
4.      \strutA{8.5pt}{3.5pt}%
5.      \vadjust
6.      {
7.           \vbox to 0pt
8.           {
9.                \kern-1\baselineskip
10.                \moveleft0.5in\hbox to 0.5in
11.                {
12.                     \strutA{8.5pt}{3.5pt}%
13.                     \hfil#1\kern1em
14.                }
15.                \vss
16.           }%
17.      }%
18. }
19. \hsize=4.75in
20. There are cries, sobs, confusion among the people, and at that moment
21. the cardinal himself, the Grand Inquisitor, passes by the cathedral.
22. He is an old man, almost ninety, tall and erect,\ta{100} with a
23. withered face and sunken eyes, in which there is still a gleam of
24. light. He is not dressed in his brilliant cardinal's robes, as he was
25. the day before, when he was burning the enemies of the Roman
26. Church~\char144 \kern2em\hfill Fyodor Dostoyevsky, {\it The Brothers
27. Karamazov}\par 

コードを理解するのに苦労したので、実行してからいくつかの値をいじってみました。マージン vbox をメイン テキスト (またはその中の特定の行) と垂直に揃えるために使用される値は、少し不自然であるように思われます。\vadjust が出現する行の行の高さを TeX に要求し、それを使用して vbox の位置を設定する方法があるかどうか疑問に思っています。

答え1

いいえ。行の高さと深さは行上にあるものによって決まり、行上にあるものは \vadjust マテリアルがタイプセットされた後に決定されます。

この例では、ほとんどの場合に高さと深さが既知になるようにストラットを使用しています。高さと深さの明示的な値を持つ \strutA は必要ありません。行にそれ以上のものがない限り、通常の \strut で十分です。詳しく言うと、\vadjust のボックスは、ベースライン スキップなしで垂直リストに追加されます。ストラットの高さと深さの合計は \baselineskip なので、ストラットよりも高いテキストや深いテキストがない限り、\baselineskip でカーニングしてベースラインを揃えることができます。他の長さを使用することもできますが、次の条件を満たしている必要があります。

upwards kern = depth of strut in text + height of vadjust box

サイズが大きいと、ページ区切りが理想的でない可能性があります。

行のテキストの深さに関係なく、より一般的に動作させる方法は、強制的にページ区切りを挿入し、出力ルーチンでボックスを収集し (\lastbox を使用)、ボックスの高さと深さを記録することです。ただし、出力ルーチンを使用すると、ボックスを 1 つのボックスに結合できるため、高さと深さを測定する必要はありません。

関連情報