
Как работают \newcommand
, \newcommand*
, \renewcommand
, \renewcommand*
, \newenvironment
, \newenvironment*
, и в чем разница между ними \renewenvironment
?\newenvironment*
решение1
Чтобы ответить на этот вопрос и удовлетворить ОП...
Весь набор команд определения макросов довольно взаимосвязан:
\newcommand{\foo}[num_of_args][opt first arg value]{% definition}
определяет\foo
\newcommand*{\foo}[num_of_args][opt first arg value]{% definition}
определяет\foo
, но не допускает разрывов в аргументах.\renewcommand{\foo}
переопределяет уже существующую команду\foo
\renewcommand*{\foo}
переопределяет\foo
, сno-parbreak
ограничением.\DeclareRobustCommand
с тем же синтаксисом, что\newcommand
и т. д., что делает команду надежной (т. е. защищенной/нерасширяемой).
В дополнение (скрыто) \newcommand
и его родственники определяются автоматически \endfoo
, поэтому невозможно сказать \newcommand{\endfoo}
себя. Подробнее об этом см. мой вопросЗарезервированы ли имена макросов \end.... в LaTeX2e?
Команды окружения: - \newenvironment{fooenv}[num_of_args]{first opt arg]{% startcode}{endcode}
определяют окружение с именем fooenv
, т. е. его можно использовать с \begin{fooenv}...\end{fooenv}
. Содержимое между этой парой группируется, т. е. \(re)newcommand
и т. д., изменения длины применяются только внутри этой пары и не видны снаружи, т. е. безопасны (если только \global
не используется - \renewenvironment
переопределяет существующее окружение - \newenvironment*
и \renewenvironment*
применяются с no-parbreak
ограничением.
Кроме того, есть \providecommand
(такой же синтаксис, как \newcommand
), который можно использовать для того, чтобы убедиться, что некоторая команда действительно определена. Если она уже определена, то \providecommand
ничего не делает.
Машина, стоящая за всем, — это базовая \def
команда TeX.
Кроме того, см.Разница между \newcommand и \newcommand*
Альтернативы из etoolbox
иxparse
Пакет
etoolbox
устанавливает возможности\(re)newrobustcmd*
для создания надежных команд.xparse
пакет:\NewDocumentCommand
,\RenewDocumentCommand
,\ProvideDocumentCommand
,\NewDocumentEnvironment
и\ProvideDocumentEnvironment
и\DeclareDocumentEnvironment
являются надежными версиями с лучшей обработкой аргументов, чем\newcommand
и т. д. Также есть расширяемый\DeclareExpandableDocumentCommand
, который следует использовать с осторожностью (как указано вxparse
руководстве)