Caracteres ativos em argumentos de comando

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:

\begingroup
  \catcode`\#=\active
  \gdef#{$\sharp$}
\endgroup
e:
\begingroup
  \lccode`\~=`\b
  \lowercase{\endgroup
    \def~{$\flat$}%
  }
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:
\def\chord{%
  \begingroup
    \catcode`\#=\active
    \catcode`\b=\active
    \Xchord
}
\def\Xchord#1{%
    \chordfont#1%
  \endgroup
}
e podemos usar o comando como \chord{F\#} ou \chord{Bb minor}.

Duas características da codificação são importantes:

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).


Do you have any question? Ask on: latex.net.br - we love qood questions!