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):
Qualquer caractere poderia, em princípio, ser ativado dessa maneira e definido como uma macro:\catcode`\_=\active
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.\def_{\_}
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:
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 “\catcode`\z=\active \def z{Yawn, I'm tired}%
\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
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:\def\mistake{% \catcode`_=\active \def_{\textunderscore\-}% }
A maneira alternativa (“esperta”) de criar uma definição tão isolada depende das curiosas propriedades do\begingroup \catcode`_=\active \gdef\works{% note the global \gdef \catcode`_=\active \def_{\textunderscore\-}% } \endgroup
\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:
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\begingroup \lccode`\~=`\_ \lowercase{\endgroup \def~{\textunderscore\-}% }%
\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
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.\begingroup \lccode`~=`x \lowercase{\endgroup \def~{\times}% }% \mathcode`x="8000
This question on the Web: http://latex.net.br/faq/FAQ-activechars.html
Do you have any question? Ask on: latex.net.br - we love qood questions!