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

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

Перечни общего вида

В этом разделе мы завершим рассказ о том, как менять стиль оформления перечней. В "лекции 3" мы назвали перечнями окружения {itemize}, {enumerate} и {description} ; помимо этого, к перечням в LaTeX'овском смысле относятся {flushleft}, {flushright}, {center}, {quote}, {quotation}, {verse}, а также окружения, создаваемые с помощью \newtheorem ; как мы увидим в "лекции 5" , все эти окружения — частные случаи одной LaTeX'овской конструкции. Поэтому многие параметры оформления этих окружений устанавливаются и модифицируются по единой схеме.

Отбивки в перечнях

Начнем с важного предупреждения. Чтобы изменить отбивки, с помощью которых оформляются перечни, необходимо, естественно, изменить значение каких-то из перечисляемых в этом разделе параметров. Однако же, если попросту присвоить этим параметрам новые значения в преамбуле или в стилевом пакете, то в большинстве случаев действия это не возымеет. Средства, которые надо применить, чтобы эти изменения подействовали, описаны в следующем подразделе.

Теперь договоримся о терминологии. Каждый перечень LaTeX рассматривает как состоящий из элементов (каждый элемент вводится, как мы помним, командой \item ). В свою очередь, каждый элемент перечня может состоять из одного или нескольких абзацев. Наконец, у каждого элемента перечня есть свой заголовок — " горошина" на первом уровне окружения {itemize}, заданный вами заголовок в окружении {description} и т.п. (У некоторых перечней — например, таковы "теоремы" — перечень состоит из одного-единственного элемента; у таких перечней, как {quote} или {verse}, кроме того, заголовок к этому единственному элементу всегда пуст.)

Вооружившись этими терминами и имея в виду предупреждение, приступим к утомительному перечислению параметров. Все они — параметры со значением длины. Во-первых, параметры \leftmargin и \rightmargin задают, с каким отступом от левого (правого) поля начинается (заканчивается) текст элементов перечня (полиграфист сказал бы: насколько втянуты элементы перечня). Если перечень вложен в другой перечень, то \leftmargin и \rightmargin обозначают величину втяжки по отношению к объемлющему перечню.

Следующие два параметра влияют на размещение заголовков в перечне. Параметр \labelsep задает расстояние между правым краем заголовка и началом текста в элементе перечня, к которому относится этот заголовок, а параметр \labelwidth задает место по горизонтали, которое по умолчанию занимает заголовок. Точный смысл этих параметров следующий. При обработке перечня LaTeX сначала пытается поместить заголовок в блок шириной \labelwidth. Если места хватает, то именно в такой блок он и помещается, причем выключенным вправо: правый край блока при этом находится на расстоянии \labelsep от начала текста, составляющего элемент перечня (так что его левый край будет на расстоянии

\leftmargin - \labelwidth - \labelsep

от левой границы основного текста или объемлющего перечня). Если же ширина заголовка больше, чем \labelwidth, то заголовок печатается как есть. Такое, например, регулярно случается при пользовании окружением {description}.

Мы не сказали еще об одном параметре, влияющем на размещение заголовков. Именно, если параметр \itemindent отличен от нуля, то каждый заголовок перечня будет дополнительно сдвинут на это расстояние вправо. Соответственно, при определении, на каком расстоянии начинается заголовок элемента перечня, надо будет прибавить значение \itemindent к тому, что получается по формуле (*). По умолчанию значение этого параметра равно нулю.

Если элемент перечня состоит из нескольких абзацев, то по умолчанию во всех этих абзацах абзацный отступ будет отсутствовать. Можно, однако, при желании задать такой режим, что во всех, кроме первого, абзацах каждого элемента перечня будет присутствовать абзацный отступ. Для этого надо задать ненулевую величину этого отступа в параметре \listparindent. Кстати, значение этого параметра может быть и отрицательным (в этом случае эффект будет похож на тот, что достигается в обычном тексте установкой параметров \hangindent и \hangafter ).

Параметры, о которых шла речь до сих пор, относились к размещению материала по горизонтали. Теперь займемся "вертикальными" параметрами. Сразу отметим, что все эти параметры являются " растяжимыми" длинами, т.е. у них можно задавать plus- и minus -компоненты.

