--- myst: html_meta: keywords: LaTeX,programmation" --- # 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 : ```{noedit} \newcommand{\a2main}{À demain !} ``` En effet, contrairement à d'autres langages de programmation, TeX n'autorise que [des lettres dans les noms de commandes](/2_programmation/macros/que_sont_les_macros). 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`. ```{noedit} \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. :::{todo} *Traduction à poursuivre.* ::: 2. Define a "special-command generator", and use the resulting commands : ```{noedit} \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 : ```{noedit} \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 : ```text ! 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` : ```{noedit} \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 : ```text ! 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 [`\@` and @ in macro names](faquk:FAQ-atsigns) for more information. Note that analogous use of technique 3 in this example would give us ```{noedit} \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 : ```{noedit} \newcommand{\culVIIIr}{Goodbye!} ``` which rather spoils the intent of the joke implicit in the example `\cul8r`! :::{sources} [Non-letters in macro names](faquk:FAQ-linmacnames) :::