Пример \vadjust на Tug.org

Пример \vadjust на Tug.org

Я был на Tug.org, читая о некоторых примитивах TeX. Я наткнулся на этот пример использования \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 

У меня возникли проблемы с пониманием кода, поэтому я запустил его и поигрался с некоторыми значениями. Мне кажется, что значения, используемые для выравнивания поля vbox по вертикали с основным текстом (или заданной строкой в ​​нем), немного надуманы. Мне интересно, есть ли способ запросить у TeX высоту строки, в которой встречается \vadjust, и использовать это для установки положения vbox.

решение1

Нет. Высота и глубина линии зависят от того, что находится на линии, а то, что находится на линии, определяется после того, как материал \vadjust будет набран.

В примере используется распорка, чтобы в большинстве случаев были известны высота и глубина. Вам не нужен \strutA с явными значениями высоты и глубины — обычный \strut будет работать нормально, если на линии нет ничего большего. Если говорить более подробно, то поле из \vadjust добавляется в вертикальный список без какого-либо пропуска базовой линии. Высота и глубина распорок добавляются к \baselineskip, поэтому, если нет текста выше или глубже распорки, можно выровнять базовые линии, кернингуя вверх на \baselineskip. Можно использовать и другие длины, если

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

Большие размеры могут привести к неидеальным разрывам страниц.

Способ заставить это работать более общо, независимо от глубины текста в строке, — это принудительно разрывать страницу, заставить процедуру вывода собирать блоки (используя \lastbox) и записывать высоту и глубину блоков. Но как только вы используете процедуру вывода, вам не придется измерять высоту и глубину, потому что блоки можно объединить в один блок.

Связанный контент