
Como \newcommand
, \newcommand*
, \renewcommand
, \renewcommand*
, \newenvironment
, \newenvironment*
, \renewenvironment
, \newenvironment*
funcionam e qual a diferença entre eles?
Responder1
Para responder a isso para satisfazer o OP ...
Todo o conjunto de comandos de definição de macro está bastante conectado:
\newcommand{\foo}[num_of_args][opt first arg value]{% definition}
define\foo
\newcommand*{\foo}[num_of_args][opt first arg value]{% definition}
define\foo
, mas não permite parbreaks nos argumentos.\renewcommand{\foo}
redefine um comando já existente\foo
\renewcommand*{\foo}
redefine\foo
, com ano-parbreak
limitação.\DeclareRobustCommand
com a mesma sintaxe de\newcommand
etc. o que torna o comando robusto (ou seja, protegido/não expansível).
Além disso (oculto) \newcommand
e seus parentes são definidos automaticamente \endfoo
, portanto não é possível se dizer \newcommand{\endfoo}
. Para saber mais sobre isso, veja minha perguntaOs nomes de macro \end.... são reservados no LaTeX2e?
Os comandos de ambiente: - \newenvironment{fooenv}[num_of_args]{first opt arg]{% startcode}{endcode}
define um ambiente chamado fooenv
, ou seja, pode ser usado com \begin{fooenv}...\end{fooenv}
. O conteúdo entre este par é agrupado, ou seja, \(re)newcommand
etc, as alterações de comprimento são aplicadas apenas dentro deste par e não são visíveis fora, ou seja, seguras (a menos que \global
não sejam usadas - \renewenvironment
redefine um ambiente existente - \newenvironment*
e \renewenvironment*
são aplicadas com o no-parbreak
limite.
Além disso, existe \providecommand
(mesma sintaxe de \newcommand
) que pode ser usada para garantir que algum comando esteja realmente definido. Se já estiver definido, \providecommand
não faz nada.
A máquina por trás de tudo é o \def
comando básico do TeX.
Além disso, vejaDiferença entre \newcommand e \newcommand*
Alternativas de etoolbox
exparse
O
etoolbox
pacote estabelece as regras\(re)newrobustcmd*
para fazer comandos robustos.xparse
pacote:\NewDocumentCommand
,\RenewDocumentCommand
,\ProvideDocumentCommand
e\NewDocumentEnvironment
e\ProvideDocumentEnvironment
são\DeclareDocumentEnvironment
versões robustas com melhor tratamento de argumentos do que\newcommand
etc. Também existe um expansível\DeclareExpandableDocumentCommand
, que deve ser usado com cuidado (conforme indicado noxparse
manual)