За время нашего изучения LaTeX мы изучили множество команд, которые позволяют выполнять те или иные функции и получать тот или иной результат в конечном документе. LaTeX позволяет пользователю создавать свои команды, а также несколько изменять содержимое тех команд, которые уже есть. Сейчас мы научимся простейшим операциям подобного рода. Я создаю в документе новый раздел. Я назову его «Новые команды». И создам новую команду. Чтобы создать новую команду, нужно использовать команду \newcommand. У нее два обязательных аргумента: название новой команды и что она будет делать. Я сейчас с помощью своей новой команды решу следующую задачу: есть такой красивый значок, который часто используют экономисты, который означает, что какой-то набор нестрого предпочитается какому-то другому. Чтобы ввести этот значок, нужно подсмотреть в таблицу символов, потому что у него длинное неинтуитивное название. Поскольку я часто использую его в своей работе, я сейчас создам для него короткое название, которое легко запомнить. Давайте я назову эту команду как-нибудь \nw - от слова «не хуже». Здесь тоже нужно указать начиная с двойного, вернее, начиная с обратного слэша. Итак, у команды \newcommand первый обязательный аргумент – это название команды, включая обратный слэш, а во втором – что она будет делать. Ну, вот, я знаю, что та команда, которая мне нужна, вот так вот странно называется. Это довольно трудное название с тремя буквами «s» подряд, но благодаря, благодаря тому, что я создал для нее короткое название, теперь я смогу просто писать \nw, и этот значок будет подставляться. Давайте я продемонстрирую это: скажем, я хочу сказать, что x нестрого предпочитается y, то есть я в математическом режиме пишу «x \nw y», и получается, что значок именно тот, который мне нужен, отобразился здесь. Это команда, которую я сам для себя создал, чтобы сократить ее написание в своих документах, поскольку я ее часто использую. Можно пойти еще дальше. Этот значок - это математический значок, его можно использовать в математическом режиме. Но... что, если я захочу использовать его просто в тексте? Понятно, что я смогу просто написать его внутри знаков доллара, слева и справа поставить доллар - перейти в математический режим, и всё будет хорошо. Но поскольку я сам создаю эту команду, то я могу еще больше облегчить себе жизнь и сделать так, чтобы математический режим включался сам тогда, когда это нужно. Скажем, если я не сделаю этого, сейчас просто напишу, что «Предпочтение \nw является полным». Неважно, что это означает, просто какое-то утверждение из микроэкономики. Если я попытаюсь запустить это, то я получу одну из любимых ошибок, что пропущен доллар. «Пропущен доллар» означает, что я пытался использовать математическую команду в нематематическом режиме. Однако, существует способ сделать так, чтобы математический режим включался сам собой. Заметьте, что я не могу поставить доллары просто в тексте того, что исполняет команда, потому что иногда эти доллары не нужны, если математический режим уже включен, то дополнительно переходить в него не надо. Поэтому я воспользуюсь специальным атрибутом, специальной командой, которая называется \ensuremath. То есть проверить, что математический режим. Эта команда ничего не делает, если значок попадет в математический режим, то есть уже будет внутри знаков доллара или внутри какого-нибудь математического окружения, и поставит доллар, если это не так. Теперь я могу запустить это на обработку, и ошибки не будет. То есть математический режим включился сам собой. Обратите внимание, что команда \nw съела пробел, который после... после... нее должен быть в текстовом режиме, но его не оказалось. Этот пробел можно поставить вручную. Так иногда бывает с командами, у которых нет аргументов. Я могу поставить его вот просто таким... командой бэкслэш пробел - обратный слэш пробел (\ ). Эта команда поставит здесь пробел принудительно. Вот, теперь, теперь всё выглядит так, как должно. Ну, это была самая простая команда, которая просто заменяет другую команду, то есть делает ее название короче. Можно создавать целые программы внутри \newcommand, то есть с помощью этой... с помощью этого оператора можно делать довольно сложные вещи. Давайте сейчас попробуем сделать немножко... чуть-чуть более сложную вещь, а именно - новую команду с аргументом. Я пишу \newcommand, здесь я могу написать ее название, у меня это будет называться \str – скоро вы увидите, почему. После этого можно написать необязательный аргумент, в котором указать количество аргументов нашей новой команды. То есть если мы создаем новую команду, которой самой по себе нужно будет скармливать какой-то аргумент, то здесь нужно указать, сколько таких аргументов будет. Ну, скажем, у меня будет всего один аргумент. Так, ну а потом, во вторых фигурных скобках, нужно написать, что она делает. Ну... Вот, что она у меня будет делать. Я буду использовать эту команду следующим образом: если я хочу вставить ссылку на какую-то страницу с помощью команды \pageref, я не хочу каждый раз писать... «на странице такой-то». Поэтому я заставлю эту команду слова «на странице» подставлять автоматически. Поэтому то, что должна сделать моя команда, - это в любом случае написать слова «на странице», а потом подставить сюда ту ссылку, которую я хочу, чтобы... она подставила. То есть сослаться именно на тот объект, который мне нужен. Этот объект... как я сообщу команде, какой объект мне нужен? С помощью того самого одного аргумента, который я указал в квадратных скобках. Этот аргумент... Ну, мне нужна команда \pageref. У команды \pageref в качестве аргумента выступает название ссылки, на которую я хочу здесь поставить... обозначение, которое я хочу здесь поставить. Но сейчас я не знаю, сейчас я просто пишу общую процедуру, которой дальше буду много раз пользоваться. Поэтому то, что я сюда подставлю – это значение аргумента, которое эта команда получит. В моем случае аргумент всего один, и вот такой язык, чтобы его здесь подставить – это # и единичка. Если бы аргументов было 5 и мне нужен был бы четвертый, то тут была бы # и четверка. Давайте это опробуем. У меня пока нет... Не на что ссылаться, но давайте я превращу свое старое отношение предпочтений в объект типа equation и поставлю на него ссылку. Так, \begin{equation}, \ref, а, точнее, \label, pref от слова preferences. А теперь я воспользуюсь своей командой, которую я только что создал. Я хочу сказать: «Cм. уравнение \eqref{pref} на странице...» А вот «на странице» мне писать не нужно, иначе зачем я создавал эту команду. Вместо этого я сейчас напишу \str, то есть название искусственно созданной только что команды. Какой у нее должен быть аргумент? У нее аргументом должно быть называние лэйбла, на который я хочу сослаться. Это слово pref. Так, давайте посмотрим, что получилось. Да. Ну, получилось ровно то, что нужно. Точнее почти, что нужно. Смотрите... Ну, произошло то, что я ожидал. То есть здесь написано: «См. уравнение (1) на стр. 1». То есть слова «на странице» написались сами, благодаря тому, что я указал их в команде. Однако, не всё здесь выглядит идеально. Потому что вокруг вот этих слов «на стр. 1» почему-то оказались лишние пробелы. Почему? Если внимательно посмотреть на то, как я создавал эту команду, то эта команда, помимо вот этих самых слов «на стр. \pageref{#1}», содержит два переноса строки. После открывающейся фигурной скобки и перед закрывающейся. Ну, мне так было удобнее. Я, чтобы... чтобы как-то отделить содержимое команды от ее названия, я начал писать содержимое с новой строки. Но это создало нежелательные пробелы. Поэтому, чтобы справиться с этим, я напишу все в одну строку. Вот, теперь лишних пробелов нет. Ну, писать всю команду в одну строку – это неудобно. Поэтому существует способ, как всё-таки поставить здесь разрыв строки после открывающейся фигурной скобки, но не создавать пробел. Оказывается, что нужно просто поставить знак процента. Это будет означать, что всё, что есть в этой строке, в том числе и перенос на следующую строку – это комментарий, который не будет восприниматься системой. То же самое я могу сделать здесь. Так... Да, я ошибся в том, что пробелы всё-таки остались, их надо окончательно удалить, пробелы перед знаками процента, и вот теперь всё в порядке. Итак, полезный урок на будущее – знак процента в конце строки, написанный непосредственно после последнего символа, который в этой строке есть, убивает пробел, который перенос строки создает. Так, ну, у команд, которые LaTeX знает, существует обязательные аргументы и необязательные. Мы пока научились создавать команду с одним обязательным аргументом. Инструментарий \newcommand позволяет создавать команды более сложные, чем те, которые мы сейчас сделали. В частности, в них может быть любое количество обязательных аргументов. Ну, любое, там, мне кажется, там есть ограничения - не больше девяти, больше вам вряд ли понадобится. А вот необязательных может быть только один. Причем, девять аргументов максимум, из них один, только один, самое наибольшее, необязательный. Это ограничения, которые есть у инструментария \newcommand. Вы можете воспользоваться другими пакетами, которые позволяют создавать более продвинутые команды и указывать в них любое количество аргументов, как обязательных, так и нет, в любом порядке, и настраивать их самыми изощренными образами. В материалах этой лекции вы найдете краткое пояснение о том, с помощью каких пакетов это делается и где можно почитать об этом подробнее. Но сейчас давайте с помощью того же самого инструментария \newcommand создадим простую команду с одним обязательным аргументом и одним необязательным. Я пишу снова \newcommand, название, ну какое-нибудь произвольное название - \qwerty. Вы можете подбирать его так, чтобы вам было легко запомнить, что оно означает. Так, в аргументе... втором обязательном аргументе команды \newcommand, должно быть описание того, что эта команда делает. Но я хочу, чтобы у этой команды были аргументы. Поэтому... У команды \qwerty, новой команды, были аргументы. Поэтому между двумя обязательными аргументами команды \newcommand я напишу следующее. Во-первых, цифру 2 в квадратных скобках – это означает, что всего аргументов будет два. Мы уже делали очень похожую вещь, когда делали команду \str. Там была цифра 1 – это означает, что всего один аргумент. В моей новой команде \qwerty будет два аргумента. И я хочу, чтобы один из них стал необязательным. Правило команды \newcommand заключается в том, что это должен быть аргумент номер 1. То есть если обязательные аргументы... необязательные аргументы есть, то это только аргумент номер 1. Все остальные точно будут обязательными. Чтобы указать LaTeX на то, что у меня будет первый необязательный аргумент, мне нужно указать здесь еще кое-что в квадратных скобках - прямо рядом с этой двойкой открыть еще одни квадратные скобки и написать там, чему должно быть равно значение первого аргумента по умолчанию. Поскольку этот аргумент необязательный, то пользователь вполне может не сообщить ничего в качестве значения этого аргумента. Тогда LaTeX должен знать, что туда подставлять, и мне нужно написать здесь какое-то значение по умолчанию. Давайте я напишу здесь, что это будет просто X. Буква, просто буква «X». То есть если пользователь не сообщил значение первого аргумента, то нужно подставить букву «X» вместо этого значения. Я мог здесь ничего не писать, тогда значение по умолчанию было бы пустым. Так, что я хочу, чтобы эта команда делала? Я хочу, чтобы эта команда, во-первых, переходила в окружение equation, во-вторых, внутри этого окружения equation писала мне, что то, что сообщено в виде первого аргумента, находится в нестрогом предпочтении к тому, что сообщено в виде второго аргумента. То есть я напишу здесь #1 в значении первого аргумента, который необязательный. Потом эту созданную мной команду \nw, которая делает такой красивый значок с закругленными краями, а потом значение второго аргумента. Так. Что мне стоит ждать от деятельности этой команды? Если я сообщу оба аргумента команде \qwerty, то она напишет мне, что первый аргумент находится в нестрогом предпочтении ко второму. Если... если я не сообщу ей значение первого аргумента, то она напишет букву «X» вместо первого аргумента. Давайте воспользуемся этой командой. Я напишу сейчас здесь \qwerty и сообщу оба аргумента для начала. Первый аргумент пусть будет Z, он необязательный, поэтому в квадратных скобках, второй аргумент обязательный, поэтому в фигурных, во втором аргументе – Y. То есть сейчас я ожидаю, что эта команда напишет «Z не хуже Y». Это и произошло. Если вы посмотрите на результат, то написано: «Z не хуже Y». Что произойдет, если я не буду сообщать необязательный аргумент? То есть напишу просто \qwerty[Y]? Ну, то, чего стоит ожидать – это то, что вместо необязательного аргумента LaTeX подставит значение, которое я сообщил при создании команды по умолчанию. Ну и действительно – теперь «X не хуже Y». Так, ну и последнее, что мы рассмотрим в рамках создания новых команд – это переопределение старых команд под себя. Существует... способ сделать так, чтобы команды, которые уже кем-то определены: или вами, так как я определил сейчас несколько команд, или LaTeX, отображались, ну, вернее, делали что-то, что они до этого не делали. Скажем, я могу сейчас переопределить - для этого существует \renewcommand, такая команда - я могу переопределить команду, которая ставит знак больше либо равно. Если вы внимательно прошли материалы первой недели нашего курса, то вы знаете, что больше либо равно – это знак, который ставится командой \ge – greater or equal. Но этот знак... по умолчанию LaTeX ставится не совсем так, как принято в русской математической традиции. Потому что в хорошо изданных русскоязычных книжках по математике в знаке больше либо равно равно нижняя черточка, которая отвечает за равенство, параллельна нижней черточке, которая отвечает за неравенство. А в западной традиции, которой по умолчанию придерживается LaTeX, эта нижняя черточка горизонтальна. Так вот, если я хочу, чтобы знак больше либо равно был красивым - такой, какой принят в русскоязычной типографской традиции, - то я могу сделать следующее: я могу переопределить команду больше либо равно, и в качестве того, что она делает, сказать, чтобы она ставила тот самый значок другого вида, который... в котором нижняя черточка параллельна той черточке, которая над ней. Ну и давайте сравним. Я попробую до и после \renewcommand написать одно и то же. А именно, что «x \ge y». Я написал это один раз до \renewcommand, и второй раз - после \renewcommand. Результаты должны отличаться. Действительно, вы видите, что после переопределения команды вид знака больше либо равно изменился. Я могу один раз написать это \renewcommand в преамбуле и после этого забыть об этом. То есть всегда использовать обычную команду \ge для символа больше либо равно, и будет правильный красивый знак. На последней неделе, когда мы будем обсуждать особенности работы с русским языком в LaTeX, мы введем еще много таких обозначений, которые кое-что меняют в математике так, чтобы это соответствовало русской типографской традиции.