Les deux révisions précédentesRévision précédente | |
2_programmation:macros:cette_commande_est_elle_definie [2021/09/27 21:41] – Traduction et remaniement pour mettre les solutions modernes et fiables en premier bdumont | 2_programmation:macros:cette_commande_est_elle_definie [2022/10/10 15:29] (Version actuelle) – Usage de ⟨...⟩ dbitouze |
---|
| |
Quand on programme en <latex>\LaTeX{}</latex>, on peut directement utiliser | Quand on programme en <latex>\LaTeX{}</latex>, on peut directement utiliser |
''\@ifundefined{<//cmd name//>}{<//action1//>}{<//action2//>}'', | ''\@ifundefined{⟨//cmd name//⟩}{⟨//action1//⟩}{⟨//action2//⟩}'', |
qui exécute ''<//action1//>'' si la commande **n'**est **pas** définie, | qui exécute ''⟨//action1//⟩'' si la commande **n'**est **pas** définie, |
et ''<//action2//>'' dans le cas contraire | et ''⟨//action2//⟩'' dans le cas contraire |
(''<//cmd name//>'' est le nom de la commande tout nu, **sans son antislash** ''\''). | (''⟨//cmd name//⟩'' est le nom de la commande tout nu, **sans son antislash** ''\''). |
| |
Si vous utilisez une version de <latex>\LaTeX{}</latex> antérieure à 2018, il faut éviter de mélanger du code qui utilise les primitives d'ε-TeX avec du code qui utilise ''\@ifundefined'' (voir ci-dessous pourquoi). Comme cela peut se produire d'une extension à l'autre, vous n'êtes jamais à l'abri d'une erreur... | Si vous utilisez une version de <latex>\LaTeX{}</latex> antérieure à 2018, il faut éviter de mélanger du code qui utilise les primitives d'ε-TeX avec du code qui utilise ''\@ifundefined'' (voir ci-dessous pourquoi). Comme cela peut se produire d'une extension à l'autre, vous n'êtes jamais à l'abri d'une erreur... |
| |
On trouve dans d'anciennes macros écrites en <latex>\TeX{}</latex> le procédé suivant | On trouve dans d'anciennes macros écrites en <latex>\TeX{}</latex> le procédé suivant |
pour tester l'existence d'une commande ''<//commande//>'': | pour tester l'existence d'une commande ''⟨//commande//⟩'': |
| |
''\ifx\<//commande//>\undefined<//code à exécuter//>'' | ''\ifx\⟨//commande//⟩\undefined⟨//code à exécuter//⟩'' |
| |
(Ceci exécute le code si la commande **n'**existe **pas**, bien sûr.) | (Ceci exécute le code si la commande **n'**existe **pas**, bien sûr.) |
Elle utilisait la propriété suivante de ''\csname'' : | Elle utilisait la propriété suivante de ''\csname'' : |
si la commande n'existe pas, elle est créée comme alias de ''\relax''. | si la commande n'existe pas, elle est créée comme alias de ''\relax''. |
Cette approche présente deux inconvénients : | Cette approche présente deux inconvénients : |
| |
* Chaque utilisation de ''\@ifundefined'' avec un nom de commande qui n'existe pas crée cette commande, définie comme identique à ''\relax'' ; si cette commande n'est pas redéfinie ensuite, elle est conservée inutilement en mémoire par le moteur <latex>\TeX{}</latex> ; | * Chaque utilisation de ''\@ifundefined'' avec un nom de commande qui n'existe pas crée cette commande, définie comme identique à ''\relax'' ; si cette commande n'est pas redéfinie ensuite, elle est conservée inutilement en mémoire par le moteur <latex>\TeX{}</latex> ; |