Utilizzare locali {
... }
gruppi con saggezza
Come sottolineato in questa risposta , caratteri attivi come ~
possono essere usati come nome macro. Sfortunatamente, ~
è l'unico carattere attivo di default e cambiare il codice cat per un altro personaggio è costoso: \catcode`!13
richiede 12 byte. Se la nuova definizione di macro è necessaria solo in una piccola area del codice, i gruppi locali possono essere una soluzione.
Quando TeX entra in un nuovo gruppo locale aperto da {
, crea un nuovo livello di raggruppamento nello stack di salvataggio interno. Ciò significa che tutte le macro e i registri correnti vengono salvati. Qualsiasi modifica apportata (se non esplicitamente contrassegnata come \global
) ora è attiva solo fino alla chiusura del gruppo }
. Ciò significa che ~
può essere ridefinito all'interno di un gruppo, utilizzato lì con la nuova definizione e la vecchia definizione verrà automaticamente ripristinata al termine del gruppo.
Ecco un esempio:
\def~{abc}
~ -- {\def~{123}~} -- ~
Questo produce
abc - 123 - abc
Un interessante effetto collaterale di questo meccanismo di raggruppamento è che i vecchi valori sono ancora disponibili all'interno del gruppo fino a quando non vengono modificati lì. Per illustrarlo, immagina di voler stampare un numero di caratteri in base al valore di un contatore, riempirli con spazi fino a una lunghezza fissa e continuare con il valore del contatore originale. Ciò potrebbe essere ottenuto mediante:
\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.
quali uscite
Stampa un carattere 3 volte, pad con 7 spazi e continua con x = 3.
Questo comportamento di raggruppamento è particolarmente importante se si desidera utilizzare le macro standard di TeX per il looping \loop ... \repeat
nidificato. Queste macro definiscono i comandi interni e li usano per determinare come procedere. Annidarli senza mettere l'anello interno tra parentesi graffe confonderà i comandi interni e porterà a comportamenti imprevisti.