在普通的 TeX 和衍生格式中,可拉伸/收缩长度的概念,又称胶水或跳过或橡胶长度存在,一般定义为
<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
加号。因此,每个都占用空间。在第一个之后,因此我的示例中的第二个框具有此尺寸。宏将此框的宽度四舍五入为 4pt 的倍数。四舍五入后打印。2*\hfill
\hfill
(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