Que font \newenvironment et \renewenvironment ?#

La commande \newenvironment sert à définir un environnement tandis que \renewenvironment sert à redéfinir un environnement préexistant. Ces commandes sont assez semblables aux commandes \newcommand et \renewcommand de la question « À quoi servent les commandes \newcommand et \renewcommand ? » mais présentent un argument obligatoire supplémentaire, le code inséré à la fin de l’environnement.

1.  Syntaxe des commandes#

La syntaxe de \newenvironment et de \renewenvironment présente trois formes dépendant de la présence d’arguments et de la présence d’arguments optionnels. Ne sont données ici que celles de \newenvironment, celles de \renewenvironment étant identiques :

% Forme sans argument
\newenvironment{⟨nom⟩}{⟨déf_début⟩}{⟨déf_fin⟩}

% Forme avec arguments non optionnels
\newenvironment{⟨nom⟩}[⟨nb_args⟩]{⟨déf_début⟩}{⟨déf_fin⟩}

% Forme avec arguments, dont un, le premier, est optionnel
\newenvironment{⟨nom⟩}[⟨nb_args⟩][⟨défaut⟩]{⟨déf_début⟩}{⟨déf_fin⟩}

Les paramètres suivent les règles suivantes :

  • le ⟨nom⟩ de l’environnement ne commence pas par une contre-oblique, contrairement à ce qui se fait avec \newcommand ;

  • dans la forme avec arguments, le nombre ⟨nb_args⟩ est compris entre 1 et 9 et donne le nombre d’arguments. Ces éventuels arguments de l’environnement devront être fournis au moment du \begin{⟨nom⟩} dans des groupes d’accolades ;

  • ⟨défaut⟩ est à valeur par défaut du premier argument ;

  • ⟨déf_début⟩ est le code qui sera placé en début d’environnement. Ce code pourra contenir les arguments de l’environnement avec la notation # suivi du numéro de l’argument souhaité ;

  • ⟨déf_fin⟩ est le code placé en fin d’environnement. Ce code ne peut contenir les arguments d’environnement.

En voici un exemple d’utilisation (largement perfectible) :

\documentclass{article}
  \usepackage{lmodern} % Caractères plus lisibles
  \pagestyle{empty}    % N'affiche pas de numéro de page

  \newenvironment{tirade}[1]{%
    \\ \textsc{#1} : }%
    {(...)}

\begin{document}
Et voici un extrait d'une tirade célèbre de Molière :
\begin{tirade}{Harpagon}
Au voleur, au voleur, à l'assassin, au meurtrier. Justice
\end{tirade}
\end{document}

1.1.  La gestion des paramètres en fin d’environnement#

Les paramètres d’environnement ne sont pas transmis au code en fin d’environnement ⟨déf_fin⟩. Dès lors, le code suivant pose problème :

\newenvironment{tirade}[2][(...)]%
  {\\ \textsc{#2} : }%
  {#1}

Il se produit ici l’erreur suivante (détaillée à la question « Que signifie l’erreur : « Illegal parameter number in definition of ⟨commande⟩ » ? » :

! Illegal parameter number in definition of \endtirade.

Une solution à ce problème passe par l’utilisation d’une définition de commande placée dans l’argument ⟨déf_début⟩. Il faut noter que la commande définie à l’intérieur de l’environnement n’a de sens que dans celui-ci et est inconnue à l’extérieur de celui-ci. L’exemple suivant illustre cette méthode ainsi que le cas d’un argument facultatif.

\documentclass{article}
  \usepackage{lmodern} % Caractères plus lisibles
  \pagestyle{empty}    % N'affiche pas de numéro de page

  \newenvironment{tirade}[2][(...)]{%
    \newcommand{\fintirade}{#1}% Commande provisoire pour passer l'argument #1
    \\ \textsc{#2} : }%
    {\fintirade}

\begin{document}
Et voici un extrait d'une tirade célèbre de Molière :
\begin{tirade}{Harpagon}
Au voleur, au voleur, à l'assassin, au meurtrier. Justice
\end{tirade}

Et une seconde, tout aussi renommée :
\begin{tirade}[]{Géronte}
Mais que diable allait-il faire à cette galère ?
\end{tirade}
\end{document}