
在純 TeX 和衍生格式中,可拉伸/可收縮長度的概念,又稱為 a膠水或一個跳過或一個橡膠長度存在,一般定義為
<dimen> plus <stretch-dimen> minus <shrink-dimen>
其中<dimen>
是基本尺寸, 和<stretch-dimen>
分別<shrink-dimen>
是最大拉伸和收縮值。料斗長度將在這些範圍內調整以適合其容器。
由於 TeX 計算的最小單位是縮放點 ,1sp
我假設所有拉伸/收縮計算都在此層級進行量化。
是否可以更改跳躍長度的“量化單位”?我的想法是事實並非如此,因為這是在原語的深處(內在)。但我距離 TeXpert 還很遠,如果可能的話,我認為它對於類似網格的排版任務可能很有用。
這是一個非常簡化的 MWE,它使用簡單的 TeX 程式碼建立了總體思路:
\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
其產生:
在前兩行中,使用了基本尺寸,因此規則與「網格」(最後一行)對齊。然而,在倒數第二行中,使用的拉伸組件不是網格間距的倍數,因此規則未對齊。
有沒有辦法調整“量化”,以便拉伸組件捕捉到最接近的網格間距倍數(此處為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
佔(23pt-16pt)/2
空間。這\z
是在第一個之後\hfill
,所以我的範例中的第二個框具有這個尺寸。巨集\roundto
將該框的寬度舍入為 4pt 的倍數。\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