
Рассмотрим этот код:
\documentclass{article}
\begin{document}
\pagestyle{empty}
\def\contents{%
\parindent = 0pt
\LARGE
\strut
\raise\baselineskip
\vtop
{%
{\Large\smash{Chapter}\par}%
title\par
}%
\par
}
\newbox\tempbox
\loggingoutput
\vspace*{20pt}%
\begingroup
\contents
\endgroup
\clearpage
\vspace*{20pt}%
\setbox\tempbox\vbox
\bgroup
\contents
\egroup
\noindent \box \tempbox
\end{document}
Предполагается \contents
, что заголовок главы будет Chapter
написан в одну строку, а название главы — строкой ниже.
Я использую это \raise\baselineskip\vtop{...}
приспособление, чтобы удалить Chapter
текст из отмеченных звездочкой глав, но при этом оставить названия глав в том же вертикальном положении на странице.
Все было хорошо, пока мне не понадобилось поместить этот заголовок главы в рамку перед тем, как поместить его на страницу вывода. Я думал, что простое включение всего этого в \vbox
to use later with \box
сработает, но я бы не спрашивал здесь, если бы это сработало :)
В журнале для первой страницы показано следующее:
...\glue 20.0
...\glue 0.0
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 0.0
...\hbox(22.0+6.60007)x345.0
и это для второго:
...\glue 20.0
...\glue 0.0
...\glue(\parskip) 0.0 plus 1.0
...\glue(\lineskip) 1.0
...\hbox(22.0+6.60007)x345.0
единственное отличие состоит в том, что в первом случае TeX вставляет \baselineskip
перед содержимым, а во втором — перед \lineskip
.
Почему он это делает? И как сделать иначе?
решение1
Вы использовали \vbox
, поэтому опорная точка находится на нижней линии, поэтому высота блока составляет 22pt, так как это уже больше, чем \baselineskip
tex не может гарантировать \baselineskip
пространство между опорной точкой предыдущего узла и опорной точкой добавляемого блока, поэтому он вставляет \lineskip
вместо этого. Вы могли бы использовать \vtop
вместо этого , что упрощает получение правильного пространства в начале (и усложняет получение правильного пространства после)
Хм, на самом деле, я полагаю, что главное отличие здесь в том, что в первом случае \baselineskip
используется крупный шрифт, поэтому он просто помещается (следовательно, добавляется как 0pt), но во втором случае крупный шрифт находится внутри рамки, поэтому вы используете небольшой пропуск базовой линии.
вы получаете \baselineskip (0pt)
с
{\LARGE\noindent \box \tempbox\par}