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

Создание новых команд

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

Средства LaTeX'а, описываемые в этой лекции, позволяют сократить число нажатий на клавиши при наборе сложных текстов. Именно, мы расскажем, как создавать новые команды (или, если угодно, сокращенные обозначения), заменяющие собой длинные фрагменты из текста и TeX'овских команд. Официально такие новые команды называются макроопределениями, а в разговорной речи — макросами.

Макроопределения

Команды без аргументов

Начнем с примера. Пусть вы пишете текст, в котором регулярно встречается математический значок \stackrel{\rm def}{=} (он означает " равно по определению"). Пользуясь тем, что вы узнали из " лекции 2 " , нетрудно понять, что генерируется этот значок внутри математической формулы такой последовательностью команд:

\stackrel{\mathrm{def}}{=}

Часто писать такой длинный набор команд утомительно. Вот бы в LaTeX'е была предусмотрена команда, скажем, \eqdef, генерирующая символ бинарного отношения \eqdef,! Правда, такой команды нет, но мы ее можем создать. Для этого следует написать так:

\newcommand{\eqdef}{\stackrel{\mathrm{def}}{=}}

После того как TeX прочтет эту строку, он всюду, встречая команду \eqdef, будет реагировать точно так же, как если бы он видел текст \stackrel{\mathrm{def}}{=}. Например, формула {x^2\eqdef x\cdot x} теперь получается так:

x^2\eqdef x\cdot x

Новая команда TeX'а, которую мы определили, называется макросом (еще говорят: макроопределение, макрокоманда, макро). Рассмотрим точные правила для создания макросов средствами LaTeX'а.

Для создания макросов используется команда \newcommand. Эта команда имеет два обязательных аргумента. Первый из них — имя, которое вы придумали для вашего макроса. Имена макросов должны подчиняться тем же правилам, что имена TeX'овских команд, либо backslash и после него одна не-буква, либо backslash и после него — последовательность букв. Второй обязательный аргумент команды \newcommand, называемый " замещающим текстом", сообщает TeX'у смысл макроса: на этот текст ваш макрос будет замещаться в процессе трансляции (как говорят, макрос будет "разворачиваться").

При пользовании командой \newcommand нельзя в качестве имени макроса выбирать имя уже существующей команды или окружения (если вы попробуете так сделать, LaTeX выдаст сообщение об ошибке).

Во втором аргументе команды \newcommand (иными словами, в "замещающем тексте") вместе с каждой открывающей фигурной скобкой должна присутствовать соответствующая ей закрывающая1Фигурные скобки, входящие в состав команд \{ \}, в счет при этом не идут., так что определения наподобие

\newcommand{\nachatkursiv}}
\newcommand{\konchitkursiv}{}}

приведут в лучшем случае к сообщению об ошибке (и желаемого эффекта не дадут). Если вам кажется, что такие ограничения стеснительны, можете изучить по книге [2], как их обходить; для большинства практических целей возможности создания макроопределений, предоставляемые LaTeX'ом, вполне достаточны.

К сожалению, некоторые русификации TeX'а не позволяют использовать в именах макросов русские буквы.

Еще одно ограничение: имя новой команды не должно начинаться на end.

Наконец, в замещающем тексте макроопределения нельзя пользоваться командой \verb или окружением {verbatim}.

Если команда \newcommand дана внутри группы, то смысл определяемой ею новой команды будет забыт TeX'ом по выходе из группы. Если новая команда определяется в преамбуле, то, естественно, она будет понятна TeX'у на протяжении всего документа.

Давайте теперь разберем несколько примеров, обращая внимание на типичные ошибки.

Макросы хороши как средство скорописи. Например, если в вашем тексте часто встречается знак \bigtriangleup, то вам может надоесть все время писать длинную команду \bigtriangleup. Коли так, придумайте сокращенное обозначение (скажем, \btu ), напишите в преамбуле

\newcommand{\btu}{\bigtriangleup}

и вы сможете писать формулы наподобие

(A\bigtriangleup B)\cap C=
(A\cap C)\bigtriangleup (B\cap C)
$(A\btu B)\cap C=
(A\cap C)\btu (B\cap C)$

Ранее было рассказано, что делать, чтобы создать согласующееся с нашими традициями обозначение для тангенса. Теперь мы понимаем, что это был пример макроопределения (если вам интересно знать, что значит команда \mathop в замещающем тексте).

В "лекции 2" вы найдете массу других примеров громоздких конструкций, для которых имеет смысл создать макросы.

А теперь — пример типичной ошибки. Пусть в тексте, который вы набираете, регулярно встречаются фразы наподобие

Подмногообразия проективного пространства \mathbf{P}^n - основной объект изучения алгебраической геометрии,

и пусть для сокращения письма вы написали в преамбуле

\newcommand{\Pn}{$\mathbf P^n$}

Теперь можно писать, например, так:

... пространства~\Pn{} - основной объект...

Однако для набора формулы x\in\mathbf P^n написать $x\in\Pn$ не удастся: появится сообщение о том, что символ ^ и команда \mathbf преступно употреблены вне математической формулы. Причина проста: TeX исправно подставляет вместо \Pn тот "замещающий текст", который вы ему сообщили во втором аргументе команды \newcommand. В результате этого при развертывании макроса \Pn текст $x\in\Pn$ превращается в незаконный текст $x\in$\mathbf P^n$$, в котором математическая формула заканчивается со вторым из знаков доллара, а символ ^ оказывается посреди обычного текста. Чтобы можно было напечатать \mathbf{P}^n не только изолированно, не надо включать знаки доллара в определение:

\newcommand{\Pn}{\mathbf{P}^n}

При этом придется, конечно, ставить знаки доллара вокруг \Pn в тех случаях, когда в тексте встречается просто \mathbf{P}^n, но зато наш макрос можно будет использовать и как составную часть более сложных формул.

Есть, впрочем, и более удачный способ борьбы с этой проблемой: определите \Pn как

\newcommand{\Pn}{\ensuremath{\mathbf{P}^n}}

(без всяких знаков доллара) — и вы сможете спокойно пользоваться своей новой командой \Pn как в тексте, так и в формулах:

Пусть \Pn~ — $n$---мерное проективное пространство,
а $X\subset \Pn$~ — неприводимое многообразие...

(знаки ~ мы поставили, чтобы строчка не смогла начаться с тире —c.103). Команда \ensuremath всегда обрабатывает свой аргумент как математическую формулу, независимо от того, в тексте или в формуле вы ее используете.

Василий Майоров
Василий Майоров
Даврон Юсупалиев
Даврон Юсупалиев
Андрей Лучицкий
Андрей Лучицкий
Россия
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002