
En TeX simple y formatos derivados, el concepto de longitud estirable/contraíble, también conocido comopegamentoo unsaltaro unlongitud de gomaexiste, en general definido como
<dimen> plus <stretch-dimen> minus <shrink-dimen>
donde <dimen>
es la dimensión base y <stretch-dimen>
y <shrink-dimen>
son los valores máximos de estiramiento y contracción, respectivamente. La longitud del salto se ajustará dentro de estos límites para adaptarse a su contenedor.
Dado que la unidad más pequeña de cálculo de TeX es el punto escalado, 1sp
supongo que todos los cálculos de extensión/reducción están cuantificados en este nivel.
¿Es posible cambiar la "unidad de cuantificación" para las longitudes de salto? Mi pensamiento es que no lo es, porque esto está en lo más profundo (dentro) de lo primitivo. Pero estoy lejos de ser un TeXpert y, si fuera posible, creo que podría ser útil para tareas de composición tipográfica tipo cuadrícula.
Aquí hay un MWE muy simplificado que establece la idea general con código TeX simple:
\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 produce:
En las dos primeras líneas, se utiliza la dimensión base, por lo que las reglas se alinean con la "cuadrícula" (la última línea). Sin embargo, en la penúltima línea, se utiliza un componente de estiramiento que no es un múltiplo del espaciado de la cuadrícula, por lo que la regla no está alineada.
¿Hay alguna manera de ajustar la "cuantización" para que el componente de estiramiento se ajuste al múltiplo más cercano del espaciado de la cuadrícula (aquí 4pt
)?
Respuesta1
El cálculo de los resultados "más y menos" se realiza en TeX utilizando una implementación de números dependiente de la computadora, por lo que Knuth decidió que no habrá posibilidad de acceder a estos resultados por parte del programador macro para desactivar la creación de resultados dependientes de la computadora en el documento. lenguaje de macros.
Sugiero la macro \roundto{dimen}
. Esta macro recalcula el ancho del cuadro anterior al multiplicar por "dimen". El uso en nuestro ejemplo sería:
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
Su ejemplo (primera línea) incluye \hskip16pt
un plus fijo 2*\hfill
en 23 puntos. Entonces cada uno \hfill
ocupa (23pt-16pt)/2
espacio. Está \z
después del primero \hfill
, por lo que el segundo cuadro en mi ejemplo tiene esta dimensión. Y la \roundto
macro redondea el ancho de este cuadro a múltiplo de 4 puntos. El \z
se imprime después del redondeo.
La \roundbox
macro se puede implementar así:
\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