| 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> ; |