
¿ Cómo funcionan \newcommand
, \newcommand*
, \renewcommand
, \renewcommand*
, \newenvironment
, \newenvironment*
, y cuál es la diferencia entre ellos?\renewenvironment
\newenvironment*
Respuesta1
Para responder a esto para satisfacer el OP...
Todo el conjunto de comandos de definición de macros 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
pero no permite pausas en los argumentos.\renewcommand{\foo}
redefine un comando ya existente\foo
\renewcommand*{\foo}
redefine\foo
, con lano-parbreak
limitación.\DeclareRobustCommand
con la misma sintaxis que\newcommand
etc., lo que hace que el comando sea robusto (es decir, protegido/no ampliable).
Además (oculto) \newcommand
y sus parientes se definen automáticamente \endfoo
, por lo que no es posible decirlo \newcommand{\endfoo}
por sí mismo. Para obtener más información sobre esto, consulte mi pregunta.¿Están reservados los nombres de macro \end.... en LaTeX2e?
Los comandos del entorno: - \newenvironment{fooenv}[num_of_args]{first opt arg]{% startcode}{endcode}
define un entorno denominado fooenv
, es decir, se puede utilizar con \begin{fooenv}...\end{fooenv}
. El contenido entre este par está agrupado, es decir, \(re)newcommand
etc., los cambios de longitud se aplican solo dentro de este par y no son visibles en el exterior, es decir, son seguros (a menos que \global
no se utilicen ( \renewenvironment
redefine un entorno existente) \newenvironment*
y \renewenvironment*
se apliquen con el no-parbreak
límite.
Además, existe \providecommand
(la misma sintaxis que \newcommand
) que se puede utilizar para asegurarse de que algún comando esté realmente definido. Si ya está definido, entonces \providecommand
no hace nada.
La máquina detrás de todo es el \def
comando TeX básico.
Además, verDiferencia entre \newcommand y \newcommand*
Alternativas de etoolbox
yxparse
El
etoolbox
paquete establece las herramientas\(re)newrobustcmd*
para realizar comandos robustos.xparse
paquete:\NewDocumentCommand
,\RenewDocumentCommand
,\ProvideDocumentCommand
,\NewDocumentEnvironment
y\ProvideDocumentEnvironment
y\DeclareDocumentEnvironment
son versiones robustas con un mejor manejo de argumentos que\newcommand
etc. También hay un expandible\DeclareExpandableDocumentCommand
, que debe usarse con cuidado (como se indica en elxparse
manual).