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

Модификация стандартных классов

Плавающие объекты

Этот раздел посвящен плавающим иллюстрациям и таблицам (короче: плавающим объектам).

Оформление подрисуночной подписи

Обсудим, как можно менять оформление подписи под рисунком (или таблицей), создаваемой командой \caption ).

Над и под подписью предусмотрены вертикальные отбивки. Их размеры хранятся в параметрах со значением длины (растяжимой) \abovecaptionskip (отбивка над подписью) и \belowcaptionskip (под подписью). В стандарте отбивка над подписью равна 10pt (без растяжимости или сжимаемости), а под подписью — нулю.

Чтобы изменить само оформление подписи, надо переопределить команду \@makecaption ; вот ее стандартное определение в адаптированном виде (параметр #1 — номер иллюстрации или таблицы с подписью, то есть значение команды \thefigure или \thetable ; параметр #2 — текст подписи):

\newcommand{\@makecaption}[2]{%
\vspace{\abovecaptionskip}%
\sbox{\@tempboxa}{#1: #2}
\ifdim \wd\@tempboxa >\hsize
   #1: #2\par
\else
   \global\@minipagefalse
   \hbox to \hsize {\hfil #1: #2\hfil}%
\fi
\vspace{\belowcaptionskip}}

Разберем этот код. Во второй и последней строчках вокруг подписи делаются отбивки, как было объяснено выше. В третьей строке в блоковую переменную \@tempboxa (эта переменная используется LaTeX'ом для временного хранения данных такого рода) записывается текст подписи вместе с номером (пока что в одну строку; поскольку в данный момент этот текст еще не печатается, нас не волнует, не окажется ли он длинней, чем ширина полосы). В следующих шести строках (с помошью не рассматривавшейся нами TeX'овской конструкции "условных макросов") длина подписи с номером сравнивается с шириной текста (она обозначена \tex'овским параметром \hsize: при одноколонном наборе это то же самое, что \textwidth ), а при многоколонном — \columnwidth ). Если подпись вместе с номером длиннее строки, то она печатается как абзац (часть кода между \ifdim ) и \else ), а если не длиннее, то центрируется (часть кода между \else и \fi ). Код на седьмой строке воспринимайте как данность.

Что можно изменить в этом определении? Поскольку #1 — это номер, а #2 — текст подписи, нетрудно заметить, что номер отделяется от подписи двоеточием, что с отечественными полиграфическими традициями не согласуется. Разумно заменить в этом месте двоеточие на точку. Кроме того, можно изменить шрифт, которым печатается подпись. Только не забудьте, что при переопределении надо будет вставить команды смены шрифта в три места (всюду, где в исходном определении стоит #1: #2): и в "измеряющую размер" строку, начинающуюся с \sbox (от смены шрифта размер тоже может измениться), и в оба варианта печати. Наконец, вы можете решить (не знаю, насколько это правильно) никогда не центрировать подписи; тогда в измененном определении \@makecaption надо будет удалить строки, начинающиеся с \ifdim, \else и \fi, а также текст между \else и \fi (и, возможно, установить свои любимые параметры верстки абзаца). Возможны, наверное, и другие решения. В любом случае помните, что текст между \ifdim и \else относится к случаю, когда подпись с номером в строку не умещается, а текст между \else и \fi — к противоположному.

И последнее: команду \@makecaption вы будете, конечно, переопределять с помощью \renewcommand ; имейте в виду, что в данном случае надо пользоваться вариантом \renewcommand без звездочки, поскольку второй аргумент этой команды (текст подписи) вполне может состоять из нескольких абзацев.

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

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

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

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

  • \topnumber Максимальное количество плавающих объектов, которое разрешается разместить вверху страницы (при двухколонном наборе и иллюстрациях/таблицах шириной в колонку — вверху колонки). Значение по умолчанию: 2.
  • \bottomnumber Максимальное количество плавающих объектов, которое разрешается разместить внизу страницы (при двухколонном наборе и иллюстрациях/таблицах шириной в колонку — внизу колонки). Значение по умолчанию: 1.
  • \totalnumber Максимальное количество плавающих объектов, которое разрешается разместить на странице (при двухколонном наборе и иллюстрациях/таблицах шириной в колонку — в колонке). Значение по умолчанию: 3.
  • \dbltopnumber При наборе в две колонки: максимальное количество плавающих объектов шириной во всю страницу, которое разрешается разместить вверху страницы. Значение по умолчанию: 2.

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

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

  • \topfraction Максимальная доля страницы, которую могут занимать плавающие объекты, размещаемые вверху страницы. Значение по умолчанию: 0.7. Это означает, что плавающие иллюстрации и таблицы, размещаемые вверху страницы, могут занимать не более 70% страницы по высоте. Если мы хотим уменьшить эту долю, скажем, до 50%, надо написать
    \renewcommand{\topfraction}{0.5}
    Ниже слова "доля страницы" также всюду означают "доля страницы по высоте".
  • \bottomfraction Максимальная доля страницы, которую могут занимать плавающие объекты внизу страницы. Значение по умолчанию: 0.3.
  • \textfraction Минимальная доля страницы, которую должен занимать текст, а не плавающие объекты (к страницам, создаваемым LaTeX'ом специально для размещения плавающих объектов при обработке необязательного аргумента p, это не относится). Значение по умолчанию: 0.2.
  • \floatpagefraction Этот параметр, напротив, относится именно к страницам, которые LaTeX создает при обработке необязательного аргумента p. Он указывает минимально возможную долю такой страницы, которую могут занимать размещаемые на ней плавающие иллюстрации и таблицы. Значение по умолчанию: 0.5 (стало быть, специальная страница для плавающих иллюстраций, которую вы требуете с помощью необязательного аргумента p к окружению {figure}, не будет создана, пока эти иллюстрации занимают менее 50% высоты страницы текста).

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

  • \dbltopfraction То же, что \topfraction, применительно к иллюстрациям (таблицам) шириной в целую страницу при двухколонном наборе. Значение по умолчанию: 0.7.
  • \dblfloatpagefraction То же, что \floatpagefraction, применительно к иллюстрациям (таблицам) шириной в целую страницу при двухколонном наборе. Значение по умолчанию: 0.5.

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

  • \textfloatsep Отступ между текстом и иллюстрациями (таблицами), размещаемыми вверху или внизу страницы.
  • \floatsep Отступ между двумя иллюстрациями (таблицами).
  • \intextsep Отступ между текстом и иллюстрациями (таблицами), размещаемыми посреди страницы (при обработке необязательного аргумента h).

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

  • \dbltextfloatsep При двухколонном наборе - отступ между текстом и иллюстрацией (таблицей), занимающей всю страницу по ширине.
  • \dblfloatsep При двухколонном наборе - отступ между двумя иллюстрациями (таблицами), занимающими всю страницу по ширине.

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

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

  • \topfigrule Разделитель между плавающим объектом, размещаемым вверху страницы (колонки), и остальным текстом.
  • \botfigrule Разделитель между текстом и размещаемым внизу страницы (колонки) плавающим объектом.

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

  • \dblfigrule То же, что \topfigrule, для случая, когда набор двухколонный, а плавающий объект занимает по ширине всю страницу.

По умолчанию указанные три команды ничего не делают. Если вы хотите задать явные разделители между текстом и иллюстрациями (таблицами), то эти команды надо определить с помощью \newcommand 7Именно так, а не переопределить с помощью \renewcommand !. Определять эти команды нужно не произвольным образом: чтобы они правильно стыковались с 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 и ей подобными командами, не обязаны быть именно линейками: необходимо только при их определении учитывать три перечисленных выше обстоятельства.

Нина Казачек
Нина Казачек
Василий Майоров
Василий Майоров