\DeclareTextSymbol e \DeclareTextCommandDefault em contraste com o padrão \newcommand et al

\DeclareTextSymbol e \DeclareTextCommandDefault em contraste com o padrão \newcommand et al

Emesseresposta egreg usou as macros \DeclareTextSymbole \DeclareTextCommandDefaultonde \UndeclareTextCommandeu já havia tentado anteriormente (e sem sucesso) um simples \newcommandou \let.

Alguém poderia explicar o uso correto desses comandos e a diferença com o padrão, \newcommandetc.?

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, \"ucomporia 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 \DeclareTextSymbolou com funções semelhantes.

Vamos olhar para \textborn. É indefinido no LaTeX base, mas textcompfornece 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 \textborncomo

\?-cmd \textborn \?\textborn

(três tokens, o último é um único token cuja expansão é o texto de substituição acima \tc@check@symbol2\textborne pode ser acessado em doing \csname ?\string\textborn\endcsname).

Mais tarde, quando ts1enc.deffor carregado, porque textcomp.stychama implicitamente \usepackage[TS1]{inputenc}), o LaTeX encontrará

\DeclareTextSymbol{\textborn}{TS1}{98}

que fará um truque semelhante ao anterior, definindo \textborncomo

\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 kpfontse depois não ver nenhuma diferença entre a saída produzida por \textborne \oldtextborn. O kpfontspacote não redefine \textborn, mas associa uma nova fonte à codificação TS1 com base no nome da família de fontes escolhida. Então \oldtextborne \textbornainda são os mesmos.

Para definir \textborno uso da cmrfamí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 \textbornaparecer em um argumento móvel, digamos, no título de uma seção ou em uma legenda, o .auxarquivo 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.

informação relacionada