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

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
MB
Administrateur
Administrateur
Messages : 7138
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

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

Message par MB »

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 MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

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

Message par pg »

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

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}
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

MB
Administrateur
Administrateur
Messages : 7138
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

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

Message par MB »

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 :

[attachment=0]eqnarray_space.png[/attachment]


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)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

EricK
Utilisateur chevronné
Utilisateur chevronné
Messages : 1481
Inscription : jeudi 02 novembre 2006, 22:38

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

Message par EricK »

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).

MB
Administrateur
Administrateur
Messages : 7138
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

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

Message par MB »

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 MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

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

Message par pg »

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}

kojak
Modérateur global
Modérateur global
Messages : 10380
Inscription : samedi 18 novembre 2006, 19:50

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

Message par kojak »

bonjour,

Il me semblait que cet environnement eqnarray était désuet, non.
Pas d'aide par MP.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

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

Message par pg »

Un bon document qui liste tout ce qui ne va pas avec eqnarray est Avoid eqnarray!.

kojak
Modérateur global
Modérateur global
Messages : 10380
Inscription : samedi 18 novembre 2006, 19:50

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

Message par kojak »

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.

EricK
Utilisateur chevronné
Utilisateur chevronné
Messages : 1481
Inscription : jeudi 02 novembre 2006, 22:38

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

Message par EricK »

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.

MB
Administrateur
Administrateur
Messages : 7138
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

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

Message par MB »

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 MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

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

Message par pg »

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

MB
Administrateur
Administrateur
Messages : 7138
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

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

Message par MB »

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 MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

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

Message par pg »

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}

MB
Administrateur
Administrateur
Messages : 7138
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

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

Message par MB »

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 MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

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

Message par pg »

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 ?

MB
Administrateur
Administrateur
Messages : 7138
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

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

Message par MB »

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 MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

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

Message par pg »

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}

Deviling
Utilisateur confirmé
Utilisateur confirmé
Messages : 63
Inscription : dimanche 23 janvier 2011, 20:40

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

Message par Deviling »

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.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

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

Message par pg »

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 modification par pg le mardi 22 février 2011, 10:36, modifié 1 fois.
Raison : mise à jour du message