
Ich habe auf Tug.org über einige Grundelemente von TeX gelesen. Dabei bin ich auf dieses Beispiel für die Verwendung von \vadjust gestoßen.
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
Ich hatte Probleme, den Code zu verstehen, also habe ich ihn ausgeführt und dann mit einigen Werten herumgespielt. Mir scheint, dass die Werte, die verwendet werden, um die Rand-Vbox vertikal mit dem Haupttext (oder einer bestimmten Zeile darin) auszurichten, etwas konstruiert sind. Ich frage mich, ob es eine Möglichkeit gibt, TeX nach der Zeilenhöhe der Zeile zu fragen, in der \vadjust vorkommt, und diese zu verwenden, um die Position der Vbox festzulegen.
Antwort1
Nein. Die Höhe und Tiefe der Linie hängt davon ab, was sich auf der Linie befindet, und was sich auf der Linie befindet, wird entschieden, nachdem das \vadjust-Material gesetzt wurde.
Das Beispiel verwendet eine Strebe, damit in den meisten Fällen Höhe und Tiefe bekannt sind. Sie benötigen \strutA nicht mit expliziten Werten für Höhe und Tiefe – eine normale \strut würde ausreichen, solange nichts Größeres auf der Linie steht. Um es genauer zu beschreiben: Das Feld von \vadjust wird der vertikalen Liste ohne Grundliniensprung hinzugefügt. Die Höhe und Tiefe der Streben ergeben zusammen \baselineskip. Solange also kein Text höher oder tiefer als die Strebe ist, kann man die Grundlinien durch Unterschneidung um \baselineskip ausrichten. Andere Längen können verwendet werden, solange
upwards kern = depth of strut in text + height of vadjust box
Große Abmessungen können zu weniger idealen Seitenumbrüchen führen.
Um es allgemeiner zu machen, unabhängig von der Texttiefe in der Zeile, muss man einen Seitenumbruch erzwingen, die Ausgaberoutine die Boxen sammeln lassen (mit \lastbox) und die Höhe und Tiefe der Boxen aufzeichnen. Wenn man aber die Ausgaberoutine verwendet, muss man Höhen und Tiefen nicht mehr messen, weil die Boxen zu einer Box kombiniert werden können.