¿Es posible ajustar la "cuantización" de las longitudes de salto permitidas?

¿Es posible ajustar la "cuantización" de las longitudes de salto permitidas?

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, 1spsupongo 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:

ingrese la descripción de la imagen aquí

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 \hskip16ptun plus fijo 2*\hfillen 23 puntos. Entonces cada uno \hfillocupa (23pt-16pt)/2espacio. Está \zdespués del primero \hfill, por lo que el segundo cuadro en mi ejemplo tiene esta dimensión. Y la \roundtomacro redondea el ancho de este cuadro a múltiplo de 4 puntos. El \zse imprime después del redondeo.

La \roundboxmacro 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 \roundtomacro:

x\hbox{\z various text\quad}\roundto{4pt}\z next text is aligned.

x\zzz\zzz\zzz\zzz

información relacionada