Опубликован: 07.02.2007 | Доступ: свободный | Студентов: 3791 / 1190 | Оценка: 4.56 / 3.95 | Длительность: 23:09:00
Специальности: Художник
Лекция 8:

Блоки и клей

Еще раз о линейках

В аргументе команды \hbox может присутствовать и TeX'овская команда \vrule. Ее ценность в том, что она автоматически создает линейку, высота и глубина которой равна высоте и глубине объемлющего блока (ширина этой линейки будет по умолчанию равна 0{,}4 пункта). Как объяснялось в разд. 3.10 , можно задать в явном виде ширину линейки с помощью ключевого слова width, высоту - с помощью ключевого слова height, а также (о чем в "Набор текста" не говорилось) глубину с помощью ключевого слова depth (эти три ключевых слова могут следовать после \vrule в произвольном порядке). Приведем один пример использования \vrule внутри \hbox.

\begin{flushleft}
\hbox{%
\vrule\hspace{.5em}\parbox{.9\textwidth}%
{Иногда используется следующий способ выделения текста:
абзац набирается с некоторым отступом от левого поля,
а слева от него, вровень с левым полем, печатается
вертикальная линейка.}}
\end{flushleft}

Предыдущий абзац в исходном тексте выглядел так:

\begin{flushleft}
\hbox{%
\vrule\hspace{.5em}\parbox{.9\textwidth}%
{Иногда используется следующий способ выделения текста:
абзац набирается с некоторым отступом от левого поля,
а слева от него, вровень с левым полем, печатается
вертикальная линейка.}}
\end{flushleft}

Этот текст нуждается в некоторых пояснениях. Во-первых, в последней строке первая из фигурных скобок закрывает аргумент команды \parbox, а вторая - \hbox. Во-вторых, мы воспользовались окружением \flushleft, чтобы LaTeX сам позаботился о разумных отступах до и после абзаца. Параметр \textwidth означает, как мы помним, ширину страницы. Теперь рассмотрим, что присутствует внутри \hbox. Сначала там идет линейка, затем отступ на 0.5\,\rm em, и затем — огромная " буква", созданная командой \parbox. Согласно общему правилу, высота и глубина линейки, заданной командой \vrule, равна высоте и глубине объемлющего блока, а они в нашем случае совпадают с высотой и глубиной "огромной буквы" (ведь кроме нее, другого текста в нашем \hbox нет). Тем самым линейка получается как раз нужных размеров, что и требовалось!

Обратите еще внимание на знак процента после \hbox — без него получилось бы, что аргумент команды \hbox начинается с пробела, соответственно и линейка начиналась бы не с начала, а после пробела .

На самом деле в предыдущем примере было бы лучше, если бы правый край выделенного абзаца шел вровень с правым краем остального текста. Чтобы добиться этого, надо первый аргумент команды \parbox не взять с потолка, а вычислить. Для этого нам понадобятся переменные со значением длины. Предполагая, что мы определили с помощью \newlength переменные \shirina и \raznost, сделаем вот что:

\begin{flushleft}
\shirina=\textwidth
\settowidth{\raznost}{\vrule\hspace{.5em}}
\addtolength{\shirina}{-\raznost}
\noindent\hbox{%
\vrule\hspace{.5em}\parbox{\shirina}%
{Иногда используется ...
... линейка.}}
\end{flushleft}

Мы воспользовались командой \settowidth, чтобы найти размер, который занимает линейка вместе с пробелом. Кстати, если просто написать \hbox{\vrule\hspace{.5em}}, то на печати мы ничего не увидим (внутри \hbox 'а никакого текста нет, так что высота и глубина линейки равна нулю и она тем самым невидима); однако же эта команда создаст пробел, величина которого равна 0.4pt плюс 0.5em. Заключительное замечание: поскольку {flushright}, как и всякое окружение, ограничивает группу, все наши манипуляции с параметрами \shirina и "\raznost" забудутся по выходе из этого окружения.

Команда \vbox

Теперь рассмотрим вторую основную команду TeX'а для генерации блоков — команду \vbox. Эта команда создает блок, обрабатывая текст в вертикальном режиме. Вот первый пример:

\vbox{\hbox{Слово}
\hbox{Еще слово}}
\vbox{\hbox{Слово}
\hbox{Еще слово}}

Получаемый блок имеет вид:


Как видите, блоки, создаваемые \hbox, ставятся один под другим таким образом, чтобы их точки отсчета лежали на одной вертикальной прямой.

Прежде чем идти дальше, обсудим, что может содержаться в аргументе команды \vbox. Там могут присутствовать любые TeX'овские команды, допустимые между абзацами (т.е. в вертикальном режиме): команды \vspace, команды смены шрифта, присваивания значений различным параметрам, команды \newcommand и \renewcommand и т.п. Что же касается команд, которым соответствует что-либо на печати, то будем считать, что из них в аргументе \vbox возможны только TeX'овские команды \hbox, \vbox и \hrule, а также \copy, о которой речь пойдет позже. В частности, недопустим ни текст, ни LaTeX'овские команды \mbox, \parbox, \rule и т.п. Если вам требуется воспользоваться возможностями таких команд, "прячьте" их в \hbox, например, так:

\hbox{\raisebox{1pt}[2em][3em]{...}}

На самом деле в аргументе команды \vbox может находиться и обычный текст; при появлении первой же буквы или, скажем, команды \mbox или другой команды LaTeX'а для генерации блоков TeX переходит в горизонтальный режим, который продолжается до команды, завершающей абзац ( \par или пустой строки). Мы не будем вдаваться в детали; для тех приложений, которые мы имеем в виду, достаточно использовать команду \vbox так, как было предписано выше.

Когда TeX при выполнении команды \vbox составляет блоки друг с другом, он располагает их так, чтобы их базисные линии были, по возможности, на равных расстояниях друг от друга, так что обычно между блоками будет присутствовать дополнительный пробел. С другой стороны, линейки, созданные командой \hrule, приставляются к блокам без дополнительного пробела. Чтобы при этом линейка не оказалась вплотную к тексту, удобно в соответствующий блок вставить \strut. Следующий пример призван пояснить сказанное:

\parindent=0pt

Неудачно:\\
\vbox{\hbox{Два слова}
      \hrule}

Лучше так:\\
\vbox{\hbox{\strut Два слова}
     \hrule}
Неудачно:\\
\vbox{\hbox{Два слова}
      \hrule}

Лучше так:\\
\vbox{\hbox{\strut Два слова}
     \hrule}

Как обычно, \vbox посреди абзаца ведет себя просто как большая буква. Обратите также внимание, что мы не пытались убрать лишний пробел между \hbox и \hrule: в вертикальном режиме пробелы никакого влияния на текст не оказывают.

Вот еще пример, когда с помощью комбинации блоков и линеек текст берется в рамку:

\vbox{\hrule
\hbox{\vrule\,\strut
Текст в рамке\,\vrule}
\hrule}
\vbox{\hrule
\hbox{\vrule\,\strut
Текст в рамке\,\vrule}
\hrule}

По-прежнему мы используем \strut, чтобы горизонтальные линейки не подходили слишком близко к тексту (и \ для той же цели по горизонтали).

Василий Майоров
Василий Майоров
Даврон Юсупалиев
Даврон Юсупалиев