
Em TeX simples e formatos derivados, o conceito de comprimento extensível/encolhível, também conhecido comocolaou umpularou umcomprimento de borrachaexiste, em geral definido como
<dimen> plus <stretch-dimen> minus <shrink-dimen>
onde <dimen>
é a dimensão base e <stretch-dimen>
e <shrink-dimen>
são os valores máximos de estiramento e contração, respectivamente. O comprimento do salto será ajustado dentro desses limites para caber no seu contêiner.
Como a menor unidade de cálculo do TeX é o ponto escalado, 1sp
presumo que todos os cálculos de estiramento/retração são quantizados neste nível.
É possível alterar a "unidade de quantização" para comprimentos de salto? Meu pensamento é que não, porque isso está no fundo (dentro) do primitivo. Mas estou longe de ser um TeXpert e, se fosse possível, acho que poderia ser útil para tarefas de composição tipográfica do tipo grade.
Aqui está um MWE muito simplificado que define a ideia geral com código TeX simples:
\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
que produz:
Nas duas primeiras linhas é utilizada a dimensão base, para que as regras se alinhem com a “grade” (a última linha). Porém, na penúltima linha, é utilizado um componente de estiramento que não é um múltiplo do espaçamento da grade, portanto a regra não fica alinhada.
Existe uma maneira de ajustar a "quantização" para que o componente de estiramento se encaixe no múltiplo mais próximo do espaçamento da grade (aqui, 4pt
)?
Responder1
O cálculo dos resultados "mais e menos" é feito no TeX usando implementação de números dependente do computador, então Knuth decidiu que não haverá possibilidade de acessar esses resultados pelo programador de macro, a fim de desabilitar a criação de resultados dependentes do computador no documento por linguagem macro.
Eu sugiro a macro \roundto{dimen}
. Esta macro recalcula a largura da caixa anterior para a multiplicação de "dimen". O uso em nosso exemplo seria:
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
Seu exemplo (primeira linha) inclui \hskip16pt
mais fixo 2*\hfill
em 23pt. Então cada um \hfill
ocupa (23pt-16pt)/2
espaço. Está \z
depois do primeiro, \hfill
então a segunda caixa no meu exemplo tem essa dimensão. E a \roundto
macro arredonda a largura desta caixa para múltiplos de 4pt. O \z
é impresso após arredondamento.
A \roundbox
macro pode ser implementada assim:
\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
}
Uso significativo de \roundto
macro:
x\hbox{\z various text\quad}\roundto{4pt}\z next text is aligned.
x\zzz\zzz\zzz\zzz