
プレーンTeXおよび派生フォーマットでは、伸縮可能な長さの概念、別名のりまたはスキップまたはゴムの長さ一般的には次のように定義される。
<dimen> plus <stretch-dimen> minus <shrink-dimen>
ここで、<dimen>
は基本寸法、<stretch-dimen>
および は<shrink-dimen>
それぞれ最大の伸縮値と収縮値です。スキップ長は、コンテナーに合わせてこれらの境界内で調整されます。
TeX 計算の最小単位はスケールされたポイントであるため1sp
、すべての伸縮計算はこのレベルで量子化されていると想定します。
スキップ長の「量子化単位」を変更することは可能ですか? 私の考えでは、これはプリミティブの奥深く (内部) にあるため、変更は不可能です。しかし、私は TeXpert からは程遠いので、可能であれば、グリッドのようなタイプセッティング タスクに役立つと思います。
以下は、一般的な考え方を単純な TeX コードで設定した、非常に簡略化された MWE です。
\def\z{\hbox to 0pt{\hss\strut\vrule\hss}}
\def\zz{\z\hskip4pt}
\def\zzz{\zz\zz\zz\zz\zz}
x\z\hskip12pt plus 12pt minus 0pt %step 4pt
\z
x\z\hskip16pt plus 12pt minus 0pt %step 4pt
\z
x\hbox to 23pt{\z\hfill\hskip16pt plus 12pt minus 0pt %step 4pt
\z\hfill}
x\zzz\zzz\zzz\zzz
\bye
これにより、次のようになります。
最初の 2 行では、基本寸法が使用されているため、ルールは「グリッド」(最後の行) に揃えられています。ただし、最後から 2 番目の行では、グリッド間隔の倍数ではないストレッチ コンポーネントが使用されているため、ルールは揃えられていません。
ストレッチ コンポーネントがグリッド間隔 (ここでは4pt
) の最も近い倍数にスナップするように「量子化」を調整する方法はありますか?
答え1
「プラスとマイナス」の結果の計算は、コンピュータに依存する数値の実装を使用して TeX で行われるため、Knuth は、マクロ言語によってドキュメント内にコンピュータに依存する結果が作成されないようにするために、マクロ プログラマーがこれらの結果にアクセスする可能性をなくすことにしました。
マクロ をお勧めします\roundto{dimen}
。このマクロは、前のボックスの幅を「dimen」の乗数で再計算します。この例での使用方法は次のようになります。
x\hbox to 23pt{\z\hfill\hskip16pt plus 12pt minus 0pt \z\hfill}
x\hbox{\z\hskip16pt}\hbox to\dimexpr(23pt-16pt)/2{\hfil}\roundto{4pt}\z
x\zzz\zzz\zzz\zzz
例 (最初の行) には、23pt の固定\hskip16pt
プラスが含まれています2*\hfill
。したがって、それぞれがスペース\hfill
を占めます。 は最初の後にあるため、私の例の 2 番目のボックスはこの寸法になります。そして、マクロはこのボックスの幅を 4pt の倍数に丸めます。 は丸め後に印刷されます。(23pt-16pt)/2
\z
\hfill
\roundto
\z
マクロ\roundbox
は次のように実装できます。
\newcount\tmpnum
\def\roundto#1{\setbox0=\lastbox \tmpnum=\wd0 \dimen0=#1\relax
% \advance\tmpnum by\dimexpr \dimen0/2\relax
% uncomment this ^ ^, if you need "central" roundning
% \advance\tmpnum by\dimen0 \advance\tmpnum by-1
% uncomment this ^ ^, if you need "upper" roundning
\divide\tmpnum by\dimen0 \multiply\tmpnum by\dimen0
\wd0=\the\tmpnum sp
\box0
}
マクロの有意義な使用法\roundto
:
x\hbox{\z various text\quad}\roundto{4pt}\z next text is aligned.
x\zzz\zzz\zzz\zzz