
Emesseresposta egreg usou as macros \DeclareTextSymbol
e \DeclareTextCommandDefault
onde \UndeclareTextCommand
eu já havia tentado anteriormente (e sem sucesso) um simples \newcommand
ou \let
.
Alguém poderia explicar o uso correto desses comandos e a diferença com o padrão, \newcommand
etc.?
Responder1
Alguns comandos são capazes de escolher sua ação com base na codificação de saída atual.
O exemplo mais simples é o dos acentos. Deseja-se que isso \"
se comporte de maneira diferente quando a codificação de saída (que é uma correspondência entre os glifos disponíveis e sua posição na fonte) for OT1 ou T1.
No primeiro caso, \"u
comporia a saída a partir de um acento e um caractere, com T1 irá compor diretamente um caractere pré-composto (esta diferença é muito importante quando se considera a hifenização).
Portanto, em vez de manter uma lista de comandos para alterar a definição ao alternar codificações, um comando pode ser definido com \DeclareTextSymbol
ou com funções semelhantes.
Vamos olhar para \textborn
. É indefinido no LaTeX base, mas textcomp
fornece uma definição dele:
% textcomp.sty, line 225
\DeclareTextCommandDefault{\textborn}{\tc@check@symbol2\textborn}
Não é importante saber o que o texto de substituição deve fazer, mas isso define \textborn
como
\?-cmd \textborn \?\textborn
(três tokens, o último é um único token cuja expansão é o texto de substituição acima \tc@check@symbol2\textborn
e pode ser acessado em doing \csname ?\string\textborn\endcsname
).
Mais tarde, quando ts1enc.def
for carregado, porque textcomp.sty
chama implicitamente \usepackage[TS1]{inputenc}
), o LaTeX encontrará
\DeclareTextSymbol{\textborn}{TS1}{98}
que fará um truque semelhante ao anterior, definindo \textborn
como
\TS1-cmd \textborn \TS1\textborn
(novamente três fichas). Esta é a parte mais importante. Como funciona um comando como esse?
Na expansão de \textborn
, se o LaTeX estiver em um local onde se espera que um caractere seja digitado, a codificação de saída atual será verificada em relação ao TS1. Se for, então apenas o glifo número 98 da fonte atual será usado; caso contrário, um grupo é aberto, a codificação muda para TS1, o caracter 98 é digitado e o grupo é fechado.
Tal comando é sempre robusto, o que significa que se for encontrado em argumentos móveis, ele produzirá a si mesmo em vez de se expandir quando operações de gravação estiverem envolvidas.
Isso deve explicar sua perplexidade ao fazer
\let\oldtextborn\textborn
antes de carregar kpfonts
e depois não ver nenhuma diferença entre a saída produzida por \textborn
e \oldtextborn
. O kpfonts
pacote não redefine \textborn
, mas associa uma nova fonte à codificação TS1 com base no nome da família de fontes escolhida. Então \oldtextborn
e \textborn
ainda são os mesmos.
Para definir \textborn
o uso da cmr
família é preciso ter cuidado, pois uma estratégia como
\let\oldtextborn\textborn
\renewcommand\textborn{{\fontfamily{cmr}\selectfont\oldtextborn}}
não é garantido que seja seguro. Por exemplo, se \textborn
aparecer em um argumento móvel, digamos, no título de uma seção ou em uma legenda, o .aux
arquivo conterá
\@writefile{toc}{\contentsline {section}{\numberline {1}{\fontfamily {cmr}\selectfont {\fontfamily {cmr}\selectfont \textborn }}}{1}}
onde o comando parece ser expandido algumas vezes. Em outras circunstâncias, isso pode até levar a loops infinitos.
Uma estratégia envolvendo \UndeclareTextCommand
é definitivamente mais segura.