Котельников И., Чеботаев П. LaTeX2e по-русски (1185906), страница 44
Текст из файла (страница 44)
Нерастяжимая положительная длинаwidth может быть задана в явном виде (например, 20mm) или в долях естественных размеров текстового бокса. Естественные ширина, высота (над базисной линией), глубина (под базисной линией) и сумма высоты и глубины бокса доступныв виде команд\width\height\depth\totalheightно только внутри аргумента width.При наличии первой опции width позиционирование текста в боксе определяетвторой необязательный аргумент hpos, который может состоять из одной буквы:l, c, r или s, причёмl сдвигает текст к левому краю бокса,c размещает текст в центре бокса,r сдвигает текст к правому краю бокса,s растягивает текст на всю ширину бокса.Растяжение текста при наличии опции s производится за счёт изменения любых растяжимых длин в аргументе lr-text, в том числе пробелов между словами.Если таких растяжимых длин в lr-text нет, то возможно появление предупреждения Underfull hbox2 .
По умолчанию действует опция c.Перейдём к примерам.Применение команды \mbox для предотвращения переноса слов по слогам мыобсуждали в разделе 4.4. Её расширенный аналог, то есть команда \makebox, даётвозможность заставить компилятор думать, будто слово имеет длину, котораябольше естественной:Это \makebox[20mm]{пример} бокса.\\Этопримербокса.Это \makebox[20mm][r]{пример} бокса.\\Этопример бокса.Это примербокса.Это \makebox[20mm][l]{пример} бокса.2Незаполненный бокс.2139.1. Строковые боксыЕсли заданная ширина бокса меньше естественной ширины текста, текст выйдетза границы бокса. Вот что получается, если центрировать узкие боксы:{\centering\framebox[1mm]{пример пример}\\\framebox[1mm][r]{пример пример}\\\framebox[1mm][l]{пример пример}}пример примерпример примерпример примерЗдесь для наглядности использована команда \framebox вместо \makemebox.
Она,как и команда \fbox, рисует рамку вокруг бокса, причём высота и положениерамки зависят от содержания бокса:\fbox{abc} \fbox{efg} \fbox{xyz}abcefgxyzВ разделе 9.1.2 мы покажем, как можно регулировать высоту бокса.Следующий пример демонстрирует способ указания ширины бокса в доляхестественной ширины текста при одновременном использовании опции s для увеличения пробелов между словами. Сравните:\framebox[1.4\width][s]{abc efg xyz} и\\\framebox[1.4\width][c]{abc efg xyz}abcefgxyz иabc efg xyzЧтобы обвести букву «f» квадратной рамкой, следует приравнять её ширинувысоте бокса \totalheight.
Сравните:\fbox{f} и \fbox{\makebox[\totalheight]{f}}f и fВеличина \totalheight включает в себя также толщину рамки и толщину зазорамежду рамкой и текстом.Узкие боксы удобно использовать для выравнивания текста в ячейках таблиц (глава 12). Представим, например, что дробная часть числа 3,14 помещена вбокс нулевой ширины, т. е. число записано в виде 3\makebox[0mm][l]{,14}. Бокснулевой ширины представляет собой невидимую вертикальную линию.
При использовании опции l (или r), левый (правый) край текста находится на этойлинии, а текст располагается справа (слева) от неё. В результате число 3,14 будет выровнено так, будто бы его правый край располагался между цифрой 3 изапятой.9.1.1.Измерение боксовДекларации\settowidth{cmd}{lr-text}\settoheight{cmd}{lr-text}\settodepth{cmd}{lr-text}присваивают команде cmd результат измерения соответственно естественной ширины, естественной высоты и естественной глубины бокса, который получается,214Глава 9. Боксы и что там внутриесли аргумент lr-text обработать в строковой моде (то есть без разбиения дажеочень длинного текста на строки). Например,\settowidth{\abc}{\textsc{жираф}}присваивает командной длине \abc значение, равное ширине слова жираф, набранного капителью. В данном случае предполагается, что команда \abc быларанее объявлена при помощи декларации \newlength{\abc} (раздел 2.10).Следующий пример показывает, как вокруг разных слов нарисовать рамки сшириной, равной ширине самого длинного слова:\newlength{\abc}\settowidth{\abc}{жираф}\framebox[\abc]{слон} \\ \framebox[\abc]{жираф}слонжирафПри помощи перечисленных выше команд можно измерять размеры любыхбоксов (в частности, размеры рисунков), а не только строчек текста.
Напомним,что для LATEX’а не имеет значения содержание бокса. Обозначение lr-text, которое мы используем в определениях команд, всего лишь указывает, что аргументкоманды обрабатывается в строковой моде, но не обязательно должен быть последовательностью букв.9.1.2.Поднятие и опускание боксаКоманда\raisebox{len}[height][depth]{lr-text}форматирует текст её последнего аргумента lr-text в строковой моде и поднимаетего на расстояние len. Отрицательное значение длины len приводит к опусканиюбокса:Здесь \raisebox{.5\height}{\em поднимаем\/},Здесь поднимаем ,a здесь \raisebox{-.5\height}{\em опускаем\/}.а здесь опускаем .Если у команды \raisebox указаны опции height и depth, они заставляют компилятор думать, будто текст в боксе простирается на расстояние height вверх ина расстояние depth вниз от базисной линии строки.
Например, команда\raisebox{.4ex}[1.5ex][.75ex]{\scshape Abc}не только поднимает слово Abc на высоту 0,4 ex, но также предлагает компилятору думать, будто текст простирается на 1,5 ex вверх над базисной линией и на0,75 ex вниз от неё. При отсутствии опций height и depth компилятор используетреальные размеры строки.
Напомним, что если указана только одна опция, токомпилятор будет считать, что пропущена вторая опция, то есть указана тольковысота строки height.Изменяя видимую высоту текста, можно регулировать интервал между строками. Например, опции height и/или depth позволяют иногда удалить лишнее2159.1. Строковые боксыпустое пространство над и/или под математическими формулами. В следующемпримере команда \fbox делает видимым изменение высоты и глубины текста:\fbox{\scshape abc}\\\fbox{\raisebox{0ex}[2ex][1ex]{\scshape abc}}abcabcВ совокупности с \framebox команда \raisebox позволяет регулировать как горизонтальные, так и вертикальные размеры рамки. Ещё один способ изменениявертикальных размеров боксов предоставляет команда \rule (раздел 9.3).9.1.3.Сохранение боксаЕсли какой-то фрагмент текста многократно повторяется, можно создать новуюкоманду с помощью \newcommand (раздел 7.1), которая бы воспроизводила этоттекст всякий раз, когда LATEX встретит её во входном файле.
Такой путь, сокращая время подготовки входного файла, не эффективен в смысле затрат временина его обработку, так как LATEX будет форматировать этот текст каждый раз заново. Если текст достаточно сложный (например, содержит много команд рисования), его обработка может заметно замедлиться. Однако LATEX предоставляетвозможность быстро распечатать однажды сформатированный бокс, имеющийопределённое имя.
Имя такого бокса декларируется командой\newsavebox{cmd}где cmd есть имя команды, не определённой ранее. Вновь определённая командаcmd имеет глобальную область действия, которая не ограничивается ни фигурными, ни командными скобками.После того как имя бокса объявлено, любая из команд\savebox{cmd}[width][hpos]{lr-text}\sbox{cmd}{lr-text}создаёт поименованный бокс, форматируя его содержимое в строковой моде, какэто делают команды \makebox и \mbox. Однако, в отличие от последних, результат форматирования не печатается, а запоминается под указанным именем cmd.Опции width и hpos у команды \savebox имеют то же назначение, что и у команды \makebox: width есть ширина бокса, а опция hpos может принимать значенияl, c, r или s соответственно тому, как следует позиционировать текст в боксе.
Вотличие от \newsavebox область действия команд \savebox и \sbox определяетсяобычными правилами.Процедура\begin{lrbox}{cmd} lr-text \end{lrbox}действует аналогично команде \sbox. Сама процедура lrbox ничего не печатает,она запоминает сформатированный текст lr-text в виде команды cmd.
В этом онаэквивалентна \sbox{cmd}{lr-text} за тем исключением, что любые пробелы в216Глава 9. Боксы и что там внутриначале или конце lr-text игнорируются. Кроме того, в lr-text можно использоватькоманду \verb и процедуру verbatim, чего нельзя делать в аргументах команд.Поименованный бокс печатает команда\usebox{cmd}Команда \sbox является аббревиатурой команды \savebox с пропущенными необязательными аргументами.
Поэтому в следующем примере обе командыдействуют совершенно одинаково:\newsavebox{\prn}\savebox{\prn}{\scshape снова} В тексте воспроизводится боксснова, снова и снова. ИлиВ тексте воспроизводится бокс \usebox{\prn},опять и опять.\usebox{\prn} и \usebox{\prn}.\sbox{\prn}{\em опять\/}%Или \usebox{\prn} и \usebox{\prn}.Здесь бокс с именем \prn определяется как логос, который сначала печатаетслово «снова», а затем слово «опять».9.1.4.Параметры настройки\fboxrule — толщина линий рамки, которую рисуют команды \framebox и \fbox. Однакодля графической версии команды \framebox, используемой в процедуре picture, толщиналиний рамки определяется другими декларациями, общими для всех команд в графическоймоде (раздел 9.5).\fboxsep — ширина промежутка между рамкой и текстом в боксе, создаваемым командами\framebox и \fbox.
Не действует для команды \framebox в графической моде.9.2.Текстовые боксыПарбокс — это бокс, содержимое которого печатается в текстовой моде, когдаLATEX’у разрешено разбивать текст на строки. Например, процедуры figure иtable (глава 11) формируют парбоксы.