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

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

Разное

Теоремы, выключные формулы

Чтобы изменить оформление "теорем" (окружений, определяемых с помощью \newtheorem ), надо переопределить команды \@begintheorem и \@opargbegintheorem (первая из них отвечает за оформление "теорем" без необязательного аргумента, вторая — за оформление "теорем" с необязательным аргументом). Первая из них определена так:

\newcommand{\@begintheorem}[2]{\begin{trivlist}
\item[\hspace{\labelsep}\bfseries#1\ #2]
\itshape}

Здесь аргумент #1 означает название "теоремы" (например, " Теорема", "Предложение", "Лемма",...- в команде \newtheorem это слово являлось вторым обязательным аргументом), а аргумент "#2" означает номер "теоремы". Если мы, например, хотим, чтобы после номера "теорем" стояла точка, нам достаточно переопределить эту команду, добавив точку после #2. Что делать для того, чтобы сменить шрифт, которым печатаются номер или текст "теорем", также достаточно ясно.

Команда \@opargbegintheorem определяется так:

\newcommand{\@opargbegintheorem}[3]{\begin{trivlist}
\item[\hspace{\labelsep}{\bfseries #1\ #2\ (#3)}]
\itshape}

Здесь #1 и #2 по-прежнему означают название и номер " теоремы", а #3 — необязательный аргумент "теоремы" (обычно в качестве такового задается имя ученого, которому приписывается данная теорема).

Если оформление, задаваемое окружением trivlist, вас не устраивает, то можно переопределить две вышеуказанные команды более радикально. Общий принцип таков. Перед текстом "теоремы", не имеющей необязательного аргумента, исполняется команда \@begintheorem ; у этой команды должно быть два аргумента, причем первый из них — название "теоремы", а второй — ее номер. Если "теорема" имеет необязательный аргумент, то вместо \@begintheorem перед ее текстом исполняется команда \@opargbegintheorem, имеющая три аргумента: первые два — такие же, как у \@begintheorem, и третий — необязательный аргумент "теоремы" (имя первооткрывателя). Наконец, после текста "теоремы" исполняется команда \@endtheorem, которая изначально определена очень просто:

\newcommand{\@endtheorem}{\end{trivlist}}

В принципе можно переопределить все три эти команды, чтобы получить свое оформление "теорем" (например, в духе наших макросов для автоматической нумерации задач из "лекции 7" ). Только следите, чтобы переопределения всех трех команд были согласованы друг с другом: если, например, вы изгоните \begin{trivlist} из определения \@begintheorem, но при этом оставите команду \@endtheorem в неприкосновенности, то на каждой " теореме" LaTeX будет сообщать вам об ошибке (отсутствие баланса команд \begin и \end ).

При пользовании AMS'овскими классами документов "теоремы" определяются иначе. Вряд ли, впрочем, вы сочтете нужным переделывать стандарт Американского математического общества.

Теперь скажем кое-что про стиль оформления номеров выключных формул, заданных в виде окружения {equation}. Как вам уже известно, можно переопределить команду \theequation или (с помощью команды \@addtoreset ) изменить подчиненность счетчика {equation}; при этом изменится оформление самих номеров формул. Кроме этого, можно изменить то, что печатается возле этих номеров. Для этого следует переопределить команду \@eqnnum. Изначально она определена так:

\newcommand{\@eqnnum}{(\theequation)}

При желании можно заменить тут круглые скобки на что-нибудь другое. Имейте в виду, что номер выключной формулы обрабатывается TeX'ом " в математическом режиме", как формула (латинские буквы по умолчанию набираются "математическим курсивом" и т.п.).

Сноски

Стиль оформления сносок зависит от многих вещей. Начнем с пробела между страницей и сносками. Чтобы его изменить, надо применить команду \setlength с необычным первым аргументом. Вот, например, как выглядит команда, устанавливающая стандартную для LaTeX'а величину этого пробела:

\setlength{\skip\footins}{12pt plus 4pt minus 4pt}

Почему в первом аргументе \setlength целых две команды и что они означают, объяснить в рамках этой книги невозможно, так что воспринимайте этот рецепт для установки пробела между текстом и сносками догматически (для любознательных: вся правда содержится в пятнадцатой главе книги [2].

Далее, сноски обычно отделяются от текста не только пробелом, но и линейкой. Чтобы задать вид этой линейки, отличный от стандартного, либо задать какой-то другой разделитель, надо переопределить команду \footnoterule, которая в стандарте определена так:

\newcommand{\footnoterule}{\vspace*{-3pt}
     \hrule width .4\columnwidth
     \vspace*{2.6pt}}

К этому макроопределению необходим комментарий: непонятно, зачем нужны команды \vspace. Дело в том, что "текст", генерируемый командой \footnoterule, не должен, с точки зрения TeX'а, занимать места по вертикали (фактически он располагается внутри пробела между текстом и сносками, о котором шла речь выше). Поэтому мы сначала отступаем на 3 пункта вверх, затем печатаем линейку (вспомним, что по умолчанию линейка, генерируемая командой \hrule, имеет толщину 0.4 пункта), а затем спускаемся на 2.6 пункта вниз. В итоге получается, что и линейка напечаталась, и места по вертикали мы не занимаем, поскольку -3+0.4+2.6=0.

Может возникнуть вопрос, зачем нужен \vspace*{-3pt}: не проще ли обойтись без этой команды, а после \hrule сказать \vspace*{-0.4pt}? Ответ: в этом случае линейка напечаталась бы вплотную к сноске.

Если вы хотите изменить ширину или толщину линейки, команду \footnoterule можно переопределить; только не забудьте проследить, чтобы отрицательный \vspace скомпенсировал толщину линейки. Можно, собственно говоря, сделать так, чтобы этой линейки вообще не было, сказав

\renewcommand{\footnoterule}{}

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

  1. команда \footnoterule будет выполняться в те моменты, когда TeX находится в вертикальном режиме;
  2. по окончании работы команды \footnoterule TeX должен снова оказаться в вертикальном режиме;
  3. текст, генерируемый командой \footnoterule, не должен, с точки зрения TeX'а, занимать места по вертикали.

Следующий параметр, от которого зависит оформление сносок, — это параметр со значением длины \footnotesep. Он означает следующее. В начале каждой сноски, для того чтобы линейка, отделяющая сноски от текста, не подходила к тексту слишком близко, вставляется невидимая линейка нулевой ширины наподобие \strut. Так вот, \footnotesep задает высоту этой линейки.

За вид номеров сносок в тексте отвечает команда \@makefnmark. По умолчанию она определена следующим образом:

\newcommand{\@makefnmark}{\hbox{\mathsurround=0pt
$^{\@thefnmark}$}}

Здесь на место команды \@thefnmark при выполнении будет подставлен номер сноски (или то, что его заменяет, если мы пользовались командой \footnotemark ). Обратите внимание, что номер сноски оформлен как верхний индекс в математической формуле — именно благодаря этому номера сносок печатаются над строкой. По этой же причине внутри группы, являющей собой аргумент команды \hbox, устанавливается в нуль параметр \mathsurround - иначе, если вы установили для него ненулевое значение, номер сноски будет окружен лишними пробелами.

И, наконец, самое главное — команда, генерирующая собственно текст сноски. Она называется \@makefntext. Вот ее стандартное определение, в котором аргумент #1 обозначает текст сноски, а команда \@thefnmark означает то же, что и выше:

\newcommand{\@makefntext}[1]{\parindent=1em\noindent
            \hbox to 1.8em{\hss\@makefnmark}#1}

При переопределении этой команды следует иметь в виду, что она будет выполняться внутри аргумента команды \parbox с длиной строки, равной ширине колонки текста; в приведенном выше определении применена команда \noindent, чтобы подавить абзацный отступ в первом абзаце сноски, в котором будет печататься ее номер.

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

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