[eqnarray] Supprimer tout espace vertical (avant et après)

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

[eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar MB » Dimanche 14 Décembre 2008, 14:01

Bonjour, l'objectif est d'obtenir un environnement eqnarray* pour lequel il n'y aurait aucun espacement vertical (ni au dessus, ni en dessous). Il semblerait que la modification des longueurs suivantes ne suffisent pas (de plus c'est pour une modification locale) :

Code: Tout sélectionner
\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}


Des idées ?
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6885
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar pg » Dimanche 14 Décembre 2008, 18:41

Ça a pourtant l'air de fonctionner si on compare à une formule toute seule sur une ligne.

eqnarray.png
eqnarray.png (5.76 Kio) Vu 4760 fois


Code: Tout sélectionner
\documentclass{article}

\begin{document}
\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
\begin{eqnarray*}
A=B
\end{eqnarray*}
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla

$A=B$

\noindent bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
\end{document}
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar MB » Dimanche 14 Décembre 2008, 19:00

Oui, en effet, ça fonctionne à peu près. Mais sur l'exemple que j'avais utilisé, il semblait rester quelques espacements (en bas). Voici ce que ça donnait :

eqnarray_space.png


Le code utilisé :

Code: Tout sélectionner
\documentclass[a4paper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[frenchb]{babel}
\usepackage{mathtools}
\setlength{\parindent}{0mm}

\begin{document}

\hrulefill
\begin{eqnarray*}
A & = & (2-4) \times (-5+7)-(-6+4 \times 2) \times \big( 2-2 \times (3-1) \big) -(-2) \times (5-2) \\
  & = & -2 \times 2 - (-6+8) \times (2-2 \times 2) - (-2) \times 3 \\
  & = & -4 - 2 \times (2-4) - (-6) \\
  & = & -4 - 2 \times (-2) + 6 \\
  & = & -4 +4 +6 \\
A & = & \mathbf{6}
\end{eqnarray*}
\hrulefill

\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}

\hrulefill
\begin{eqnarray*}
A & = & (2-4) \times (-5+7)-(-6+4 \times 2) \times \big( 2-2 \times (3-1) \big) -(-2) \times (5-2) \\
  & = & -2 \times 2 - (-6+8) \times (2-2 \times 2) - (-2) \times 3 \\
  & = & -4 - 2 \times (2-4) - (-6) \\
  & = & -4 - 2 \times (-2) + 6 \\
  & = & -4 +4 +6 \\
A & = & \mathbf{6}
\end{eqnarray*}
\hrulefill

\end{document}


Enfin bon, c'est pas trop mal, mais j'aurais aimé que les espacements soient identiques en haut et en bas (j'y pense en écrivant là, j'espère que c'est pas à cause du \hrulefill qu'on a cette impression). En tout cas, quelle serait la façon la plus simple de rendre ces modifications locales ? (par exemple pour redéfinir un environnement eqnarray sans espacements)
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6885
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar EricK » Dimanche 14 Décembre 2008, 19:10

