Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Dernière révision Les deux révisions suivantes
2_programmation:macros:cette_commande_est_elle_definie [2018/05/30 23:31]
d.p.carlisle
2_programmation:macros:cette_commande_est_elle_definie [2021/01/07 19:23]
jejust Traduction partielle en français.
Ligne 1: Ligne 1:
---- +====== Comment tester si une commande est définie ​======
-title: Is this command defined? +
-category: programming +
-tags: macros +
-permalink: /​FAQ-isdef +
-date: 2014-06-10 +
----+
  
-# Is this command defined?+===== Méthodes traditionnelles =====
  
-Macro sets from the earliest days of TeX programming may be +==== En TeX ====
-observed to test whether commands exist by using +
-`\ifx\<​command>​\undefined` &​lsaquo;​_stuff_&​rsaquo;​ &​hellip;​ +
-(which of course actually tests that the command _doesn'​t_ +
-exist). ​ LaTeX programmers can make use of the internal command +
-  `\@ifundefined{cmd name}{action1}{action2}` +
-which executes `action1` if the command is undefined, and +
-`action2` if it is defined +
-(_cmd name_ is the command name only, omitting the `\` character).+
  
-The `\@ifundefined` command is based on the sequence +Voici ce qu'on trouve dans les anciennes macros écrites en <​latex>​\TeX{}</​latex>​ 
-```latex+pour tester l'​existence d'une commande ''<//​commande//>'':​ 
 + 
 +''​\ifx\<//​commande//>​\undefined<//​code à exécuter//>''​ 
 + 
 +(ceci exécute le code si la commande **n'​**existe **pas**, bien sûr). 
 + 
 + 
 +==== En LaTeX ==== 
 + 
 +Quand on programme en <​latex>​\LaTeX{}</​latex>,​ on peut directement utiliser 
 +''​\@ifundefined{<//cmd name//>​}{<//​action1//>​}{<//​action2//>​}'',​ 
 +qui exécute ''<//​action1//>''​ si la commande **n'​**est **pas** définie, 
 +et ''<//​action2//>''​ dans le cas contraire 
 +(''<//​cmd name//>''​ est le nom de la commande tout nu, **sans son antislash** ''​\''​). 
 + 
 +La macro ''​\@ifundefined''​ utilise ce mécanisme:​ 
 + 
 +<​code ​latex>
 \expandafter \ifx \csname cmd name\endcsname \relax \expandafter \ifx \csname cmd name\endcsname \relax
-``` +</​code>​ 
-which relies on the way `\csname` works: if the command doesn't +qui repose sur le fonctionnement de ''​\csname'​': 
-existit simply creates it as an alias for `\relax`.+si la commande n'​existe pasil la crée comme alias de ''​\relax''​. 
  
-So: what is wrong with these techniques?+===== Qu'​est-ce qui ne va pas avec ces méthodes ​=====
  
-Using `\undefinedblithely assumes that the command is indeed not+Using ''​\undefined'' ​blithely assumes that the command is indeed not
 defined. ​ This isn't entirely safe; one could make the name more defined. ​ This isn't entirely safe; one could make the name more
 improbable, but that may simply make it more difficult to spot a improbable, but that may simply make it more difficult to spot a
 problem when things go wrong. ​ LaTeX programmers who use the problem when things go wrong. ​ LaTeX programmers who use the
-technique will typically employ ​`\@undefined`, adding a single+technique will typically employ ​''​\@undefined''​, adding a single
 level of obscurity. level of obscurity.
  
-The `\@ifundefinedmechanism ​has the unfortunate property of+The original ''​\@ifundefined'' ​mechanism ​had the unfortunate property of
 polluting the name space: each test that turns out undefined adds a polluting the name space: each test that turns out undefined adds a
-name to the set TeX is holding, and often all those `\relax` +name to the set TeX is holding, and often all those ''​\relax''​ 
-names serve no purpose whatever.  Even so (sadly) there are places in +names serve no purpose whatever. ​
-the code of LaTeX where the existence of the `\relax` is relied +
-upon, after the test, so we can't get away from `\@ifundefined` +
-altogether.+
  
-David Kastrup offers the (rather tricky) +David Kastrup offers the (rather tricky): 
-```latex+ 
 +<​code ​latex>
 {\expandafter}\expandafter\ifx \csname cmd name\endcsname\relax ... {\expandafter}\expandafter\ifx \csname cmd name\endcsname\relax ...
-``` +</​code>​ 
-which ''​creates'' ​the `\relax`-command inside the group of the first +which "creates" the ''​\relax''​-command inside the group of the first 
-`\expandafter`, therefore forgets it again once the test is done.+''​\expandafter''​, therefore forgets it again once the test is done.
 The test is about as good as you can do with macros. The test is about as good as you can do with macros.
  
-The [&​epsilon;​-TeX system](/​FAQ-etex) ​system comes to our help here: it+The [[FAQ-etex|ε-TeX system]system comes to our help here: it
 defines two new primitives: defines two new primitives:
-  ​ 
  
--  `\ifdefined`, which tests whether a thing is defined (the +  * ''​\ifdefined''​, which tests whether a thing is defined (the negative of comparing with ''​\undefined''​, as it were), and 
-    ​negative of comparing with `\undefined`, as it were), and +  ​* ''​\ifcsname cmd name\endcsname''​, which does the negative of ''​\@ifundefined'' ​without the ''​\relax''​-command side-effect.
- `\ifcsname` `cmd name``\endcsname`, which does the +
-    ​negative of `\@ifundefinedwithout the `\relax`-command +
-    ​side-effect.+
  
-So, in an &​epsilon;​-TeX-based system, the following two conditional clauses do+So, in an ε-<​latex>​\TeX{}</​latex>​-based system, the following two conditional clauses do
 the same thing: the same thing:
-```latex+ 
 +<​code ​latex>
 \ifdefined\foo \ifdefined\foo
   \message{\string\foo\space is defined}%   \message{\string\foo\space is defined}%
Ligne 75: Ligne 74:
   \message{no command \string\foo}%   \message{no command \string\foo}%
 \fi \fi
-``` +</​code>​ 
-However, after using the LaTeX +However, after using the original ​LaTeX ''​\@ifundefined{foo}...''​, 
-`\@ifundefined{foo}`&​hellip;​, the conditionals will detect the +the conditionals will detect the command as "existing
-command as ''​existing'' ​(since it has been `\letto `\relax`); +(since it has been ''​\let'' ​to ''​\relax''​) ; so it is important 
-so it is important not to mix mechanisms for detecting the state of a +not to mix mechanisms for detecting the state of a command. 
-command.+ 
 +In the 2018 <​latex>​\LaTeX{}</​latex>​ release, the definition of ''​\@ifundefined''​ was adapted 
 +to use the $\epsilon$-TeX ''​\ifcsname''​ and now tests for a command ​being undefined or ''​\relax''​ 
 +without the side effect of defining undefined commands to ''​\relax''​.
  
-Since most distributions nowadays use &​epsilon;​-TeX as their base executable +----- 
-for most packages, these two primitives may be expected appear widely +//Source:// [[faquk>​FAQ-isdef|Is this command defined?]]
-in new macro packages.+
  
 +{{htmlmetatags>​metatag-keywords=(LaTeX,​programmation LaTeX,​tester si une macro est définie,​savoir si une commande est définie)
 +metatag-og:​title=(Is this command defined?)
 +metatag-og:​site_name=(FAQ LaTeX francophone)
 +}}
  
2_programmation/macros/cette_commande_est_elle_definie.txt · Dernière modification: 2021/09/27 23:41 par bdumont
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0