Создание новых команд
Средства LaTeX'а, описываемые в этой лекции, позволяют сократить число нажатий на клавиши при наборе сложных текстов. Именно, мы расскажем, как создавать новые команды (или, если угодно, сокращенные обозначения), заменяющие собой длинные фрагменты из текста и TeX'овских команд. Официально такие новые команды называются макроопределениями, а в разговорной речи — макросами.
Макроопределения
Команды без аргументов
Начнем с примера. Пусть вы пишете текст, в котором регулярно
встречается математический значок (он
означает
" равно по определению"). Пользуясь тем, что вы узнали из
"
лекции 2 "
, нетрудно понять, что
генерируется этот значок внутри
математической формулы такой последовательностью команд:
\stackrel{\mathrm{def}}{=}
Часто писать такой длинный набор команд утомительно. Вот бы в
LaTeX'е была предусмотрена команда, скажем, \eqdef,
генерирующая символ бинарного отношения ,! Правда, такой
команды нет, но мы ее можем создать. Для этого следует написать
так:
\newcommand{\eqdef}{\stackrel{\mathrm{def}}{=}}
После того как TeX прочтет эту строку, он всюду, встречая
команду \eqdef, будет реагировать точно так же, как если бы
он видел текст \stackrel{\mathrm{def}}{=}. Например,
формула теперь получается так:
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. Коли так,
придумайте сокращенное обозначение (скажем, \btu ), напишите в
преамбуле
\newcommand{\btu}{\bigtriangleup}
и вы сможете писать формулы наподобие

$(A\btu B)\cap C= (A\cap C)\btu (B\cap C)$
Ранее было рассказано, что делать, чтобы создать согласующееся с нашими традициями обозначение для тангенса. Теперь мы понимаем, что это был пример макроопределения (если вам интересно знать, что значит команда \mathop в замещающем тексте).
В "лекции 2" вы найдете массу других примеров громоздких конструкций, для которых имеет смысл создать макросы.
А теперь — пример типичной ошибки. Пусть в тексте, который вы набираете, регулярно встречаются фразы наподобие
Подмногообразия проективного пространства
- основной объект изучения алгебраической геометрии,
и пусть для сокращения письма вы написали в преамбуле
\newcommand{\Pn}{$\mathbf P^n$}
Теперь можно писать, например, так:
... пространства~\Pn{} - основной объект...
Однако для набора формулы
написать $x\in\Pn$ не удастся: появится сообщение о том,
что символ ^ и команда \mathbf преступно употреблены
вне математической формулы. Причина проста:
TeX исправно подставляет вместо \Pn тот "замещающий
текст", который вы ему сообщили во втором аргументе
команды \newcommand. В результате этого при развертывании
макроса \Pn текст $x\in\Pn$ превращается в незаконный
текст $x\in$\mathbf P^n$$, в котором
математическая формула
заканчивается со вторым из знаков доллара, а символ ^
оказывается посреди обычного текста. Чтобы можно было
напечатать
не только изолированно, не надо включать
знаки доллара в
определение:
\newcommand{\Pn}{\mathbf{P}^n}
При этом придется, конечно, ставить знаки доллара
вокруг \Pn в тех случаях, когда в тексте встречается
просто , но зато наш макрос можно будет использовать и
как составную часть более сложных формул.
Есть, впрочем, и более удачный способ борьбы с этой проблемой: определите \Pn как
\newcommand{\Pn}{\ensuremath{\mathbf{P}^n}}
(без всяких знаков доллара) — и вы сможете спокойно пользоваться своей новой командой \Pn как в тексте, так и в формулах:
Пусть \Pn~ — $n$---мерное проективное пространство, а $X\subset \Pn$~ — неприводимое многообразие...
(знаки ~ мы поставили, чтобы строчка не смогла начаться с тире —c.103). Команда \ensuremath всегда обрабатывает свой аргумент как математическую формулу, независимо от того, в тексте или в формуле вы ее используете.