Ocasionalmente, é bom tornar um ou dois caracteres ativos no argumento de um comando, para que fique mais fácil para os autores codificarem os argumentos.
Caracteres ativos podem ser usados com segurança em tais situações; mas é necessário ter cuidado.
Um exemplo surgiu enquanto esta resposta estava sendo considerada: um aspirante a escritor de macros fez uma postagem no comp.text.tex pedindo ajuda para fazer com que #
e b
produzissem sinais musicais de sustenido e bemol, respectivamente, em uma macro para especificar acordes.
O primeiro problema é que tanto o #
quanto o b
são utilizados de outras formas importantes no TeX (para dizer o mínimo!), de modo que os caracteres só poderiam estar ativos enquanto o comando estivesse sendo executado.
Usando as técnicas discutidas em “Caracteres como comandos”, podemos definir:
e:\begingroup \catcode`\#=\active \gdef#{$\sharp$} \endgroup
O segundo problema refere-se ao momento: o comando tem que tornar cada caractere ativo antes de seus argumentos serem lidos: isso significa que o comando em si não pode “ter” argumentos, devendo ser dividido em duas partes. Então, escrevemos:\begingroup \lccode`\~=`\b \lowercase{\endgroup \def~{$\flat$}% }
e podemos usar o comando como\def\chord{% \begingroup \catcode`\#=\active \catcode`\b=\active \Xchord } \def\Xchord#1{% \chordfont#1% \endgroup }
\chord
{F\#}
ou
\chord
{Bb minor}
.
Duas características da codificação são importantes:
\begingroup
dentro do \chord
abre um grupo que é fechado pelo
\endgroup
dentro do \Xchord
; este grupo limita a mudança de códigos de categoria, que é o razão de ser de todo o exercício.
#
esteja ativo enquanto o \Xchord
é executado, ele
não estará ativo quando ele estiver sendo definido, de modo que a utilização de #1
não requer qualquer atenção especial.
Observe que a técnica usada em macros como a \chord
, aqui, é análoga à usada em comandos como o \verb
; e, da mesma maneira que \verb
(veja
“\verb
não funciona em argumentos”),
\chord
não vai funcionar dentro do argumento de outro comando (as mensagens de erro, se aparecerem, serão provavelmente bem estranhas).
This question on the Web: http://latex.net.br/faq/FAQ-actinarg.html
Do you have any question? Ask on: latex.net.br - we love qood questions!