Use grupos {
... locais }
com sabedoria
Conforme indicado nesta resposta , caracteres ativos como ~
podem ser usados como um nome de macro. Infelizmente, ~
é o único caractere ativo por padrão, e alterar o código de gato para outro caractere é caro: \catcode`!13
leva 12 bytes. Se a nova definição de macro for necessária apenas em uma pequena região do seu código, os grupos locais poderão ser uma solução.
Quando o TeX entra em um novo grupo local aberto por {
, ele cria um novo nível de agrupamento na pilha de salvamento interna. Isso significa que todas as macros e registros atuais são salvos. Quaisquer modificações nelas (a menos que sejam explicitamente marcadas como \global
) agora só estão ativas até o fechamento do grupo }
. Isso significa que ~
pode ser redefinido dentro de um grupo, usado lá com a nova definição, e a definição antiga será restaurada automaticamente após o término do grupo.
Aqui está um exemplo:
\def~{abc}
~ -- {\def~{123}~} -- ~
Isso gera
abc - 123 - abc
Um efeito colateral interessante desse mecanismo de agrupamento é que os valores antigos ainda estão disponíveis dentro do grupo até serem alterados lá. Para ilustrar isso, imagine que queremos imprimir um número de caracteres com base no valor de um contador, preenchê-los com espaços até um comprimento fixo e continuar com o valor original do contador. Isso pode ser alcançado através do seguinte:
\newcount\x
\x=3
Print a char \the\x\ times,
{\x=-\x \advance\x 10 pad with \the\x\ spaces,}
and go on with x=\the\x.
quais saídas
Imprima um caractere 3 vezes, preencha com 7 espaços e continue com x = 3.
Esse comportamento de agrupamento é especialmente importante se você deseja usar as macros padrão do TeX para fazer um loop \loop ... \repeat
aninhado. Essas macros definem comandos internos e os utilizam para determinar como proceder. Aninhando-os sem colocar o loop interno entre chaves confundirá os comandos internos e levará a um comportamento inesperado.