Котельников И., Чеботаев П. LaTeX2e по-русски (1185906), страница 34
Текст из файла (страница 34)
В данном случае команда \gn предназначена для использования в текстовом или строковом режимах. Она содержит команду \alpha, которая можетприменяться только в математическом режиме, и именно поэтому значки $ присутствуют в определении команды \gn в аргументе \newcommand, окружая \alphaс обеих сторон. Попытка применения \gn в математической формуле приведётк ошибке, поскольку первый символ $ в определении \gn заставит LATEX выйтииз математического режима. Однако команду \gn можно сконструировать так,чтобы её можно было использовать в любом режиме. Эта задача решается припомощи команды \ensuremath, которая обеспечивает печать своего аргумента вматематическом режиме независимо от текущего режима работы.Для первичного определения команды \gn мы применили \newcommand.
Дляпереопределения уже существующей команды необходимо использовать декларацию \renewcommand:\renewcommand{\gn}{\ensuremath{\alpha_{v}}}Пусть \gn\ есть концентрация мух,причём $\int\gn\,dV=1$.Пусть αv есть концентрация мух, причём αv dV =1.Она позволяет переопределять даже собственные команды LATEX’а, а не тольковведённые пользователем:\Large \renewcommand{\Large}{\tiny}Большое стало \Large маленьким!Большое сталомалень-ким!Читатель не должен переопределять действие команд LATEX’а, если плохо представляет себе последствия своих действий, так как изменение одной команды может отразиться на исполнении многих других.
Нельзя переопределять команды,чьё имя начинается с \end. Имя команды должно начинаться с обратного слеша\ и состоять только из латинских букв, так как наряду с пробелом любая русскаябуква, цифра, знак препинания, любой из пяти знаков математических операцийили любой из десяти служебных символов (раздел 1.4) служат признаком концаимени команды.LATEX может не обнаружить ошибку, если имя команды содержит, например,цифру, однако результат будет отличаться от желаемого.
Впрочем, допускаются команды с именами, состоящими только из обратного слеша и одного знака7.1. Определение новых команд159препинания или одной цифры. Все возможные команды с именами, состоящимииз обратного слеша и одного знака препинания, знака математической операцииили служебного символа, уже заняты. Переопределять же их крайне рискованно.Что касается команд с именами \0, \1, \2 .
. . \9, то для официальных руководствпо LATEX’у они просто как бы не существуют. Это значит, что «фирма» не несетответственности за их применение.Нужно также предостеречь от определения команд, замещающих командныескобки \begin и \end. Многие пользователи привычно вводят сокращения наподобие \be, \ee для ускорения набора уравнений:\newcommand{\be}{\begin{equation}}\newcommand{\ee}{\end{equation}}В подобных случаях результат не всегда гарантирован.
Можно указать несколько случаев, когда подобные определения по меньшей мере бесполезны. Например, команда \ev для замены \end{verbatim} заведомо вызовет ошибку, поскольку в теле процедуры verbatim не распознается ни одна команда, кроме\end{verbatim} (раздел 5.5). Также не следует замещать командные скобки дляпроцедур figure и table, которые создают так называемые плавающие объекты(глава 11), если эти объекты должны «уплывать» в конец документа, как бываетпри использовании пакета endfloat.Вновь определяемые команды могут иметь до девяти аргументов.
Рассмотримследующий пример:\newcommand{\F}[2]{#2_{0} \ldots #2_{#1}}Последовательность $\F{k}{x}$ содержит$k+1$ член.Последовательностьx0 . . . xk содержит k + 1член.Необязательный аргумент 2 в квадратных скобках в определении команды \Fуказывает, что она имеет два аргумента. Обозначения #1 и #2 в последнем аргументе \newcommand называются параметрами; при исполнении команды \F онизамещаются соответственно её первым и вторым аргументами.LATEX запоминает определение новой команды так, как оно записано в декларации \newcommand. Когда LATEX исполняет команду \F, он замещает обозначение\F{k}{x} её определением, подставляя аргументы команды \F вместо параметров#1 и #2.
Затем LATEX обрабатывает полученный таким способом текст почти также, как если бы он был набран во входном файле вместо команды \F. Исключение составляют пробелы после имени команды — они игнорируются. Определение команд, которые бы добавляли пробелы после себя, вряд ли станет удачнымизобретением, так как может привести к появлению пробелов, нежелательных внекоторых ситуациях.Один аргумент у новоиспечённой команды можно объявить необязательным.Для этого при определении команды необходимо указать его значение по умолчанию.
Продолжая упражняться с командой \F, переопределим её так, чтобыона имела необязательный аргумент:160\renewcommand{\F}[2][k]{#2_0 \ldots #2_{#1}}Сравните $\F{x}$ и $\F[N]{x}$.Глава 7. Программируйте самиСравните x0 . . . xk иx0 . . . xN .Необязательным является всегда первый аргумент. В определении команды онзамещается параметром #1.Фигурные скобки, окружающие последний аргумент деклараций \newcommandили \renewcommand, не являются частью определения новой команды.
Это означает, что эти фигурные скобки не ограничивают область действия деклараций,которые могут входить в определение новой команды. При необходимости область действия таких деклараций должна быть указана дополнительными фигурными скобками:\newcommand{\good}[2]{{#1}($#2$)}\newcommand{\bad}[2]{#1($#2$)}Функция \good{\em F}{x} хорошая, а в\bad{\em G}{y} действие декларации \verb|\em|распространяется на последующий текст.Функция F(x) хорошая, ав G(y) действие декларации \em распространяетсяна последующий текст.Поскольку символы $ также ограничивают область действия деклараций, запись${#2}$ была бы избыточной: она полностью эквивалентна $#2$.Подведём итоги. Команды\newcommand{cmd}[num][opt]{def}\renewcommand{cmd}[num][opt]{def}\providecommand{cmd}[num][opt]{def}являются декларациями.
Первые две соответственно определяют новую и переопределяют уже существующую команду cmd, а не упоминавшаяся доселе команда \providecommand действует, как \newcommand, если cmd ранее не былаопределена, либо сохраняет действующее определение, если cmd уже существует. Аргументы деклараций имеют следующее назначение:cmd — имя команды; должно начинаться с \ и состоять из последовательности латинских букв либо из одной не буквы (т.
е. цифры, знака препинанияили служебного символа). Для \newcommand команда с именем cmd не должна быть ранее определена и не должна начинаться с \end. Напротив, для\renewcommand имя cmd должно быть введено ранее;num — целое число от 1 до 9, означающее количество аргументов у вновь определяемой команды. По умолчанию новая команда не имеет аргументов;opt — значение необязательного аргумента. При наличии [opt] первый аргументcmd объявляется необязательным и по умолчанию имеет значение opt; приотсутствии [opt] все аргументы являются обязательными;def — текст, который подставляется вместо каждого появления cmd во входномфайле.
Если в def находится параметр вида #n, вместо него подставляется n-йаргумент команды cmd. Фигурные скобки, окружающие def, не ограничивают область действия деклараций, находящихся в def. Вновь определяемая7.1. Определение новых команд161команда является хрупкой, если def содержит хрупкие команды; иначе онаявляется устойчивой. Аргумент def может содержать декларации, которыеопределяют другие команды и процедуры, если те не имеют аргументов.Новые команды можно определять в любом месте входного файла. При этом следует иметь в виду, что область действия деклараций \newcommand, \renewcommandи \providecommand подчиняется общим правилам, изложенным в разделе 2.5.
Поэтому команда, определённая внутри какой-нибудь процедуры, затирается привыходе из неё. Кроме того, область, где сохраняется определение команды, можноявно ограничить фигурными скобками. Иногда это очень полезно для локальногопереопределения отдельных команд.
Однако общее правило гласит, что определения новых команд полезно собирать в одном месте, например в преамбуле. Тогдаих легко находить и при необходимости модифицировать.Команда\ensuremath{arg}обеспечивает обработку своего аргумента arg в математическом режиме вне зависимости от текущего режима; обычно используется при определении командили процедур, которые одинаковым образом должны работать как в текстовом,так и в математическом режимах.Добавим ещё пару слов о стратегии командостроения.Имена команд должны отражать их назначение. Всего через пару недель будет невозможно вспомнить, для чего предназначалась команда с маловразумительным названием \BM:\newcommand{\BM}[1]{\mbox{\mathversion{bold}$#1$}}С помощью этой весьма полезной команды полужирный символ α записывается в виде \BM{\alpha}.
В научных статьях так обычно печатают обозначениявекторов. Поэтому лучше было бы переопределить команду \vec:\renewcommand{\vec}[1]{\mbox{\mathversion{bold}$#1$}}поскольку её название более чем красноречиво.Все свои любимые команды Читатель может собрать в одном файле, назвав его, например, shorts.tex, и вводить во входной файл командой \input{shorts}.
Если когда-нибудь Читатель последует этому совету, полезно будетвспомнить, что пакет bm (раздел 6.6) вводит команду \bm с названием, похожимна \BM, и с примерно той же целью. Небольшое усовершенствование\providecommand{\bm}[1]{\mbox{\mathversion{bold}$#1$}}\renewcommand{\vec}[1]{\bm{#1}}позволит задействовать всю мощь пакета bm, одновременно заготовив запасной,более простой вариант набора векторов на случай, если пакет не загружен.Наконец, выполним своё обещание и расскажем, как создать команду, котораябы не игнорировала пробелы после своего имени. Фокусы с пробелами позволяетпроделывать команда162Глава 7.
Программируйте сами(xspace)\xspaceреализованная в пакете xspace Дэвида Карлайла (Carlisle, David). Она вставляетпробел, но только тогда, когда за ней не следует знак препинания, одна из фигурных скобок, закрывающая круглая скобка, прямой или обратный слеш. Есликоманду \xspace добавить в определение другой команды, то та, как правило,оставляет за собой пробел только в необходимых случаях:\newcommand{\gb}{Англия\xspace}\gb расположена на небольшом островеу побережья Франции. Это неплохоеместечко, \gb, чтобы там жить.Англия расположена на небольшомострове у побережья Франции. Этонеплохое местечко, Англия, чтобытам жить.В результате отпадает необходимость набирать вслед за именем команды {} или\␣, чтобы оставить пробел в тексте печатного документа.