
Es posible en LaTeX escribir expresiones como \frac12
, que deberían ser equivalentes a expresiones como \frac{1}{2}
. ¿Existe un término formal para la primera forma de notación?
Respuesta1
No.
Esto es sólo parte de la forma normal en que TeX absorbe argumentos macro no delimitados. si defines
\def\foo#1{Something using #1 (or not).}
o equivalente
\newcommand\foo[1]{Something using #1 (or not).}
cuando \foo
se expande, absorbe el siguiente token o grupo equilibrado en el flujo de entrada como argumento (que está disponible como #1
en la definición). Asumiendo códigos de categoría normales
- un token es un solo carácter (excepto
\
,{
, o un espacio o nueva línea (ya que se ignoran)) o una secuencia de comando (algo que comienza con}
) ,%
\
- un grupo equilibrado comienza
{
y termina con el primero}
que no pertenece a un grupo diferente (que empezó después). Los brackets se eliminan del grupo al ser absorbidos (es decir,#1
no los contienen).
Por eso \foo x
y \foo{x}
, \newcommand{\foo}
y \newcommand\foo
o \frac 12
, \frac{1}{2}
y \frac{1}2
son \frac1 2
equivalentes.
Es una buena práctica elegir la versión que sea más clara, lo que normalmente implica utilizar un grupo. Personalmente, omito explícitamente el grupo en los casos en los quetengo queingrese un solo token, como \newcommand\foo
.
Respuesta2
Podría valer la pena agregar que la distinción entre argumentos de un solo token y argumentos entre llaves es más explícita en LaTeX3/ expl3
. Por convención, cada expl3
nombre de macro debe terminar :
seguido de una secuencia de letras, llamadas especificadores de argumento, cada una de las cuales refleja el tipo del argumento correspondiente.
Además de muchos otros tenemos
n
para argumentos de grupo arriostrado o de un solo token, yN
solo para argumentos de un solo token, generalmente nombres de macros/funciones o nombres de variables.
Esos especificadores aún no cambian la forma en que (La)TeX procesa los argumentos individuales, pero le dan una pista al usuario sobre cómo se usan los argumentos dentro de la macro.
Por ejemplo, el l3tl
paquete proporciona dos funciones \tl_if_empty:nTF
y \tl_if_empty:NTF
. Si bien ambas funciones verifican si una lista de tokens está vacía y ejecutan código de manera condicional, se espera que la primera sea llamada con un grupo de tokens entre llaves, mientras que la segunda espera una variable de lista de tokens que primero se expande antes de realizar la prueba en su contenido.