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

Блоки и клей

Блоки из абзацев

Если необходимо создать блок, в котором размещается сверстанный TeX'ом абзац текста, то можно воспользоваться командой \parbox. У этой команды два обязательных аргумента: первый — длина строк в получаемом абзаце, второй — собственно текст. Например, такой текст

\parbox{30cm}{
В строку\qquad
\parbox{4cm}{вставили целый
абзац текста, сверстанного
по всем TeX'овским правилам.
После этого продолжается}\qquad
прерванная строка.
}
В строку\qquad
\parbox{4cm}
{вставили целый
абзац текста, 
сверстанного
по всем TeX'овским 
правилам.
После этого 
продолжается}\qquad
прерванная строка.

Как видите, базисная линия блока, создаваемого командой \parbox, находится в точности посредине текста. Поэтому команду \parbox удобно использовать для включения больших фрагментов текста в математические формулы. Например, формула

\int_a^b f'(x)\,dx=f(b)-f(a)\qquad
  \parbox{4cm}{для всех функций f,
  производная которых интегрируема
  по Риману}

получается из такого исходного текста:

$$
  \int_a^b f'(x)\,dx=f(b)-f(a)\qquad
  \parbox{4cm}{для всех функций f,
  производная которых интегрируема
  по Риману}
$$

Если дать команду \parbox с необязательным аргументом, то создаваемый ею блок можно расположить относительно строки и по-иному: чтобы вровень с остальной строкой шла самая верхняя строка абзаца (для этого нужен аргумент t ) или самая нижняя (аргумент b ); можно также указать аргумент c — тогда блок будет расположен по центру, так же, как если бы необязательного аргумента вообще не было. Необязательный аргумент у этой команды должен идти перед обязательными.

Во втором обязательном аргументе команды \parbox, задающем текст, может присутствовать всё то же, что в обычном тексте, в том числе команды для вертикальных пробелов наподобие \vspace, пустые строки, разделяющие абзацы, выключные формулы и т.п. Абзацы, создаваемые командой \parbox, по умолчанию делаются без абзацного отступа и в режиме \sloppy. Если вы хотите чего-то другого, можно прямо внутри аргумента команды \parbox установить нужное вам значение абзацного отступа, параметра \tolerance и т.п.

Можно также указать LaTeX'у высоту, которую должен иметь блок, полученный в результате применения команды \parbox. Для этого используется второй необязательный аргумент, идущий непосредственно после первого. Наряду с явным указанием размера, можно воспользоваться командой \height, обозначающей " естественную" высоту текста, а также командой \totalheight (высота плюс глубина).

Наконец, в команде \parbox можно указать, как именно должен быть расположен текст внутри блока. Для этого используется третий необязательный аргумент, следующий непосредственно после второго. Этот аргумент — буква t, b, c или s. Буква t означает " сверху", b — "снизу", c — "по центру". Если третий необязательный аргумент не указан, то по умолчанию считается, что он совпадает с первым. Если же третьим необязательным аргументом является s, это означает, что текст будет растянут или ужат в соответствии с размером, указанным во втором необязательном аргументе. Если вы не позаботитесь о специальных командах, обеспечивающих такую растяжимость или сжимаемость, то получите сообщение об Overfullе или Underfullе.

В следующем примере блоки, созданные командой \parbox, для наглядности взяты в рамку (с помощью \fbox ):

\fbox{%
\parbox[b][1.3\height]{2cm}{%
Мы едем, едем, едем
в далекие края.}}\qquad
\fbox{%
\parbox[t][1.3\height]{2cm}{%
Мы едем, едем, едем
в далекие края.}}
\fbox{%
\parbox[b][1.3\height]{2cm}{%
Мы едем, едем, едем
в далекие края.}}\qquad
\fbox{%
\parbox[t][1.3\height]{2cm}{%
Мы едем, едем, едем
в далекие края.}}

Команды \height и \totalheight, так же как и \depth, можно использовать только в необязательном аргументе команды \parbox (а также \framebox или \makebox ).

Наряду с \parbox, существует еще один способ создать блок из абзацев. Именно, существует окружение {minipage} (" министраница"), генерирующее блок из текста, расположенного внутри этого окружения; блок состоит из абзацев, ширина которых задается в обязательном аргументе окружения {minipage} (так же, как в команде \parbox ); перед обязательным аргументом этого окружения может стоять необязательный: буква t, b или c, причем смысл этого аргумента опять-таки такой же, как в команде \parbox. Основное отличие minipage от \parbox в том, что к тексту внутри этого окружения можно делать сноски с помощью команды \footnote, причем текст сноски появляется не внизу страницы, а внизу блока, генерируемого окружением minipage. При наборе книги, которую вы читаете, это окружение использовалось для печати примеров.

Текст в рамке; комбинации блоков

В "Набор текста" мы уже упоминали про команду \fbox, берущую в рамку фрагмент текста, помещающегося в строку. Наряду с ней есть и команда \framebox, относящаяся к ней так же, как \makebox относится к \mbox: она берет текст в рамку заданного размера, причем текст внутри этой рамки либо центрирует (если необязательного аргумента нет или же задан необязательный аргумент c), либо прижимает к правому или левому краю рамки (если задан необязательный аргумент r или l). Смысл и расположение обязательных и необязательных аргументов у команды \framebox такой же, как и у команды \makebox.

Точнее говоря, первый обязательный аргумент команды \framebox задает не ширину рамки, а ширину текста, помещаемого в эту рамку. Сама же рамка отделена от текста пробелом ширины \fboxsep ; толщина линий в рамке равна \fboxrule. Обоим этим параметрам можно обычным образом присваивать новые значения.

Коль скоро каждый блок, создаваемый LaTeX'овскими командами, рассматривается TeX'ом просто как большая буква, возможны любые, сколь угодно причудливые, комбинации таких "букв". Пусть, например, нам надо взять в рамку абзац текста шириной 6 см, чтобы получилось так:

\begin{center}\hbadness 2500
\fbox{%
\parbox{6cm}{%
Внутри \TeX'овских блоков может присутствовать не только
собственно текст или формулы, но и другие блоки, внутри этих
блоков - еще блоки, и так далее. Таким образом, блоки могут
быть вложены друг в друга, как матрешки.}%
}
\end{center}

Просто поместить этот текст в аргумент команды \fbox не получится, поскольку наш текст в одну строку не укладывается, а команда \fbox, подобно команде \mbox, текстов, не укладывающихся в строку, не переваривает. Поэтому нужно сделать из нашего абзаца блок с помощью команды \parbox и этот блок (т.е. уже "букву") передать в качестве аргумента команде \fbox:

\fbox{%
\parbox{6cm}{%
Внутри TeX'овских блоков может ...
... друг в друга, как матрешки.}%
}

Обратите внимание на знаки процента, которыми заканчиваются первая и предпоследняя строки. Если бы их не было, то рамка отстояла бы от текста больше, чем надо, так как TeX решил бы, что аргумент команды \fbox имеет пробел до и после "буквы", созданной командой \parbox. См. "Элементарное введение" по поводу использования знака процента для удаления нежелательных пробелов.

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