Et il y a le même problème avec un align ou un split ? (parce que lorsqu'on utilise les package ams, on évite eqnarray).
EricK
Téra-utilisateur
 
Messages: 1483
Inscription: Jeudi 02 Novembre 2006, 22:38
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar MB » Dimanche 14 Décembre 2008, 19:17

EricK a écrit:(parce que lorsqu'on utilise les package ams, on évite eqnarray).


Ah bon ? (pourquoi ça ?)

Sinon, je crois bien que c'est à cause du \hrulefill qu'on observe cette différence d'espacement sur mon exemple. Donc à priori, les commandes fonctionnent bien.
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6885
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar pg » Dimanche 14 Décembre 2008, 19:24

Le problème vient du \hrulefill. Il vaut mieux utiliser un \rule (qu'on doit réhausser en bas pour qu'il apparaisse à la bonne hauteur). Comme l'a fait remarqué EricK, l'espacement autour du signe = n'est pas correct avec eqnarray, mais ça peut s'arranger avec un \arraycolsep=1.4pt si tu as vraiment besoin de eqnarray.

Au final, ceci semble donner un résultat correct :

Code: Tout sélectionner
\documentclass[a4paper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[frenchb]{babel}
\usepackage{mathtools}

\newenvironment{ruledeqnarray*}%
   {\setlength{\abovedisplayshortskip}{0pt}%
    \setlength{\belowdisplayshortskip}{0pt}%
    \setlength{\abovedisplayskip}{0pt}%
    \setlength{\belowdisplayskip}{0pt}%
    \noindent\rule[0pt]{\textwidth}{0.4pt}%
    \arraycolsep=1.4pt
    \begin{eqnarray*}}%
   {\end{eqnarray*}%
    \rule[6pt]{\textwidth}{0.4pt}}

\begin{document}

Bla bla bla bla bla bla bla bla bla bla bla bla

\begin{ruledeqnarray*}
A & = & (2-4) \times (-5+7)-(-6+4 \times 2) \times \big( 2-2 \times (3-1) \big) -(-2) \times (5-2) \\
  & = & -2 \times 2 - (-6+8) \times (2-2 \times 2) - (-2) \times 3 \\
  & = & -4 - 2 \times (2-4) - (-6) \\
  & = & -4 - 2 \times (-2) + 6 \\
  & = & -4 +4 +6 \\
A & = & \mathbf{6}
\end{ruledeqnarray*}
bla bla bla bla bla bla bla bla bla bla bla

\end{document}
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar kojak » Dimanche 14 Décembre 2008, 19:35

bonjour,

Il me semblait que cet environnement eqnarray était désuet, non.
pas d'aide par MP
kojak
Modérateur
 
Messages: 10397
Inscription: Samedi 18 Novembre 2006, 19:50
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar pg » Dimanche 14 Décembre 2008, 19:41

Un bon document qui liste tout ce qui ne va pas avec eqnarray est Avoid eqnarray!.
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar kojak » Dimanche 14 Décembre 2008, 19:45

Oui et tu as ça qui renvoie à ça où il est dit qu'il faut le remplacer par l'environnement align :wink:
pas d'aide par MP
kojak
Modérateur
 
Messages: 10397
Inscription: Samedi 18 Novembre 2006, 19:50
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar EricK » Dimanche 14 Décembre 2008, 19:58

ou encore un split à l'intérieur d'un environnement equation si tu veux un seul numéro d'équation pour l'ensemble des lignes et que celui-ci soit centré en hauteur.
EricK
Téra-utilisateur
 
Messages: 1483
Inscription: Jeudi 02 Novembre 2006, 22:38
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar MB » Dimanche 14 Décembre 2008, 20:33

Merci, je n'utilise que rarement eqnarray à vrai dire, et le coup du signe égal trop espacé, je ne trouvais pas ça laid. Mais bon je vais privilégier align à l'avenir. Par contre, j'ai directement un problème pour faire un nouvel environnement sans espacements verticaux avec align. En effet, le code suivant ne fonctionne pas :

Code: Tout sélectionner
\newcommand{\nodisplayskip}{\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}}
\newenvironment{nodisplayskipalign*}{\nodisplayskip \begin{align*}}{\end{align*}}


Par contre, ce code fonctionne, mais on ne peut plus se débarrasser de la numérotation automatique :

Code: Tout sélectionner
\newcommand{\nodisplayskip}{\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}}
\newenvironment{nodisplayskipalign*}{\nodisplayskip \align}{\endalign}


Pour l'instant j'ai pas trouvé de solution (à part rester avec eqnarray)...
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6885
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar pg » Dimanche 14 Décembre 2008, 20:55

Il faut aller voir dans amsmath.sty comment est définit align* puis l'adapter :

Code: Tout sélectionner
\newcommand{\nodisplayskip}{\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}}
\makeatletter
\newenvironment{nodisplayskipalign*}{\nodisplayskip\start@align\@ne\st@rredtrue\m@ne}{\endalign}
\makeatother
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar MB » Dimanche 14 Décembre 2008, 21:25

