Comment traduire des commandes LaTeX en commandes TeX ?#
À plusieurs endroits de cette FAQ sont données des réponses intégrant des définitions de commandes LaTeX. Parfois, ces commandes peuvent également aider les utilisateurs de Plain TeX ou d’autres formats. Cette page tente de fournir un guide approximatif pour transcrire ces définitions de commandes dans d’autres formats.
LaTeX propose des commandes qui remplacent \def
du fait de sa philosophie générale : l’utilisateur doit être protégé de lui-même. Ainsi, l’utilisateur dispose des commandes suivantes :
deux commandes différentes selon que la commande à définir existe (
\renewcommand
) ou pas (\newcommand
). Si l’état de la commande s’avère différent de celui attendu par l’utilisateur, une erreur est signalée ;la commande
\providecommand
définit uniquement une commande si la cible n’est pas déjà définie ;la commande
\DeclareRobustCommand
crée une commande qui est « robuste » (c’est-à-dire qui ne se développera pas si elle est soumise à un « développement protégé par LaTeX). Pour un utilisateur de Plain TeX,\DeclareRobustCommand
doit être traitée comme une version non vérifiable de\newcommand
.
Ainsi, LaTeX n’a pas d’équivalent direct de \def
, qui ignore l’état actuel de la commande.
Les commandes LaTeX sont, par défaut, définies avec la structure \long
; un « *
» optionnel entre \newcommand
et ses arguments spécifie que la commande n’utilise pas la structure \long
. Le « *
» est ainsi détecté par une commande \ifstar
qui utilise \futurelet
pour basculer entre deux branches et qui absorbe le « *
» : les utilisateurs de LaTeX sont encouragés à considérer le « *
» comme une part du nom de la commande.
Les arguments d’une commande LaTeX sont spécifiés par deux arguments optionnels : un nombre d’arguments (de 0 à 9 et, si le nombre est 0, l’argument optionnel peut être omis) et une valeur par défaut pour le premier argument si celui-ci peut être facultatif. Par exemple :
\newcommand\truc{...}
\newcommand\truc[0]{...}
\newcommand\truc[1]{...#1...}
\newcommand\truc[2][machin]{...#1...#2...}
Dans le dernier cas, \truc
peut être appelé sous la forme \truc{blabla}
qui équivaut à \truc[machin]{blabla}
(en utilisant la valeur par défaut donnée pour le premier argument) ou sous la forme \foo[chose]{blabla}
(avec un premier argument explicite).
La manière de coder des commandes avec des arguments optionnels est illustrée ici pour notre exemple \truc
:
\def\truc{\futurelet\next\@r@truc}
\def\@r@truc{\ifx\next[%
\let\next\@x@truc
\else
\def\next{\@x@truc[machin]}%
\fi
\next
}
\def\@x@truc[#1]#2{...#1...#2...}