Первый (и основной) из этих параметров называется \topsep. Это величина дополнительного вертикального интервала, который делается перед перечнем и после него (в дополнение к \parskip ).

Если перед перечнем оставлена пустая строка (или имеется команда \par ), то перед и после перечня устанавливается еще и вертикальный отступ, равный \partopsep (в дополнение к отступам, заданным параметрами \parskip и \topsep ).

Далее, вертикальный отступ между абзацами внутри одного элемента задается параметром \parsep (а не \parskip, как в обычном тексте). Между различными же элементами перечня, в дополнение к \parsep, оставляется еще и вертикальный отступ \itemsep. Таким образом, если \itemsep отличен от нуля, как это и сделано в стандартных классах, то различные элементы перечня будут более отделены друг от друга, чем абзацы внутри одного элемента перечня.

Изменение отбивок в перечнях

Теперь настало время объяснить, как именно можно менять вышеописанные параметры. При "входе" в перечень LaTeX в первую очередь вычисляет уровень вложенности перечней: если перечень не вложен ни в какой другой, то этот уровень равен 1, для перечня, вложенного в перечень, уровень равен 2 и т. д. После этого исполняется команда \@listI, если уровень равен 1, \@listii, если уровень равен 2, и т.д.: имя команды — слово @list, к которому добавлен уровень вложенности, записанный римскими цифрами (если уровень вложенности равен 1, то римская цифра записывается прописной буквой I, в остальных случаях римские цифры записываются строчными латинскими буквами). В стандартных классах команды \@listI, \@listii и т.п. определены таким образом, что они в момент входа в перечень устанавливают значение параметров оформления перечня на соответствующем уровне. Именно поэтому переустановка (некоторых из) параметров перечня в стилевом пакете может ничего не дать.

Итак, чтобы менять отбивки в перечнях, надо переопределять команды \@listI, \@listii, ..., \@listvi. Видимо, самое практичное — переопределить в своем стилевом пакете команды \@listI, \@listii, ..., \@listvi (или не все из них — в зависимости от того, какова реальная максимальная глубина вложенности перечней в вашем документе), присвоив всем перечисленным в предыдущем разделе десяти параметрам явные значения. Например, можно написать что-нибудь в таком роде:

\renewcommand{\@listI}{%
\leftmargin=25pt
\rightmargin=0pt
\labelsep=5pt
\labelwidth=20pt
\itemindent=0pt
\listparindent=0pt
\topsep=8pt plus 2pt minus 4pt
\partopsep=2pt plus 1pt minus 1pt
\parsep=0pt plus 1pt
\itemsep=\parsep}

Здесь всем параметрам оставлены стандартные значения, за исключением \parsep и \itemsep: в отличие от положительных значений, задаваемых в стандарте, мы устанавливаем их такими же, как обычная вертикальная отбивка между абзацами (как вы помните, она обозначается \parskip и обладает нулевым естественным размером и растяжимостью 1pt). На взгляд автора, такие перечни смотрятся лучше.

Если какой-то из параметров (например, \labelsep ) одинаков в перечнях всех уровней, то достаточно прописать его установку только в определении \@listI: при входе в перечень верхнего уровня этот параметр будет установлен командой \@listI, и LaTeX будет его помнить, пока не выйдет из " наружного" перечня.

Окружения list и trivlist

Все LaTeX'овские перечни являются на самом деле частными случаями одной общей конструкции — окружения list. Рассмотрим, как это окружение работает.

Окружение list имеет два обязательных аргумента. Общий вид этого окружения в исходном тексте будет такой:

\begin{list}{заголовок\_по\_умолчанию}{команды}
...
\end{list}

Аргументы окружения list означают следующее. "Заголовок по умолчанию" — это заголовок элемента перечня, печатающийся в том случае, когда этот элемент перечня вводится командой \item без аргумента. Пример:

