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

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux utilisateurs inscrits]
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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

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

Message non lu par pg »

Ça a pourtant l'air de fonctionner si on compare à une formule toute seule sur une ligne.
eqnarray.png
eqnarray.png (5.76 Kio) Consulté 6035 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}
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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)
Pièces jointes
eqnarray_space.png
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
EricK
Utilisateur chevronné
Utilisateur chevronné
Messages : 1481
Inscription : jeudi 02 novembre 2006, 22:38
Contact :

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

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

Message non lu 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 général
Modérateur général
Messages : 10450
Inscription : samedi 18 novembre 2006, 19:50

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

Message non lu par kojak »

bonjour,

Il me semblait que cet environnement eqnarray était désuet, non.
Pas d'aide par MP.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

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

Message non lu par pg »

Un bon document qui liste tout ce qui ne va pas avec eqnarray est Avoid eqnarray!.
kojak
Modérateur général
Modérateur général
Messages : 10450
Inscription : samedi 18 novembre 2006, 19:50

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

Message non lu 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
Contact :

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

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

Message non lu 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

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

Message non lu 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 spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

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

Message non lu 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
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message