---
myst:
html_meta:
keywords: LaTeX,programmation,syntaxe de LaTeX,définition de macros,caractères actifs"
---
# Active characters in command arguments
Occasionally, it's nice to make one or two characters active in the argument of a command, to make it easier for authors to code the arguments.
Active characters *can* be used safely in such situations; but care is needed.
An example arose while this answer was being considered : an aspirant macro writer posted to `comp.text.tex` asking for help to make `#` and `b` produce musical sharp and flat signs, respectively, in a macro for specifying chords.
The first problem is that both `#` and `b` have rather important uses elsewhere in TeX (to say the least!), so that the characters can only be made active while the command is executing.
Using the techniques discussed in « Active characters in command arguments », we can define :
```{noedit}
\begingroup
\catcode`\#=\active
\gdef#{$\sharp$}
\endgroup
```
and :
```{noedit}
\begingroup
\lccode''\~=''\b
\lowercase{\endgroup
\def~{$\flat$}%
}
```
The second problem is one of timing : the command has to make each character active *before* its arguments are read : this means that the command can't actually "have arguments itself, but must be split in two. So we write :
```{noedit}
\def\chord{%
\begingroup
\catcode`\#=\active
\catcode`\b=\active
\Xchord
}
\def\Xchord#1{%
\chordfont#1%
\endgroup
}
```
and we can use the command as `\chord{F#}` or `\chord{Bb minor}`.
Two features of the coding are important :
- `\begingroup` in `\chord` opens a group that is closed by `\endgroup` in `\Xchord`; this group limits the change of category codes, which is the *raison d'être* of the whole exercise.
- Although `#` is active while `\Xchord` is executed, it's *not* active when it's being defined, so that the use of `#1` doesn't require any special attention.
Note that the technique used in such macros as `\chord`, here, is analogous to that used in such commands as `\verb`; and, in just the same way as `\verb` (see « [](/3_composition/texte/paragraphes/pourquoi_verbatim_ne_fonctionne_pas_toujours) »), `\chord` won't work inside the argument of another command (the error messages, if they appear at all, will probably be rather odd).
:::{sources}
[Active characters in command arguments](faquk:FAQ-actinarg)
:::