
No es la primera vez que intento crear un nuevo comando sin éxito. Algunas cosas que descubrí no funcionaron (obtuve una "secuencia de control indefinida" u otros errores).
Utilice un argumento entre comillas.
\newcommand{\mytest}[1]{ \quote #1 \endquote }
Utilice el
\verb
comando con el argumento.\newcommand{\mytest}[1]{ \verb+#1+ }
Utilice el
begin{lstlisting}
medio ambiente:\newcommand{\mytest}[1]{ \begin{lstlisting} #1 \end{lstlisting} }
¿Sabes dónde puedo encontrar una lista exhaustiva de lo que puedo hacer \newcommand
y lo que no? y mejor aún, ¿por qué?
Respuesta1
Es bastante difícil decir qué se puede hacer con un \newcommand
, porque las posibilidades son (realmente) infinitas.
Puedo hablar de tus dos ejemplos, señalando los errores que estás cometiendo.
En la primera definición usas \quote
y \endquote
y esto es un error; \quote
es el comando que realiza LaTeX cuando encuentra \begin{quote}
, pero esto sucededespués de abrir un grupocomo efecto secundario de \begin
. El grupo normalmente se cierra \end
cuando LaTeX lo encuentra \end{quote}
, deshaciendo automáticamente la configuración de los parámetros realizada por \quote
.
Con su definición, después \mytest{something}
encontrará que el ancho de línea escambiado permanentementey la sangría izquierda continuará para siempre. En cambio, es seguro decir
\newenvironment{myenv}{\quote}{\endquote}
porque la agrupación será proporcionada por \begin{myenv}
y \end{myenv}
.
¿Cuál es la característica principal de \newcommand
? Veamos un ejemplo sencillo:
\newcommand{\foo}[1]{?#1!}
Ahora, si escribes \foo{xyz}
, es exactamente lo mismo que escribir
?xyz!
porque cuando TeX escanea, \foo
sabe que tiene que encontrar un argumento (el primer token después, \foo
si no lo es {
, o la lista completa de tokens hasta el correspondiente }
) y reemplazarlo \foo<argument>
con el texto de reemplazo especificado en la \newcommand
instrucción, donde <argument>
se indica con #1
.
Puede tener hasta nueve argumentos (incluso ninguno). Lo único que ha hecho es este “reemplazo”. Con definiciones adecuadas, junto con estructuras condicionales, se pueden definir incluso macros recursivas, pero esto sería demasiado largo para describirlo. La mayor parte de las “definiciones de usuario” son simplemente reemplazos simples (o levemente complejos) para marcar unidades lógicas.
TeX no escanea lo que viene después de un comando hasta quetienea. Entonces, al hacer \foo
, no irá más allá del argumento y no expandirá ninguna macro dentro del argumento hasta que finalice el reemplazo de la macro. Así que después
\foo{\baz{x}}
TeX verá
?\baz{x}!
después de lo cual primero se procesará ?
y luego \baz{x}
como si hubieran estado en la entrada desde el principio, pero con una pequeña diferencia que se muestra en el segundo ejemplo.
La diferencia al escribir \foo{\baz{x}}
y ?\baz{x}!
es que TeX ya tendrátokenizado \baz{x}
.
El \verb
comando funciona cambiando el significado de todos los caracteres especiales. Lo hace retrasando hasta lo posible la absorción del texto para ser tipografiado palabra por palabra y esto se hará en grupo; entonces
\verb+\baz{x}+
Hará los siguientes pasos.
- Abrir un grupo (mediante el suministro
{
) - Comience a componer en fuente monoespaciada
- Cambie el significado de todos los caracteres especiales a "imprimible"
- Definir
+
para comportarse como}
(el token de cierre del grupo) - Sigue escribiendo lo que encuentres.
- El seguimiento
+
deshará todas las configuraciones especiales.
La descripción no es completa, pero sí suficiente para nuestros propósitos; Hay otros detalles técnicos que son irrelevantes para comprender el panorama completo.
¿Qué pasa cuando defines?
\newcommand{\foo}[1]{\verb+#1+}
como propones? Cuando TeX \foo{\baz{x}}
lo ve, sabe que tiene que buscar un argumento y tokenizarlo. Por lo tanto el argumento escuatro fichas(Los separo por •)
\baz • { • x • }
y no hay cambios en el significado de \
y {
ya }
no se puede realizar. Peor aún, el +
que debería cambiar su significado para convertirse en el token de cierre del grupo no se puede modificar porque ya se ha tokenizado en el momento de la definición. Por lo tanto LaTeX tiene un mecanismo de protección que no permite \verb
estar en el argumento de un comando, porque cualquier tipo de mal podría suceder si lo usas en ese lugar: cambiar el significado de caracteres especiales sin tener la posibilidad de deshacer la configuración te pondría en peligro. en un rincón sin salida.
¿Existen soluciones alternativas? si, mira¿Cómo poner el comando \verb dentro del bloque \textbf{}?, pero antes que nada pregúntese si realmente necesita palabra por palabra en el argumento de un comando para empezar.