18c0693f

Размещение плавающих объектов на странице


Сейчас мы обсудим параметры, которыми руководствуется LaTeX при размещении плавающих объектов на странице.

Сразу же отметим, что все эти параметры относятся в равной мере к плавающим иллюстрациям и плавающим таблицам, и любое изменение этих параметров также затрагивает плавающие объекты всех типов.

Часть параметров, отвечающих за плавающие объекты, представляет собой LaTeX'овские счетчики, которым можно присваивать новые значения командой \setcounter:

Значение счетчика totalnumber не влияет на количество иллюстраций и/или таблиц на странице, специально для них предназначенной (таковая, как мы помним, выделяется, если в необязательном аргументе окружения {figure} или {table} присутствует буква p).

Вторая группа параметров регулирует уже не количество плавающих иллюстраций на странице, а величину места, ими занимаемого. Все эти параметры являются командами наподобие \arraystretch или \baselinestretch; чтобы менять значения параметров, надо их переопределять с помощью команды \renewcommand. Эти параметры таковы:

Все вышеуказанные параметры применимы также к двухколонному набору и плавающим объектам шириной в колонку. Если же набор — в две колонки, а ширина плавающего объекта — целая страница, то используются такие параметры:

При вычислении, какую часть страницы занимает плавающий объект, учитывается не только размер собственно иллюстрации или таблицы, но и величина вертикальных отступов (" отбивок"), отделяющих этот объект от остального текста. Эти отступы задаются следующей группой параметров. Все эти параметры суть длины, присваивать им новое значение надо с помощью \setlength.



Как водится, три перечисленных параметра применимы и к иллюстрациям (таблицам) шириной в колонку при двухколонном наборе. А вот как обозначаются соответствующие параметры, если набор в две колонки, а иллюстрация или таблица занимает по ширине всю страницу:

Если вы почему-либо решите менять эти параметры с помощью команды \setlength, полезно иметь в виду, что при пользовании шрифтом кегля
значения \floatsep, \intextsep и \dblfloatsep равны 12pt plus 2pt minus 2pt, а значения \textfloatsep и \dbltextfloatsep равны 20pt plus 2pt minus 4pt.

По умолчанию плавающие объекты не отделены от текста ничем, кроме вышеперечисленных отбивок. Но можно сделать и так, чтобы иллюстрации (таблицы) отделялись от текста как-то иначе (линейками, например). Для этих целей предусмотрены следующие три команды:

Эти две команды относятся и к двухколонному набору, при условии, что иллюстрации (таблицы) занимают по ширине одну колонку (иными словами, если используются окружения {figure} или {table} без звездочек). А если используются варианты этих окружений со звездочками, то используется еще один параметр:

По умолчанию указанные три команды ничего не делают.


Если вы хотите задать явные разделители между текстом и иллюстрациями (таблицами), то эти команды надо определить с помощью \newcommand.7). Определять эти команды нужно не произвольным образом: чтобы они правильно стыковались с LaTeX'овскими алгоритмами размещения плавающих объектов, нужно иметь в виду следующее:

  1. каждая из этих команда будет выполняться в те моменты, когда TeX находится в вертикальном режиме;
  2. по окончании работы каждой из этих команд TeX должен снова оказаться в вертикальном режиме;
  3. текст, генерируемый каждой из этих команд, не должен, с точки зрения TeX'а, занимать места по вертикали.
Поэтому будет неправильно, если вы, решив отделять текст от иллюстраций линейкой, определите \botfigrule просто как \hrule: первое и второе условия при этом выполнены будут, а вот третье — нет, в результате чего LaTeX собьется со счета при решении вопроса о размещении иллюстраций. Формально правильным было бы такое решение:

\newcommand{\botfigrule}{\hrule\vspace{-0.4pt} (вспомним, что линейка, генерируемая командой \hrule, имеет по умолчанию толщину 0.4pt). Впрочем, формальной правильности мало: если вы опробуете такое определение на практике, то увидите, что линейка вплотную прилегает к иллюстрации, что никуда не годится. Правильно действовать, например, так:

\newcommand{\botfigrule}{\vspace{-3pt}\hrule \vspace{2.6pt}} Теперь мы проводим линейку не прямо по верхней кромке иллюстрации, а на три пункта выше; заключительное \vspace{2.6pt} нужно для того, чтобы в сумме получилось нулевое вертикальное смещение.

С \topfigrule и \dblfigrule вы сможете теперь разобраться самостоятельно.

В заключение отметим, что разделители, определяемые \topfigrule и ей подобными командами, не обязаны быть именно линейками: необходимо только при их определении учитывать три перечисленных выше обстоятельства.