
Eu estava no Tug.org lendo sobre algumas das primitivas do TeX. Me deparei com este exemplo 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
Eu estava tendo problemas para entender o código, então executei-o e mexi em alguns dos valores. Parece-me que os valores usados para alinhar a margem vbox verticalmente com o texto principal (ou uma determinada linha nele) são um pouco artificiais. Estou me perguntando se existe uma maneira de perguntar ao TeX a altura da linha em que \vadjust ocorre e usar isso para definir a posição do vbox.
Responder1
Não. A altura e a profundidade da linha dependem do que está na linha, e o que está na linha é decidido depois que o material \vadjust é composto.
O exemplo usa uma escora para fazer com que a maioria dos casos tenha altura e profundidade conhecidas. Você não precisa de \strutA com valores explícitos para altura e profundidade - um \strut comum funcionaria bem, desde que não haja nada maior na linha. Para elaborar, a caixa de \vadjust é adicionada à lista vertical sem qualquer salto de linha de base. A altura e profundidade dos suportes somam \baselineskip então, desde que não haja texto mais alto ou mais profundo que o suporte, pode-se alinhar as linhas de base aumentando o kerning por \baselineskip. Outros comprimentos poderiam ser usados, desde que
upwards kern = depth of strut in text + height of vadjust box
Dimensões grandes podem gerar quebras de página menos ideais.
A maneira de fazer com que funcione de maneira mais geral, não importa a profundidade do texto na linha, é forçar uma quebra de página, fazer com que a rotina de saída colete as caixas (usando \lastbox) e registre a altura e a profundidade das caixas. Mas depois de usar a rotina de saída, você não precisará medir alturas e profundidades porque as caixas podem ser combinadas em uma caixa.