====== Comment mettre des caractères autres que des lettres dans les noms de commande ? ====== Les utilisateurs débutants avec \LaTeX sont souvent étonnés de voir que des commandes contenant des caractères autres que des lettres ne fonctionnent pas. Par exemple : \newcommand{\a2main}{À demain !} En effet, contrairement à d'autres langages de programmation, \TeX n'autorise que [[2_programmation:macros:que_sont_les_macros|des lettres dans les noms de commandes]]. Il existe cependant des techniques pour contourner cette limitation mais elles ne sont pas sans défaut. ===== Utilisation de “\csname” et “\endcsname” ===== Voici un exemple de la méthode utilisant les commandes ''\csname'' et ''\endcsname''. \expandafter\newcommand\csname a2main\endcsname{À demain !} Je vous dis « \csname a2main\endcsname ». Cette technique a l'unique désavantage de demander d'être bien trop verbeuse. FIXME //Traduction à poursuivre.// 2. Define a "special-command generator", and use the resulting commands: \newcommand{\DefineRemark}[2]{% \expandafter\newcommand\csname rmk-#1\endcsname{#2}% } \newcommand{\Remark}[1]{\csname rmk-#1\endcsname} ... \DefineRemark{cul8r}{Goodbye!} ... \Remark{cul8r} * **Pro:** Straightforward to use, not too untidy * **Con:** It's hardly doing what we set out to do (experts will see that you are defining a macro, but others likely won't) 3. Convince TeX that ''8'' is a letter: \catcode`8 = 11 \newcommand{\cul8r}{Goodbye!} I said, ``\cul8r''. * **Pro:** ''\cul8r'' can be used directly * **Con:** Likely to break other uses of ''8'' (such as numbers or dimensions; so ''\setlength{''\paperwidth''}{8in}'' tells us: ! Missing number, treated as zero. 8 As a general rule, changing category codes is something to use //in extremis//, after detailed examination of options. It is conceivable that such drastic action could be useful for you, but most ordinary users are well advised not even to try such a technique. 4. Define a macro ''\cul'' which must always be followed by ''8r'': \def\cul8r{Goodbye!} I said, ``\cul8r''. * **Pro:** ''\cul8r'' can be used directly * **Con #1:** Breaks if ''\cul'' is followed by anything other than ''8r'', with a confusing diagnostic, as ''\cul99'' produces: ! Use of \cul doesn't match its definition. <*> \cul9 9 (which would confuse someone who hadn't even realised there //was// a definition of ''\cul'' in the document). * **Con #2:** Silently redefines existing ''\cul'', if any; as a result, the technique cannot be used to define both a ''\cul8r'' and, say, a ''\cul123'' macro in the same document. Technique 3 is in fact commonly used --- in a limited form --- within most LaTeX packages and within LaTeX itself. The convention is to use ''@'' within the names of internal macros to hide them from the user and thereby prevent naming conflicts. To this end, LaTeX automatically treats ''@'' as a letter while processing classes and packages and as a non-letter while processing the user's document. The key to this technique is the separation: internally a non-letter is used for macro names, and the user doesn't see anything of it, while the status remains "frozen" in all the definitions created within the class or package. See [[FAQ-atsigns|\@ and @ in macro names]] for more information. Note that analogous use of technique 3 in this example would give us \begingroup \catcode`8 = 11 \gdef\cul8r{Goodbye!} \gdef\later{\cul8r} \endgroup I said, ``\later''. which works, but rather defeats the object of the exercise. (''\later'' has the "frozen" catcode for "8", even though the value has reverted to normal by the time it's used; note, also, the use of the primitive command ''\gdef'', since ''\newcommand'' can't make a macro that's available outside the group.) //Recommendation//: Either choose another mechanism (such as ''\DefineRemark'' above), or choose another name for your macro, one that contains only ordinary letters. A common approach is to use roman numerals in place of arabic ones: \newcommand{\culVIIIr}{Goodbye!} which rather spoils the intent of the joke implicit in the example ''\cul8r''! ----- //Source:// [[faquk>FAQ-linmacnames|Non-letters in macro names]] {{htmlmetatags>metatag-keywords=(LaTeX,programmation) metatag-og:title=(Comment mettre des caractères autres que des lettres dans les noms de commande) metatag-og:site_name=(FAQ LaTeX francophone) }}