Comment changer un caractère en commande ?#

1.  Avec les commandes de base#

Un caractère isolé peut jouer le rôle de commande. De fait, Plain et définissent tous deux le caractère ~ comme un espace insécable. Un caractère est rendu définissable, ou « actif », en passant son code de catégorie, ou catcode, à \active (valeur 13) :

\catcode`\_=\active

Tout caractère peut, en principe, être activé de cette manière et défini comme une commande :

\def_{\_}

Ce dernier cas pourrait d’ailleurs être considéré comme une réponse un peu trop simple à la question « Comment obtenir les différents tirets ? ».

Il faut cependant se méfier :

  • si ~ est réputé actif, d’autres caractères peuvent être assez inattendus dans ce rôle et interagir mal avec d’autres commandes ;

  • en définissant un caractère actif, vous empêchez son utilisation à d’autres fins.

Au final, peu de caractères sont donc susceptibles d’être disponible pour cela. S’il vous

Pour définir le caractère z en tant que commande, il faudrait indiquer quelque chose comme :

\catcode`\z=\active
\def z{... chut, je dors...}%

Chaque z suivant dans le texte serait remplacé par un court texte. Ce serait une très mauvaise idée pour la plupart des documents, mais il pourrait y avoir des applications spéciales. Notez que, dans \def z, z n’est plus interprété comme une lettre et l’espace n’est donc pas nécessaire : \defz aurait donc fait l’affaire mais nous avons choisi ici de conserver l’espace pour le peu de clarté que cela apporte. Certaines extensions facilitent de telles définitions, comme shortvrb avec sa commande \MakeShortVerb.

utilise les catcodes pour interpréter les caractères qu’il reçoit. La modification de la valeur d’un catcode n’affecte pas les caractères qui ont déjà été lus.

Par conséquent, il est préférable que les caractères aient des catcodes fixes pour tout un document. Si les catcodes sont modifiés à des fins particulières (c’est ce que fait la commande \verb), les caractères modifiés ne seront pas interprétés correctement à la suite lorsqu’ils apparaîtront dans l’argument d’une autre commande (comme, par exemple, le montre la question « Pourquoi le mode verbatim ne marche pas toujours ? »). Un exemple notable est celui de l’extension doc qui traite les fichiers de source documentée (ou fichiers .dtx) en utilisant l’extension shortvrb pour définir || comme un raccourci pour \verb||. Mais | est également utilisé dans les préambules des environnements de table, de sorte que les tableaux dans les fichiers .dtx ne peuvent avoir une séparation verticale entre les colonnes qu’en employant des mesures spéciales.

Une autre conséquence est que les assignations de catcode faites dans les commandes ne fonctionnent souvent pas comme prévu (voir la question « Comment obtenir des caractères actifs dans des arguments de commande ? »). Ce sera le cas pour la définition suivante :

\def\faute{%
\catcode`_=\active
\def_{\textunderscore\-}%
}

2.  Quelques variantes#

2.1.  Une définition globale#

La commande \faute données ci-dessus ne fonctionne pas car elle tente de définir un caractère ordinaire _  : lorsque la commande est utilisée, le changement de catégorie ne s’applique pas au caractère de soulignement déjà présent dans la définition de la commande. Au lieu de cela, on peut utiliser :

\begingroup
\catcode`_=\active
\gdef\correcte{%    notez la \gdef globale
  \catcode`_=\active
  \def_{\textunderscore\-}%
}
\endgroup

2.2.  Une définition avec \lowercase#

Une façon « astucieuse » de créer une telle définition isolée dépend des propriétés curieuses de \lowercase : elle change les caractères sans modifier leurs catcodes. Puisqu’il existe toujours un caractère actif (~), nous pouvons tromper \lowercase en lui faisant modifier une définition sans jamais changer explicitement de catcode :

\begingroup
  \lccode''\~=''\_
  \lowercase{\endgroup
    \def~{\textunderscore\-}%
  }%

Les deux définitions précédentes ont le même effet général (le caractère est défini comme une commande, mais le caractère ne reste pas actif), à ceci près que la première définit une commande de type \global.

2.3.  Une définition avec les mathématiques#

Pour les caractères actifs qui ne sont utilisés qu’en mode mathématique, il est préférable de laisser au caractère son catcode ordinaire, mais de lui attribuer un code mathématique actif spécial, comme dans la définition suivante :

\begingroup
  \lccode''~=''x
  \lowercase{\endgroup
    \def~{\times}%
  }%
\mathcode`x=8000

Le caractère spécial ne nécessite pas d’être redéfini chaque fois qu’il est rendu actif — la définition de la commande persiste même si le catcode du caractère revient à sa valeur d’origine ; la définition redevient accessible si le caractère redevient actif.