\begin{list}{И какой-то}{
\leftmargin=20pt
\rightmargin=40pt
\labelsep=5pt
\labelwidth=0pt
\itemindent=0pt
%\listparindent=0pt
\topsep=8pt plus 2pt minus 4pt
\partopsep=2pt plus 1pt minus 1pt
%\parsep=0pt plus 1pt
\itemsep=\parsep
%\itemsep=0pt
}
\item малыш пока\-зал ему шиш.
\item бар\-бос укусил его в нос.
Нехороший бар\-бос, невоспитанный!
\end{list}
\begin{list}{И какой-то}{}
\item малыш показал ему шиш.
\item барбос укусил его в нос.
Нехороший барбос, 
невоспитанный!
\end{list}

Аргумент команды окружения list содержит те команды, которые будут исполнены после входа в перечень. Поэтому в нем можно задать команды, присваивающие новые значения параметрам оформления перечня (в частности, отбивкам, описанным в "лекции 5" : эти команды будут выполнены после команды \@list..., выполняющейся при входе в перечень). Кроме этого, во втором аргументе окружения list можно поместить команду \usecounter. Эта последняя требует одного обязательного аргумента — имени счетчика (счетчик должен быть определен). Если \usecounter присутствует во втором аргументе окружения list, то при входе в окружение значение счетчика, являющегося аргументом \usecounter, будет установлено в нуль, а каждая команда \item без аргумента будет увеличивать его на единицу с помощью \refstepcounter (так что на значения этого счетчика можно будет ссылаться с помощью \label и \ref ). Вот пример c \usecounter (подразумевается, что у нас определен счетчик tmp):

Вот как выглядят первые буквы
латинского алфавита:
\begin{list}{\Alph{tmp}:}%
{\usecounter{tmp}}
\item Выглядит так же, как
соответствующая русская
буква, и читается так же.
\item Читается не так,
как похожая на нее
русская буква.
\item И с ней та же история.
\end{list}
Вот как выглядят первые 
буквы латинского алфавита:
\begin{list}{\Alph{tmp}:}%
{\usecounter{tmp}}
\item Выглядит так же, как
соответствующая русская
буква, и читается так же.
\item Читается не так,
как похожая на нее
русская буква.
\item И с ней та же 
история. \end{list}

Чтобы заголовки элементов перечня выравнивались по левому краю, а не по правому, можно завершить "заголовок по умолчанию" командой \hfill ; чтобы по левому краю выравнивались заголовки, заданные в явном виде в необязательном аргументе команд \item, нужно завершить командой \hfill этот необязательный аргумент.

Окружением list разумно пользоваться не непосредственно, как в приведенных примерах, а для определения нового окружения с помощью \newenvironment. Вот, например, как в стандарте определяется окружение {quote}:

\newenvironment{\quote}%
{\begin{list}{}{\rightmargin=\leftmargin}\item[]}}%
{\end{list}}

Команда \item с пустым аргументом необходима, поскольку до команды \item в перечне не должно быть никакого текста.

Наряду с окружением list в LaTeX'е определен его важный частный случай — окружение trivlist. Его отличия от list таковы:

  • это окружение не требует аргументов (так же, как и все окружения для создания перечней, с которыми мы имели дело раньше);
  • \leftmargin, \labelwidth и \itemindent для него всегда равны нулю (стало быть, текст печатается без втяжки); \parsep равно \parskip ;
  • команда \item, употребленная внутри этого окружения, обязана иметь аргумент (хотя бы пустой).

Как видите, многие возможности перечней в этом окружении не работают, но сохраняются такие важные черты, как \topsep (дополнительный интервал перед и после) плюс обычное свойство первой строки после перечня: она делается без абзацного отступа тогда и только тогда, когда после окружения в исходном тексте не оставлено пустой строки. Окружение trivlist также применяют обычно не само по себе, а для определения новых окружений; при этом в "открывающие команды" \newenvironment добавляют команду \item[], а внутри окружения \item вообще не используют. Иногда используют и \item с аргументом (пример тому вы увидите ниже, в "лекции 8" ).

Окружения list можно вкладывать друг в друга; максимальная глубина вложенности равна шести. В окружениях наподобие {itemize} предусмотрен "ограничитель", снижающий эту макимальную глубину до четырех. В личном стилевом файле, не рассчитанном на общее пользование, предусматривать такой ограничитель большого смысла нет: просто следите за тем, чтобы не вкладывать слишком много list'ов друг в друга.

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