\vadjust ejemplo en Tug.org

\vadjust ejemplo en Tug.org

Estaba en Tug.org leyendo sobre algunas de las primitivas de TeX. Me encontré con este ejemplo de uso de \vadjust.

1. \def\strutA#1#2{\vrule height#1 depth#2 width0pt}
2. \def\ta#1%
3. {%
4.      \strutA{8.5pt}{3.5pt}%
5.      \vadjust
6.      {
7.           \vbox to 0pt
8.           {
9.                \kern-1\baselineskip
10.                \moveleft0.5in\hbox to 0.5in
11.                {
12.                     \strutA{8.5pt}{3.5pt}%
13.                     \hfil#1\kern1em
14.                }
15.                \vss
16.           }%
17.      }%
18. }
19. \hsize=4.75in
20. There are cries, sobs, confusion among the people, and at that moment
21. the cardinal himself, the Grand Inquisitor, passes by the cathedral.
22. He is an old man, almost ninety, tall and erect,\ta{100} with a
23. withered face and sunken eyes, in which there is still a gleam of
24. light. He is not dressed in his brilliant cardinal's robes, as he was
25. the day before, when he was burning the enemies of the Roman
26. Church~\char144 \kern2em\hfill Fyodor Dostoyevsky, {\it The Brothers
27. Karamazov}\par 

Tenía problemas para entender el código, así que lo ejecuté y luego modifiqué algunos de los valores. Me parece que los valores utilizados para alinear el margen vbox verticalmente con el texto principal (o una línea determinada en él) son un poco artificiales. Me pregunto si hay una manera de pedirle a TeX la altura de la línea en la que ocurre \vadjust y usarla para establecer la posición de vbox.

Respuesta1

No. La altura y la profundidad de la línea dependen de lo que hay en la línea, y lo que hay en la línea se decide después de componer el material de \vadjust.

El ejemplo utiliza un puntal para que la mayoría de los casos tengan altura y profundidad conocidas. No necesita \strutA con valores explícitos para altura y profundidad; un \strut ordinario funcionaría bien, siempre y cuando no haya nada más grande en la línea. Para profundizar, el cuadro de \vadjust se agrega a la lista vertical sin ningún salto de línea base. La altura y la profundidad de los puntales suman \baselineskip, por lo que, siempre que no haya texto más alto o más profundo que el puntal, se pueden alinear las líneas de base haciendo un interletraje según \baselineskip. Se podrían utilizar otras longitudes, siempre y cuando

upwards kern = depth of strut in text + height of vadjust box

Las dimensiones grandes podrían dar lugar a saltos de página menos ideales.

La forma de hacer que funcione de manera más general, sin importar la profundidad del texto en la línea, es forzar un salto de página, hacer que la rutina de salida recopile los cuadros (usando \lastbox) y registre la altura y profundidad de los cuadros. Pero una vez que use la rutina de salida, no tendrá que medir alturas y profundidades porque las cajas se pueden combinar en una sola.

información relacionada