La TeXnique : Des commandes qui créent des commandes ?

Plutôt que de dupliquer du code

Bonsoir les gens,

Aujourd’hui (ou hier suivant quand je publie ce billet), le problème suivant est apparu devant mon paillasson. Sûrement déposé par une cigogne…

On voulait un rendu de la sorte pour une discussion.

PersoA 1 : Je dis ça.
PersoB 1 : Je réponds ça.
PersoB 2 : Et je dis aussi ça.
PersoB 3 : Et aussi ça !
PersoA 2 : Laisse-moi parler un peu.
PersoC 1 : Moi aussi je veux parler !

En gros, on a une discussion entre plusieurs personnes PersoA, PersoB et PersoC et on numérote chacune de leurs interventions.

On crée trois compteurs et on crée trois commandes \persoa, \persob et \persoc.

\newcounter{persoa}
\newcounter{persob}
\newcounter{persoc}

\newcommand{\persoa}[1]{
  \stepcounter{persoa}
  \textbf{PersoA \thepersoa :} #1 \ar
}

\newcommand{\persob}[1]{
  \stepcounter{persob}
  \textbf{PersoB \thepersob :} #1 \par
}

\newcommand{\persoc}[1]{
  \stepcounter{persoc}
  \textbf{PersoC \thepersoc :} #1 \par
}

\begin{document}
   \persoa{Je dis ça.}
   \persob{Je réponds ça.}  
   \persob{Et je dis aussi ça.} 
   \persob{Et aussi ça !}   
   \persoa{Laisse-moi parler un peu.} 
   \persoc{Moi aussi je veux parler !}
\end{document}

Et ça y est, le problème est résolu. Mais il reste quelques petits problèmes.

  • Il se passe quoi si on a une discussion avec dix personnages, on répète dix fois le même code !
  • Quand on répète le code des commandes \perso<>, il faut faire attention à bien avoir le même code, et si on veut modifier le formatage, il faudra le modifier partout !

Pour régler ces deux soucis, une solution est de créer une commande (appelons-la \personnage) qui crée le compteur et crée la commande associée. C’est ce que nous allons faire ici.

\newcommand{\personnage}[2]{
   \newcounter{perso#1}
   \expandafter\newcommand\csname#1\endcsname[1]{
      \stepcounter{perso#1}
      \textbf{#2 \arabic{perso#1} :} ##1 \par
   }
}

Notre commande prend deux paramètres, le premier est le nom qu’on veut pour la commande qu’il crée, et le second est le nom qu’il faut afficher. Notre préambule devient alors plus simple.

\personnage{persoa}{PersoA}
\personnage{persob}{PersoB}
\personnage{persoc}{PersoC}

On peut disserter sur l’usage de \par, se demander si un environnement ne serait pas une meilleure idée et se poser plein d’autres questions. Mais ce n’est pas le sujet. Je voulais juste montrer la création d’une commande qui crée des commandes.

PS : en fait, c’est bien hier et pas aujourd’hui… Quoique, suivant votre fuseau horaire, on n’est pas encore demain.



1 commentaire

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte