
É possível em LaTeX escrever expressões como \frac12
, que devem ser equivalentes a expressões como \frac{1}{2}
. Existe um termo formal para a primeira forma de notação?
Responder1
Não.
Isso é apenas parte da maneira normal como o TeX absorve argumentos de macro não delimitados. Se você definir
\def\foo#1{Something using #1 (or not).}
ou equivalente
\newcommand\foo[1]{Something using #1 (or not).}
quando \foo
é expandido, absorve o próximo token ou grupo balanceado no fluxo de entrada como seu argumento (que está disponível como #1
na definição). Assumindo códigos de categoria normais
- um token é um único caractere (exceto
\
,{
,}
ou%
um espaço ou nova linha (já que são ignorados)) ou uma sequência de comandos (algo que começa com\
), - um grupo equilibrado começa
{
e termina com o primeiro}
que não pertence a um grupo diferente (que começou depois). Os aparelhos são retirados do grupo após a absorção (ou seja,#1
não os contém).
É por isso que \foo x
e \foo{x}
, \newcommand{\foo}
e \newcommand\foo
ou \frac 12
, \frac{1}{2}
e \frac{1}2
são \frac1 2
equivalentes.
É uma boa prática escolher a versão mais clara, o que geralmente significa usar um grupo. Pessoalmente, omito explicitamente o grupo nos casos em queprecisainsira um único token, como \newcommand\foo
.
Responder2
Pode valer a pena acrescentar que a distinção entre argumentos de token único e argumentos entre colchetes é mais explícita em LaTeX3/ expl3
. Por convenção, todo expl3
nome de macro deve terminar em :
seguido por uma sequência de letras, chamadas especificadores de argumento, cada uma refletindo o tipo do argumento correspondente.
Ao lado de muitos outros temos
n
para argumentos de grupo entre chaves ou de token único, eN
apenas para argumentos de token único, geralmente nomes de macro/função ou nomes de variáveis.
Esses especificadores ainda não mudam a maneira como o (La)TeX processa os argumentos individuais, mas dão uma dica ao usuário sobre como os argumentos são usados dentro da macro.
Por exemplo, o l3tl
pacote fornece duas funções \tl_if_empty:nTF
e \tl_if_empty:NTF
. Embora ambas as funções verifiquem se uma lista de tokens está vazia e executem o código condicionalmente, espera-se que a primeira seja chamada com um grupo de tokens entre chaves, enquanto a última espera uma variável de lista de tokens que é primeiro expandida antes do teste ser executado em seu conteúdo.