Definir caracteres como macros

Caracteres individuais podem atuar como macros (comandos definidos), e tanto o Plain TeX quanto o LaTeX definem o caractere “~” como um “espaço não divisível”. Um caractere se torna definível ou "ativo" ao se ajustar seu category code (catcode) para \active (13):

\catcode`\_=\active
Qualquer caractere poderia, em princípio, ser ativado dessa maneira e definido como uma macro:
\def_{\_}
o que poderia se caracterizar como uma resposta excessivamente simples para uComo tipografar um caractere underline. No entanto, você deve ser cauteloso: enquanto um til ativo é algo que as pessoas esperam, outros caracteres ativos podem ser inesperados e interagir mal com outras macros.

Além disso, ao definir um caractere ativo, você impede o uso do caractere para outros fins, e há poucos caracteres “livres” para serem subvertidos dessa maneira.

Para definir o caractere “z” como um comando, diríamos algo como:

\catcode`\z=\active
\def z{Yawn, I'm tired}%
e cada “z” subsequente no texto se tornaria um “yawn”. Essa seria uma ideia incrivelmente ruim para a maioria dos documentos, mas pode ter aplicações especiais. (Note que, em “\def[[[texttt]]][[[LBRACE]]] z[[[RBRACE]]]”, o “z” não é mais interpretado como uma letra; o espaço não é, portanto, necessário — “\defz” estaria ok; optamos por manter o espaço, para maior clareza.) Alguns pacotes LaTeX facilitam essas definições. Por exemplo, o pacote shortvrb, com seu comando \MakeShortVerb.

O TeX usa códigos de categoria para interpretar caracteres à medida que são lidos a partir da entrada. Alterar um valor de catcode não afetará caracteres que já tenham sido lidos. Portanto, é melhor que os caracteres tenham códigos de categoria fixos pela duração de um documento. Se catcodes forem alterados para fins específicos (o comando \verb faz isso), os caracteres alterados não serão interpretados corretamente quando aparecerem no argumento de outro comando (como, por exemplo, em argumentos do comando “\verb”). Um caso exemplar é o do pacote doc), que processa arquivos .dtx usando o pacote shortvrb para definir |…| como uma abreviação de \verb|…|. Mas o | também é usado nos preâmbulos de ambientes de tabela, de modo que tabelas em arquivos dtx só podem ter linha vertical separando colunas pelo emprego de algum tipo de medida especial. Outra consequência é que atribuições de catcode feitas em macros geralmente não funcionam como esperado (see “Caracteres ativos em argumentos de comando”). Por exemplo, a definição

\def\mistake{%
\catcode`_=\active
\def_{\textunderscore\-}%
}
não funciona porque tenta definir um caractere _ comum: Quando a macro é usada, a alteração de categoria não se aplica ao caractere de ‘underline’ já na definição da macro. Em vez disso, pode-se usar:
\begingroup
\catcode`_=\active
\gdef\works{%    note the global \gdef
  \catcode`_=\active
  \def_{\textunderscore\-}%
}
\endgroup
A maneira alternativa (“esperta”) de criar uma definição tão isolada depende das curiosas propriedades do \lowercase, que altera caracteres sem alterar seus catcodes. Já que há sempre um caractere ativo (o“~”), podemos enganar o \lowercase para que ele remende uma definição sem alterar explicitamente um catcode:
\begingroup
  \lccode`\~=`\_
  \lowercase{\endgroup
    \def~{\textunderscore\-}%
  }%
As duas definições têm o mesmo efeito geral (o caractere é definido como um comando, mas o caractere não permanece ativo), exceto pelo fato de que o primeiro define um comando \global.

Para que caracteres ativos sejam usados apenas no modo de matemática, é muito melhor deixar o caractere com seu catcode normal, mas atribuir a ele um código de matemática, como em

\begingroup
  \lccode`~=`x
  \lowercase{\endgroup
    \def~{\times}%
  }%
\mathcode`x="8000
O caractere especial não precisa ser redefinido sempre que se tornar ativo — a definição do comando persiste mesmo se o catcode do caractere reverter a seu valor original; a definição se torna acessível novamente se o caractere se tornar novamente ativo.
doc.sty
Part of the LaTeX distribution latex
shortvrb.sty
Part of the LaTeX distribution latex


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