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

Блоки и клей

Сдвиги относительно базисной линии

Когда при исполнении команды \makebox или \mbox TeX создает блок из меньших блоков (каждая буква, как мы помним, - это блок, из букв составляются слова - тоже блоки; наконец, блоки могут быть заданы в явном виде, в частности, командой \mbox ), то блоки эти размещаются в строке таким образом, что все их точки отсчета расположены на одной высоте (иными словами, их базисные линии продолжают одна другую). Можно, однако, сдвинуть блок по вертикали относительно базисной линии. Для этого удобно воспользоваться LaTeX'овской командой \raisebox. Эта команда требует двух обязательных аргументов. Первый из них - расстояние, на которое сдвигается по вертикали фрагмент текста, второй - сам этот фрагмент текста. Пример:

Слово \raisebox{2pt}{подскочило}
в строке
.
Слово \raisebox{2pt}{подскочило}
в строке.

Текст, расположенный во втором обязательном аргументе этой команды, должен удовлетворять тем же требованиям, что и аргумент команды \mbox: в нем могут быть самые разные TeX'овские команды, при условии, что среди них не будет команд типа пустой строки, \par, \\ и тому подобных, которые "не укладываются в строку" (зато в этом тексте, как водится, могут присутствовать любые команды, порождающие блоки, в частности, например, \parbox, а уж в ее аргументе оставляйте пустых строк, сколько душе угодно). Если первый обязательный аргумент команды \raisebox отрицателен, то текст будет, естественно, не поднят, а опущен. Вот, например, как можно определить команду \tex, печатающую эмблему TeX'а:

\newcommand{\TeX}{T\nolinebreak\hspace{-.1667em}\raisebox
            {-.5ex}{E}\nolinebreak\hspace{-.125em}X}

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

На самом деле команда \TeX определяется более экономным способом, который требует меньше машинного времени и памяти, но использует не рассматриваемые нами средства TeX'а. Время от времени мы будем приводить определения команд "в переводе с TeX'а на LaTeX".

Кроме вертикального сдвига блоков, команда \raisebox может делать еще одно полезное дело: с ее помощью можно обмануть TeX, заставив его считать, что блок, полученный после сдвига, имеет любую заданную нами высоту и глубину, независимо от того, сколько места реально занимает текст. Именно, эта команда может принимать, наряду с обязательными, необязательные аргументы. Между двумя обязательными аргументами можно указать необязательный аргумент — высоту, которую, по мнению TeX'а, должен иметь сдвинутый блок. Кроме того, после первого необязательного аргумента может стоять второй — глубина, которую, по мнению TeX'а, будет иметь сдвинутый блок. Вот пример:

Строка.\\
Вторая
\raisebox{7pt}[1pt][10pt]{Ы}\\
Третья строка
.
Строка.\\
Вторая
\raisebox{7pt}[1pt][10pt]{Ы}\\
Третья строка.

Буква Ы, поднятая на 7 пунктов над строкой, наложилась на первую строку, поскольку в первом необязательном аргументе команды \raisebox мы приказали TeX'у считать, что блок, образованный поднятой буквой Ы, имеет высоту всего лишь один пункт (стало быть, возвышается над базисной линией второй строки меньше, чем любая буква), и соответственно TeX не сделал дополнительного интервала между первой и второй строками. С другой стороны, третья строка отодвинулась от второй, поскольку во втором необязательном аргументе команды \raisebox мы велели TeX'у считать, что глубина блока, образованного поднятой буквой Ы, равна целым десяти пунктам, и TeX послушно оставил дополнительное место, чтобы этот блок не наложился на третью строку!

Иногда разумно использовать команду \raisebox даже с нулевым обязательным аргументом, только для того, чтобы менять (в глазах TeX'а) высоту и/или глубину блока, не сдвигая его относительно базисной линии. В "Модификация стандартных классов" мы увидим пример такого использования этой команды.

Команда \hbox

Возможности, предоставляемые LaTeX'ом для генерации блоков, достаточны для простых приложений, но в более серьезных случаях их не хватает. В этом и следующем разделах мы рассмотрим более гибкие средства, предоставляемые для этой цели непосредственно языком TeX и макропакетом Plain - TeX. Мы не будем пытаться описать все TeX'овские команды для генерации блоков (книгу [2] ничто заменить не может), но сообщим тот минимум сведений, который необходим для модификации LaTeX'овского стандартного оформления, о чем пойдет речь в следующей лекции. Подчеркнем, что всеми описываемыми в этом и следующем разделах TeX'овскими средствами можно пользоваться в LaTeX'овских исходных текстах.

Прежде всего давайте вспомним, что в каждый момент трансляции исходного текста TeX находится в одном из трех следующих режимов: горизонтальном (в процессе верстки абзаца), вертикальном (между абзацами), или математическом (в процессе набора математической формулы); при появлении первой же буквы или LaTeX'овской команды для генерации блока или линейки (к таковым относятся \mbox, \makebox, \fbox, \framebox, окружения {array}, {tabular} или {picture}, а также команда \rule1Но не \hrule или \vrule: это команды TeX'а, а не LaTeX'а. ) TeX из вертикального режима выходит и начинает очередной абзац.

Одна из основных TeX'овских команд для генерации блоков называется \hbox. В своем простейшем виде она полностью аналогична LaTeX'овской команде \mbox, с одним важным отличием: в вертикальном режиме команда \hbox не начинает нового абзаца, а только добавляет сгенерированный ею блок (т. е.\ фактически строку) к уже сверстанной части страницы. Внутри абзаца (в горизонтальном режиме) команда \hbox действует точно так же, как и \mbox. Вот пример:

На странице \hbox{уже}
присутствует абзац текста.
После того, как он
кончится, TeX{} перейдет в
вертикальный режим.

\hbox{Строка} \hbox{Еще строка}
Только
теперь начинается новый абзац.
На странице \hbox{уже}
присутствует абзац текста.
После того, как он
кончится, TeX{} перейдет в
вертикальный режим.

\hbox{Строка} \hbox{Еще строка}
Только
теперь начинается новый абзац.

Сравните с тем, что было бы при использовании LaTeX'овской команды \mbox вместо \hbox:

На странице уже присутствует
абзац текста. После того, как
он кончится, TeX перейдет
в вертикальный режим.

\mbox{Эти слова} сразу
начинают новый абзац.
На странице уже присутствует
абзац текста. После того, как
он кончится, TeX перейдет
в вертикальный режим.

\mbox{Эти слова} сразу
начинают новый абзац.
Василий Майоров
Василий Майоров
Даврон Юсупалиев
Даврон Юсупалиев
Андрей Лучицкий
Андрей Лучицкий
Россия
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002