Ok, merci pg.
Je continue cependant, car je rencontre à nouveau un problème lorsque je souhaite intégrer ceci dans une minipage, puis dans un tabular (à priori c'est le tabular qui pose problème). Voici le code utilisé pour le test :

Code: Tout sélectionner
\documentclass[a4paper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[frenchb]{babel}
\usepackage{mathtools}
%
\newcommand{\nodisplayskip}{\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}}
\makeatletter
\newenvironment{nodisplayskipalign*}{\nodisplayskip\start@align\@ne\st@rredtrue\m@ne}{\endalign}
\makeatother
\newcommand{\test}[2]{\begin{minipage}[t]{#1\linewidth} \begin{nodisplayskipalign*} #2 \end{nodisplayskipalign*} \end{minipage}}
%
\setlength{\parindent}{0mm}
\begin{document}

\begin{center}
\begin{tabular}{c|c}
\test{0.45}{
3 \div 0,25 & = 3 \times 0,25^{-1} \\
 & = 3 \times 4 \\
 & = \mathbf{12}} &
\test{0.45}{
3 \div 0,25 & = 3 \times 0,25^{-1} \\
 & = 3 \times 4 \\
 & = \mathbf{12}} \\
\end{tabular}
\end{center}

\end{document}


L'erreur produite est la suivante :

Argument of \nodisplayskipalign* has an extra }.
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6885
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar pg » Dimanche 14 Décembre 2008, 21:46

Align ne semble pas fonctionner dans un tabular à cause des &. Un multicolumn à la place de tabular ne permet pas de faire ce que tu veux ?

Sinon, on peut contourner le problème en mettant tout dans des sbox :

Code: Tout sélectionner
\documentclass[a4paper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[frenchb]{babel}
\usepackage{mathtools}
%
\newcommand{\nodisplayskip}{\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}}
\makeatletter
\newenvironment{nodisplayskipalign*}{\nodisplayskip\start@align\@ne\st@rredtrue\m@ne}{\endalign}
\makeatother
\newsavebox\testsavebox
\newcommand{\test}[2]{\sbox{\testsavebox}{\begin{minipage}[t]{#1\linewidth}\noindent\begin{nodisplayskipalign*} #2 \end{nodisplayskipalign*}\end{minipage}}\usebox{\testsavebox}}
%
\setlength{\parindent}{0mm}
\begin{document}

\begin{center}
\begin{tabular}{c|c}
\test{0.45}{
3 \div 0,25 & = 3 \times 0,25^{-1} \\
& = 3 \times 4 \\
& = \mathbf{12}} &
\test{0.45}{
3 \div 0,25 & = 3 \times 0,25^{-1} \\
& = 3 \times 4 \\
& = \mathbf{12}} \\
\end{tabular}
\end{center}

\end{document}
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar MB » Dimanche 14 Décembre 2008, 22:21

pg a écrit:Align ne semble pas fonctionner dans un tabular à cause des &.


Oui, il semblerait.

pg a écrit:Un multicolumn à la place de tabular ne permet pas de faire ce que tu veux ?


Si, ça devrait être possible, mais j'avais eu des problèmes avec multicolumn (voir ce sujet). Je pense que je vais retenter pour voir, sinon je garde la version avec tabular et la savebox.
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6885
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar pg » Dimanche 14 Décembre 2008, 22:54

MB a écrit:Si, ça devrait être possible, mais j'avais eu des problèmes avec multicolumn (voir ce sujet).

C'est pour tout faire en double sur les deux colonnes ? Dans ce cas, enlever le \columnbreak ou en rajouter un à la fin de la deuxième colonne devrait toujours fonctionner pour régler le problème, non ?
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: [eqnarray] Supprimer tout espace vertical (avant et après)

Messagepar MB » Dimanche 14 Décembre 2008, 23:16

pg a écrit:C'est pour tout faire en double sur les deux colonnes ?


Non, pas forcément. C'est pour ça aussi que les minipages dans un tabular peuvent être pratiques pour gérer la dimensions des deux colonnes. C'est pas faisable avec multicol ça.

pg a écrit:Dans ce cas, enlever le \columnbreak ou en rajouter un à la fin de la deuxième colonne devrait toujours fonctionner pour régler le problème, non ?


Oui, sachant qu'on ne peut pas mettre des minipages dans un multicol. Il y a quand même pas mal d'avantages à utiliser la structure tabular.
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6885
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: [eqnarray] Supprimer tout espace vertical (avant et aprè

Messagepar pg » Mercredi 09 Février 2011, 22:08

MB a écrit:je rencontre à nouveau un problème lorsque je souhaite intégrer ceci dans une minipage, puis dans un tabular (à priori c'est le tabular qui pose problème).
[...]
L'erreur produite est la suivante : "Argument of \nodisplayskipalign* has an extra }."


En fait, on peut s'en sortir avec la même astuce que pour {minialign}:

Code: Tout sélectionner
\documentclass[a4paper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[frenchb]{babel}
\usepackage{mathtools}
%
\newcommand{\nodisplayskip}{\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}}
\makeatletter
\newenvironment{nodisplayskipalign*}{\nodisplayskip\iffalse{\fi\ifnum0=`}\fi\start@align\@ne\st@rredtrue\m@ne}{\endalign\ifnum0=`{\fi\iffalse}\fi}
\makeatother
\newcommand{\test}[2]{\begin{minipage}[t]{#1\linewidth} \begin{nodisplayskipalign*} #2 \end{nodisplayskipalign*} \end{minipage}}
%
\setlength{\parindent}{0mm}
\begin{document}

\begin{center}
\begin{tabular}{c|c}
\test{0.45}{
3 \div 0,25 & = 3 \times 0,25^{-1} \\
& = 3 \times 4 \\
& = \mathbf{12}} &
\test{0.45}{
3 \div 0,25 & = 3 \times 0,25^{-1} \\
& = 3 \times 4 \\
& = \mathbf{12}} \\
\end{tabular}
\end{center}

\end{document}
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: [eqnarray] Supprimer tout espace vertical (avant et aprè

Messagepar Deviling » Dimanche 13 Février 2011, 03:27

Bonsoir, j'aurais voulu savoir, dans le code :
Code: Tout sélectionner
\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}


La troisième ligne contrôle la hauteur avant et la quatrième la hauteur après, mais que font les deux autres.
J'ai beau modifier les valeurs rien ne bouge.

De plus, votre petit discours sur align* m'a fait réfléchir. \[ ou equation* permettent d'écrire des mathématiques sur une seule ligne.
Ont-ils encore un intérêt alors que align* le permet, en plus de proposer une alignement de plusieurs lignes d'équations ?
(Et donc, ne serait-il pas utile d'effectuer un \renewcommand{\[}{\begin{align*}})

Merci.
Deviling
Hecto-utilisateur
 
Messages: 63
Inscription: Dimanche 23 Janvier 2011, 20:40
Statut actuel: Post-bac | Ecole d'ingénieur

Re: [eqnarray] Supprimer tout espace vertical (avant et aprè

Messagepar pg » Dimanche 13 Février 2011, 23:12

Les displayshortskip ne fonctionnent qu'avec \[...\] et {equation} et uniquement lorsque la ligne d'avant n'est pas trop longue (sinon, c'est les displayskip normaux qui sont utilisés). Voici un petit exemple qui illustre ceci :

Code: Tout sélectionner
\documentclass{article}

\begin{document}

Bla bla
\[A=B\]
bla bla bla
\setlength{\abovedisplayshortskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}
\[A=B\]
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
\[A=B\]
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}
\[A=B\]
bla bla.

\end{document}


Concernant {align*}, oui on peut redéfinir \[...\] et {equation*} comme des raccourcis de {align*} (ou de {gather*}), c'est d'ailleurs ce que recommande la documentation de hyperref. Mais du coup, on perd la possibilité d'utiliser les displayshortskip vu que {align} et {gather} ne les supportent pas (et cela peut être considéré comme un bug de amsmath).

Pour la redéfinition de \[...\], il vaut mieux, au lieu de \renewcommand, utiliser \DeclareRobustCommand, c'est plus prudent (et c'est d'ailleurs ce que fait amsmath qui redéfinit \[...\] comme étant {equation*}):

Code: Tout sélectionner
\DeclareRobustCommand{\[}{\begin{gather*}}
\DeclareRobustCommand{\]}{\end{gather*}}


Edit : en fait, ceci ne peut pas fonctionner, voir ci-dessous pour une solution correcte.
Dernière édition par pg le Mardi 22 Février 2011, 10:36, édité 1 fois.
Raison: mise à jour du message
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Suivante

Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Ahrefs [Bot], Google [Bot], Grapeshot [Crawler] et 21 invités